ffmpeg源码分析-process_inputs - 弦外之音

/ 0评 / 0

本系列 以 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 条件,让某种场景的命令一条直线跑下去,代码可读性会更强,这是个人观点。

下图直接贴上代码,红色框是需要重点关注的,绿色框就是在当前命令下不会执行,或者执行了跟没执行一样。

如上图所示,有几个地方需要讲解。

  1. EOF 处理,这个比较重要,但是本文章主要分析转码中间的过程,不是转码完成之后的处理。此处不分析EOF。
  2. pts_wrap_bits < 64 ,主要是处理一些 ts 流的,本文的mp4 文件转码不会跑进去。
  3. 在本文的命令下,ts_offset 是0,所以 += ts_offset 执行跟没执行一样。同样的还有 duration 参数也是0。
  4. 最后一个红框的 delta 可以重点关注一下,ist->next_dts 是由上一个pktdts + 视频帧率等参数算出来的。这里主要检测 pkt 的 pts dts 有没问题。
  5. 调用 process_input_packet()

由此可见,process_input() 做的事情其实比较少,主要是检测读取出来的 packet 的各种参数有无问题,然后更新 InputStream istInputFile ifile 的一些参数。最后调用 process_input_packet();


©版权所属:知识星球:弦外之音,QQ:2338195090。

由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注