最近在看短视频编辑功能,下面介绍遇到的一个坑:
视频编码后,audio 和 video 帧都有丢失;
audio 帧丢失会影响duration 的准确性,这个逻辑是我们的自己内部数据缓冲队列处理的问题,本质就是怎么判断编码最后一个数据包结束,我们的“错误处理逻辑 是 视频最后一个包结束了,整体过程结束了,导致音频的数据包丢失了”
video 帧的丢失,先看下图,我将时间戳全部打印了出来,解码出来的
可以根据“A0 ” 分析出来,解码的数据包为304个数据包,“A1 - A2” 分析 编码送进去的数据包一共送进去的数据包是 304帧,但是有 22 个数据包是没有编码成功的,也就是我的视频数据丢失了 22 个数据包;
通过阅读 ffmpeg 下的examples transcoding.c 代码,发现在编码最后,会有flush_encoder 的操作,也就是循环 写入空的数据帧,一只到失败为止, 将缓存在libx264 的里面的数据flush 出来。
使用方法如下:
再看下结果,分析如下
通过分析可以看到 最后 一共是 326 - 22 = 304 个包,这样所有的数据包已经找回。
总结: ffmpeg 内部或libx264 (没有详细研究) 会编码缓存数据包,通过写入空数据包的方式可以将缓存的数据包推出来。