热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FFmpeg学习1

数据的读取一个多媒体文件包含有多个流(视频流videostream,音频流audiostream,字幕等),流是一种抽象的概念,表示一连串的数据元素.流中的数据元素称为帧fram

数据的读取

一个多媒体文件包含有多个流(视频流video stream,音频流 audio stream,字幕等),流是一种抽象的概念,表示一连串的数据元素.流中的数据元素称为帧frame,也就是说多媒体文件中,主要有两种数据:流stream及其数据元素帧frame,在FFmpeg自然有与这两种数据相对应的抽象AVStream和AVPacket.

使用FFmpeg的解码,数据的传递过程可归纳如下:

1.调用avformat_open_input,打开流,将信息填充到AVFormatContext *ic中

bool XFFmpeg::Open(const char *url)
{printf("XFFmpeg::Open %s\n",url);//打开视频解封装,打开流,将信息填充到AVFormatContext *ic中int re=avformat_open_input(&ic,url,0,0);

2.调用av_read_frame,从流中读取数据帧到AVPacket *pkt,pkt保存的仍然是未解码的数据

re=av_read_frame(ic,pkt);

3.调用..待补充

结构体的存储空间的分配与释放

FFmpeg并没有垃圾回收机制,所分配的空间都需要自己维护.而由于视频处理过程中数据量是非常大,对于动态内存的使用更要谨慎.本小节主要介绍解码过程使用到的结构体存储空间的分配与释放.

AVFormatContext 在FFmpeg中有很重要的作用,描述一个多媒体文件的构成及其基本信息,存放了视频解码过程中的大部分唏嘘你.通常该结构体由avformat_open_input分配存储空间,在最后调用avformat_input_close关闭.

AVPacket 用来存放解码之前的数据,它只是一个容器,其data成员指向实际的数据缓冲区,在解码的过程中可由av_read_frame创建和填充AVPacket中的数据缓冲区,当数据缓冲区不再使用的时候可以调用 av_packet_free释放这块缓冲区.

bool XFFmpeg::Read()
{...if(!pkt)//第一次读取,分配对象空间{pkt=av_packet_alloc();}//从流ic中读取一帧数据到 AVPacket *pkt,pkt保存的仍然是未解码的数据re=av_read_frame(ic,pkt);...
}void XFFmpeg::Close()//清理函数
{...if(pkt){av_packet_free(&pkt);}...
}

AVFrame 存放从AVPacket解码出来的原始数据,其必须通过av_frame_alloc来创建,通过av_frame_free来释放,和AVPacket类似,AVFrame中也有一块数据缓存空间,在调用av_frame_alloc的时候并不会为这块缓存区域分配空间,需要使用其他的方法,再解码的过程中使用了两个AVFrame,

bool XFFmpeg::Decode(int outwidth, int outheight)
{...if(!frame)frame=av_frame_alloc();//调用函数动态分配内存...
}void XFFmpeg::Close()//清理函数
{if (frame){av_frame_free(&frame);}
}

sws_scale()函数分析

FFmpeg中的sws_scale()函数主要是用来做视频像素格式和分辨率的转换,其优势在于:可以在同一个函数里实现:1.图像色彩空间转换,2:分辨率缩放,3:前后图像滤波处理,不足之处在于:效率相对较低,不如libyuv或shader,函数定义为

int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],const int srcStride[], int srcSliceY, int srcSliceH,uint8_t *const dst[], const int dstStride[]);

参数说明

1. SwsContext *c,转换格式的上下文,也就是sws_getCachedContext()函数的返回结果.

2.参数


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 标题: ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
小荷蛋蛋图_945
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有