目标
通过前面对源码的分析,写出了源码分析501,502,503三遍文章,算是初步了解了ffmpeg源码的运行流程,可以是我们在网上查找资料发现,网上提供的编解码流程很是清晰明了,似乎是提取提炼过得,所以我们接下来比对网上提供的编解码流程,来查看源码,在源码中找到提炼的痕迹。
已总结好的编解码流程
- avformat_open_input 打开媒体文件
- avformat_find_stream_info 初始化AVFormatContext_
- 匹配到视频流的index
- avcodec_find_decoder 根据视频流信息的codec_id找到对应的解码器_
- avcodec_open2 使用给定的AVCodec初始化AVCodecContext_
- 初始化输出文件、解码AVPacket和AVFrame结构体
- av_read_frame 开始一帧一帧读取
- avcodec_send_packet
- avcodec_receive_frame
- 格式转换 、分别写入YUV文件
- Opengl渲染(本篇不涉及,放到后面单独篇学习实践)
- 释放资源
源码分析提取流程
查看ffmpeg.c中的main,avformat_open_input
出现在ret = ffmpeg_parse_options(argc, argv);
-> ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
-> static int open_input_file(OptionsContext *o, const char *filename)
函数的1177行
avformat_find_stream_info
出现在static int open_input_file(OptionsContext *o, const char *filename)
函数的1199行
匹配到视频流的index
和avcodec_find_decoder
两个步骤合并在一起,遍历了每一种码流和解码器,出现在static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
函数的779行
avcodec_open2
在前面的步骤已经做过了,在static int process_input(int file_index)
函数4367行直接取值使用
7,步骤在static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eof)
函数中出现
8,9步骤在static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
含住中出现
格式转换是在获取到解码帧之后
opengl渲染是属于拓展内容
最后释放资源那就不用说了
总结
从源码中一步一步分析,确实也还能够看到这个流程的影子,但是排查起来也是颇为费劲。
另一种方法是直接查看ffmpeg提供的示例程序,从示例中提取查看流程应该更加方便。