ffmpeg 可以报告 MPEG 中的间隙吗?

ffmpeg 可以报告 MPEG 中的间隙吗?

我有一些 MPEG 文件,其中经常有漏洞。显然,这会使视频几乎无法观看,但ffplay尝试后会报告大量错误。

但是,它没有说明可播放块的确切信息,也没有说明它们之间的间隙。能否以某种方式提取这些信息?

答案1

如果 MPEG 指的是 MPEG-2 传输流,则它们的数据包大小固定为 188 字节。每个数据包都以同步字节开始那是0x47

通过解析比特流并查找这些字节的位置,您可以了解哪些数据包已被截断(即它们的长度<188字节)。

当然,如果一次丢失了多个 188 字节,或者丢失了同步字节,这种方法就行不通了。在这种情况下,您必须另外查看您找到的每个数据包头中的连续性计数器。有关该格式的更多信息,请参见这里

但当然,这只是 MPEG-TS 层。视频片段或帧可能跨越多个数据包,因此当帧的单个数据包丢失时,您必须假设该帧无法完美解码(可能存在恢复的机会)。此外,这取决于帧的类型:丢失的 I 帧会比丢失的 P 帧或 B 帧造成更大的损害(从而使流无法播放)。这意味着您必须更深入地解析比特流。

如果您确实需要获得有关丢失内容的详细信息,最好的方法可能是调试/修改 FFmpeg TS 解复用器和 H.264 解码器(假设是 H.264 视频)以检查其失败的位置,并在尝试解码时打印出一些帧编号/类型。

相关内容