这几天一直在写使用ffmpeg完成一个视频播放器的demo,因为对音频这一块比较熟悉,所以先从音频解码开始下手,也熟悉一下ffmpeg的使用流程。音频解码这块已经完成了,所以这里先简单总结一下整个音频解码的流程。这里只说大概流程,具体实现细节参考下面的demo就可以。
1.注册ffmpeg
|
|
2.初始化AVFormatContext
|
|
3.可以注册一个打断回调
|
|
其中 interrupt_callback 是一个函数指针
|
|
即使返回一个是否被打断的状态。
4.打开流地址
|
|
返回一个是否打开成功的状态。0表示成功
5.设置解析参数probesize & max_analyze_duration
|
|
6.获取音视频信息
|
|
获取的信息都在formatCtx这个参数里存着,后面很多地方要用。
7.获取流数据的索引数组
通过流的类型获取流的索引,有时候可能音频或者视频都有好几路流数据
|
|
8.通过流的索引,获取每一路流的AVCodecContext & AVCodec
|
|
9.打开解码器
|
|
10.如果不支持当前流的采样格式,需要做一下重新采样
|
|
11.初始化一个AVFrame
|
|
12.获取AVPacket
|
|
13.获取AVFrame
|
|
14.将AVFrame转为自定义的LLYAudioFrame
|
|
这里判断一下如果是重采样的,需要做一个转换。
视频解码(补充)
视频解码的工作也做完了,流程和音频大同小异,只是在最后几步的时候会有差异
获取AVFrame
|
|
这里使用video的解码api.
将AVFrame转为自定义的LLYVideoFrame
|
|
这里转为自定义的LLYVideoFrame时需要将YUV的数据都取出来。
主要流程大概就是上面这些了。当然还有一些细节的东西,这里没有一一列出来,可以从demo中寻找答案。