Mpegts 数据包使用 ffmpeg concat 协议损坏



我正在尝试使用 ffmpeg 中的concat protocol,如 ffmpeg 文档中所述: https://trac.ffmpeg.org/wiki/Concatenate

但是,在运行concat时,我收到了很多有关损坏数据包的错误,因此我担心这不是最佳方法。我的实际用例将涉及在不受监督的情况下运行大量不同的源视频,所以我想确保它是可靠的。

concat demuxer方法成功无误,但需要大约 10 倍的时间。

重现步骤

下载大巴克兔子:

wget https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4

转码 30 秒区块:

ffmpeg -i bbb_sunflower_1080p_30fps_normal.mp4 -ss '00:06:30' -t 30 -c:v libx264 -crf 18 bbb30.mp4

创建第二个零件:

mkdir -p parts;
for i in $(seq -f "%02g" 0 29); do 
ffmpeg 
-i bbb30.mp4 
-ss "00:00:$i" -t 1 
-c:v libx264 -pix_fmt yuv420p -crf 18 
-bsf:v h264_mp4toannexb 
-f mpegts 
-y parts/$i.ts;
done

将所有部分组合成一个新的输出mp4:

ffmpeg -y 
-i "concat:parts/00.ts|parts/01.ts|parts/02.ts|parts/03.ts|parts/04.ts|parts/05.ts|parts/06.ts|parts/07.ts|parts/08.ts|parts/09.ts|parts/10.ts|parts/11.ts|parts/12.ts|parts/13.ts|parts/14.ts|parts/15.ts|parts/16.ts|parts/17.ts|parts/18.ts|parts/19.ts|parts/20.ts|parts/21.ts|parts/22.ts|parts/23.ts|parts/24.ts|parts/25.ts|parts/26.ts|parts/27.ts|parts/28.ts|parts/29.ts" 
-c copy 
output.mp4

Stderr有很多关于损坏数据包的警告(在这种情况下,总是在dts = 21300):

[mpegts @ 0x555d172daa00] Packet corrupt (stream = 0, dts = 213000).
concat:parts/00.ts|parts/01.ts|parts/02.ts|parts/03.ts|parts/04.ts|parts/05.ts|parts/06.ts|parts/07.ts|parts/08.ts|parts/09.ts|parts/10.ts|parts/11.ts|parts/12.ts|parts/13.ts|parts/14.ts|parts/15.ts|parts/16.ts|parts/17.ts|parts/18.ts|parts/19.ts|parts/20.ts|parts/21.ts|parts/22.ts|parts/23.ts|parts/24.ts|parts/25.ts|parts/26.ts|parts/27.ts|parts/28.ts|parts/29.ts: corrupt input packet in stream 0

由此产生的 mp4 在我看来看起来还可以,但显然 ffmpeg 对某些事情并不满意。有什么想法吗?

您可以忽略这些警告。

MPEG-TS容器中的数据包有一个计数器字段,该字段随每个数据包递增。预计这些将是连续的。由于您在单独的实例中对 TS 文件进行了编码,因此从一个 TS 输入切换到另一个 TS 输入时,该计数器将以 0 开头。但这在这个用例中没有显著性。concat 协议会发生这种情况,因为单个 TS 解复用器实例用于将所有输入作为一个合并的整体读取。concat 解复用器为每个输入打开一个新的 TS 解复用器,然后将所有数据包拼接为单个流。

最新更新