我有两个文件:fileSequence0.ts和fileSequence1.ts,我用ffmpeg检查每个文件的帧数,结果是:
- fileSequence0.ts,29帧
- fileSequence1.ts,28帧
然后我将两个文件合并为一个:
ffmpeg -i 'concat:fileSequence0.ts|fileSequence1.ts' -codec copy merge.mp4
现在,merge.mp4有58帧,而不是57=29+28,这是怎么回事,有人能指出我缺少什么知识吗?
这里提到的文件可以下载到:https://github.com/ideawu/missing-frame-between-ts
第二个文件fileSequence1.ts
也有29帧,而不是28。
由于它最初的分段方式,如果你单独播放它,你将无法获得一帧,因为它缺少所需的SPS/PPS数据:
[h264 @ 0x4111460] non-existing PPS 0 referenced
Last message repeated 1 times
[h264 @ 0x4111460] decode_slice_header error
[h264 @ 0x4111460] non-existing PPS 0 referenced
[h264 @ 0x4111460] decode_slice_header error
[h264 @ 0x4111460] no frame!
由于SPS/PPS存在于第一个文件中,并且当您插入它时,它将首先读取fileSequence0.ts
,因此它将能够解码丢失的帧,因此结果是正确的值58。
你可以通过反转concat:的顺序很容易地看到这一点
ffmpeg -i 'concat:fileSequence1.ts|fileSequence0.ts' -codec copy merge.mp4
此命令导致57帧帧,因为它无法解码第一帧。