目标

通过前面对源码的分析,写出了源码分析501,502,503三遍文章,算是初步了解了ffmpeg源码的运行流程,可以是我们在网上查找资料发现,网上提供的编解码流程很是清晰明了,似乎是提取提炼过得,所以我们接下来比对网上提供的编解码流程,来查看源码,在源码中找到提炼的痕迹。

已总结好的编解码流程

  1. avformat_open_input 打开媒体文件
  2. avformat_find_stream_info 初始化AVFormatContext_
  3. 匹配到视频流的index
  4. avcodec_find_decoder 根据视频流信息的codec_id找到对应的解码器_
  5. avcodec_open2 使用给定的AVCodec初始化AVCodecContext_
  6. 初始化输出文件、解码AVPacket和AVFrame结构体
  7. av_read_frame 开始一帧一帧读取
  8. avcodec_send_packet
  9. avcodec_receive_frame
  10. 格式转换 、分别写入YUV文件
  11. Opengl渲染(本篇不涉及,放到后面单独篇学习实践)
  12. 释放资源


源码分析提取流程

查看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行

匹配到视频流的indexavcodec_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提供的示例程序,从示例中提取查看流程应该更加方便。