iOS FFmpeg入门学习01

5 篇文章 0 订阅
2 篇文章 0 订阅

FFmpeg包括8部分
libavcodec (编解码库)
libavfilter (基于图的帧编辑库)
libavformat (I/O和复用解复用库)
libavdevice (关于设备的复用解复用库)
libavutil (公用的工具库)
libswresample (音频重采样格式转换和混合)
libpostproc (后处理库)
libswscale (颜色转换缩放库)

这里先说libavformat库
Libavformat 用于处理各种媒体容器格式,它的主要的两个目的就是复用(将媒体文件分割到不同的流里)和解复用(将数据写入容器格式里)。它也有I/O模块支持很多的协议用来访问数据(比如file,tcp,http等),在使用这个库之前需要调用av_register_all()注册所有的编码复用器、解复用器和协议。除非你确定你不想用libavformat的网络功能,不然需要调用avformat_network_init()。协议层不是公共API的一部分因此你仅能用avio_enum_protocols()函数来获取所有被支持的协议。

AVInputFormat结构体用来描述输入格式,AVOutputFormat用来描述输出格式。你可以遍历所有被注册的input/output格式使用av_iformat_next() / av_oformat_next()函数。
libavformat库主要用于复用和解复用的结构体是AVFormatContext,用来导出被读写文件的所有信息。与大多数libavformat结构体一样,它的size不是public ABI的一部分,因此它不能被创建在栈上或者直接用av_malloc。用avformat_alloc_context()函数可以创建AVFormatContext(avformat_open_input已经为你做了这个)。

AVFormatContext包含了一些重要的内容包括:
input或output format。它可以被自动检测或者由用户设置input;output总是被用户设置。
一个AVStreams的数组,描述了存储在文件里的所有的基本流。AVStreams是用数组的下标来引用。
一个I/O context。也是被libavformat打开或者被用户为input设置,ouput总是被用户设置(除非你在处理一个AVFMT_NOFILE 格式)。

解复用
解复用读媒体文件并放入数据块中(packets)
一个packets包含一个或者多个编码帧属于单个基本流。在libavformat API中这个过程相当于avformat_open_input()函数打开一个文件,av_read_frame()读取一个packet最后avformat_close_input()来清理。
打开文件
AVFormatContext *formatContext;
NSString *path = [[NSBundle mainBundle] pathForResource:@”video” ofType:@”mp4”];
av_register_all();
avformat_open_input(&formatContext, [path UTF8String], NULL, NULL);
以上代码会创建一个AVFormatContext结构体读取header信息存储在formatContext中。一些格式没有header或者没有存储足够的信息在里面,因此建议调用avformat_find_stream_info()试着读和解码一些帧来找寻丢失的信息。
打开文件后开始从AVFormatContext读数据,通过不停的调用av_read_frame(),每次调用都会返回一个AVPacket包含着一个AVStream的编码数据,经AVPacket.stream_index。如果调用着希望解码这个数据,这个packet可能直接被传入libavcodec库的解码函数avcodec_send_packet()或者avcodec_decode_subtitle2()。
如果流里提供AVPacket.pts,AVPacket.dts,AVPacket.duration这些信息也将被设置。时间信息在AVStream.time_base单元,它乘以timebase将它们转换到秒。
如果AVPacket.buf是在返回的数据包,则包是动态分配的,用户可以保持下去。否则,如果AVPacket.buf是NULL,packet数据被存储在解复用器里,packet直到下一次调用av_read_frame()函数或者关闭文件失效。如果调用者要求长时间持有,av_dup_packet()将调用av_malloc()将它拷贝进去,着种情况下必须调用av_packet_unref()释放不在持有。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值