ffmpeg 编码丢帧

最近在看短视频编辑功能,下面介绍遇到的一个坑:

视频编码后,audio 和 video 帧都有丢失;

audio 帧丢失会影响duration 的准确性,这个逻辑是我们的自己内部数据缓冲队列处理的问题,本质就是怎么判断编码最后一个数据包结束,我们的“错误处理逻辑 是 视频最后一个包结束了,整体过程结束了,导致音频的数据包丢失了” 

video 帧的丢失,先看下图,我将时间戳全部打印了出来,解码出来的

ffmpeg 编码丢帧_第1张图片
解码送入和输出时间戳 A0


ffmpeg 编码丢帧_第2张图片
编码送入和输出时间戳前半部分 A1
ffmpeg 编码丢帧_第3张图片
编码送入和输出时间戳结尾 A2

可以根据“A0 ” 分析出来,解码的数据包为304个数据包,“A1 - A2” 分析 编码送进去的数据包一共送进去的数据包是 304帧,但是有 22 个数据包是没有编码成功的,也就是我的视频数据丢失了 22 个数据包;

通过阅读 ffmpeg 下的examples  transcoding.c 代码,发现在编码最后,会有flush_encoder 的操作,也就是循环 写入空的数据帧,一只到失败为止, 将缓存在libx264 的里面的数据flush 出来。

使用方法如下:


ffmpeg 编码丢帧_第4张图片
flush encoder 调用方法 A3 

再看下结果,分析如下


ffmpeg 编码丢帧_第5张图片
写入空帧后 最后编码出来的数据包

通过分析可以看到 最后 一共是 326 - 22 =  304 个包,这样所有的数据包已经找回。

总结: ffmpeg 内部或libx264  (没有详细研究) 会编码缓存数据包,通过写入空数据包的方式可以将缓存的数据包推出来。

你可能感兴趣的:(ffmpeg 编码丢帧)