本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8
ffmpeg 源码分析系列以一条简单的命令开始,ffmpeg -i a.mp4 b.flv
,分析其内部逻辑。
a.mp4下载链接:百度网盘,提取码:nl0s 。
本文主要分析 process_inputs()
的内部逻辑,流程图如下

process_input() 里面有一部分逻辑是处理EOF,处理转码结束逻辑的。转码结束逻辑实际是比较复杂的,涉及到好几个字段状态的转换。所以本文不会讲EOF的处理。EOF的处理会另开一篇文件讲解。
process_input() 里面把多种场景命令的处理混在一起,看起来比较复杂,实际上debug一下。在ffmpeg -i a.mp4 b.flv
命令下,有些代码执行了跟没执行一样。实际上 process_input()
的一些语句如果加上 if
条件,让某种场景的命令一条直线跑下去,代码可读性会更强,这是个人观点。
下图直接贴上代码,红色框是需要重点关注的,绿色框就是在当前命令下不会执行,或者执行了跟没执行一样。

如上图所示,有几个地方需要讲解。
- EOF 处理,这个比较重要,但是本文章主要分析转码中间的过程,不是转码完成之后的处理。此处不分析EOF。
- pts_wrap_bits < 64 ,主要是处理一些 ts 流的,本文的mp4 文件转码不会跑进去。
- 在本文的命令下,
ts_offset
是0,所以 +=ts_offset
执行跟没执行一样。同样的还有duration
参数也是0。 - 最后一个红框的 delta 可以重点关注一下,
ist->next_dts
是由上一个pkt
的dts
+ 视频帧率等参数算出来的。这里主要检测pkt
的 pts dts 有没问题。 - 调用
process_input_packet()
由此可见,process_input() 做的事情其实比较少,主要是检测读取出来的 packet 的各种参数有无问题,然后更新 InputStream ist
, InputFile ifile
的一些参数。最后调用 process_input_packet()
;
©版权所属:知识星球:弦外之音,QQ:2338195090。
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。