FFMPEG AVPacket
2015-10-26 12:57
253 查看
原文:http://blog.csdn.net/wangshilin/article/details/8186608
FFMPEG使用AVPacket来暂存解复用之后、解码之前的媒体数据(一个音/视频帧、一个字幕包等)及附加信息(解码时间戳、显示时间戳、时长等)。其中:
dts表示解码时间戳,pts表示显示时间戳,它们的单位是所属媒体流的时间基准。
stream_index给出所属媒体流的索引;
data为数据缓冲区指针,size为长度;
duration为数据的时长,也是以所属媒体流的时间基准为单位;
pos表示该数据在媒体流中的字节偏移量;
destruct为用于释放数据缓冲区的函数指针;
flags为标志域,其中,最低为置1表示该数据是一个关键帧。
AVPacket结构本身只是个容器,它使用data成员引用实际的数据缓冲区。这个缓冲区通常是由av_new_packet创建的,但也可能由 FFMPEG的API创建(如av_read_frame)。当某个AVPacket结构的数据缓冲区不再被使用时,要需要通过调用 av_free_packet释放。av_free_packet调用的是结构体本身的destruct函数,它的值有两种情 况:1)av_destruct_packet_nofree或0;2)av_destruct_packet,其中,情况1)仅仅是将data和
size的值清0而已,情况2)才会真正地释放缓冲区。
FFMPEG内部使用AVPacket结构建立缓冲区装载数据,同时提供destruct函数,如果FFMPEG打算自己维护缓冲区,则将 destruct设为av_destruct_packet_nofree,用户调用av_free_packet清理缓冲区时并不能够将其释放;如果 FFMPEG打算将该缓冲区彻底交给调用者,则将destruct设为av_destruct_packet,表示它能够被释放。安全起见,如果用户希望 自由地使用一个FFMPEG内部创建的AVPacket结构,最好调用av_dup_packet进行缓冲区的克隆,将其转化为缓冲区能够被释放的
AVPacket,以免对缓冲区的不当占用造成异常错误。av_dup_packet会为destruct指针为 av_destruct_packet_nofree的AVPacket新建一个缓冲区,然后将原缓冲区的数据拷贝至新缓冲区,置data的值为新缓冲区 的地址,同时设destruct指针为av_destruct_packet。
FFMPEG使用AVPacket来暂存解复用之后、解码之前的媒体数据(一个音/视频帧、一个字幕包等)及附加信息(解码时间戳、显示时间戳、时长等)。其中:
dts表示解码时间戳,pts表示显示时间戳,它们的单位是所属媒体流的时间基准。
stream_index给出所属媒体流的索引;
data为数据缓冲区指针,size为长度;
duration为数据的时长,也是以所属媒体流的时间基准为单位;
pos表示该数据在媒体流中的字节偏移量;
destruct为用于释放数据缓冲区的函数指针;
flags为标志域,其中,最低为置1表示该数据是一个关键帧。
AVPacket结构本身只是个容器,它使用data成员引用实际的数据缓冲区。这个缓冲区通常是由av_new_packet创建的,但也可能由 FFMPEG的API创建(如av_read_frame)。当某个AVPacket结构的数据缓冲区不再被使用时,要需要通过调用 av_free_packet释放。av_free_packet调用的是结构体本身的destruct函数,它的值有两种情 况:1)av_destruct_packet_nofree或0;2)av_destruct_packet,其中,情况1)仅仅是将data和
size的值清0而已,情况2)才会真正地释放缓冲区。
FFMPEG内部使用AVPacket结构建立缓冲区装载数据,同时提供destruct函数,如果FFMPEG打算自己维护缓冲区,则将 destruct设为av_destruct_packet_nofree,用户调用av_free_packet清理缓冲区时并不能够将其释放;如果 FFMPEG打算将该缓冲区彻底交给调用者,则将destruct设为av_destruct_packet,表示它能够被释放。安全起见,如果用户希望 自由地使用一个FFMPEG内部创建的AVPacket结构,最好调用av_dup_packet进行缓冲区的克隆,将其转化为缓冲区能够被释放的
AVPacket,以免对缓冲区的不当占用造成异常错误。av_dup_packet会为destruct指针为 av_destruct_packet_nofree的AVPacket新建一个缓冲区,然后将原缓冲区的数据拷贝至新缓冲区,置data的值为新缓冲区 的地址,同时设destruct指针为av_destruct_packet。
相关文章推荐
- eclipse在线安装SVN
- LVM逻辑卷管理命令
- 更改CPU厂商信息
- 存储过程和触发器优缺点分析
- <fmt>标签
- 写一个js的伪HashMap,不包含hash算法,能用就行(转载)
- 关于MVC设计模式
- codeforces-550B-Preparing Olympiad
- libpomelo 增加编译静态库cocos2d-x xcode 工程
- params is error 微信朋友圈分享网页内的外链打不开
- php 和 java RSA 对称加密互通的问题
- PaodingAnalysis 提示 "dic home should not be a file, but a directory"
- 挂起起线程与终止线程的区别
- mysql中如何统计某字段里某个字符的个数
- 区分PATCH与PUT、POST方法
- android源码编译出错(5)
- Codeforces Round #326 (Div. 2)
- DOM - nodeType 的取值
- 2015年浪潮面试题
- 编程之法:面试和算法