我试图在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.mp4Stderr对损坏的数据包有很多警告(在本例中,总是在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对某些事情并不满意。有什么想法吗?
发布于 2022-11-01 03:47:10
你可以忽略这些警告。
MPEG-TS容器中的数据包具有一个计数器字段,该字段与每个数据包一起递增。预计这些活动将持续进行。由于您将TS文件编码在单独的实例中,因此当从一个TS输入切换到另一个TS输入时,该计数器将以0开始。但是这在这个用例中没有显著的意义。这发生在concat协议中,因为使用单个TS demuxer实例将所有输入读入为一个合并的整体。该为每个输入打开一个新的TS查询器,然后将所有数据包拼接为一个单一流。
https://stackoverflow.com/questions/74268824
复制相似问题