FFmpeg拼接后输出文件损坏。

3

编辑/更新:目前的解决方案是对所有文件运行该代码:ffmpeg -i up.mp4 -vf scale=1920:1080 -crf 22 reUP.mp4,以使分辨率和帧速率匹配。

输入图像描述

以前我可以打开CMD,键入 CD C:\Users\...,然后 ffmpeg -f concat -safe 0 -i xmylist.txt -crf 22 -c copy x1.mp4

xmylist

这些录制来自同一部手机,有些是前置摄像头拍摄的,有些是后置摄像头拍摄的。我知道这可能会导致不完全相同的问题?但是它之前一直正常工作。

现在输出文件被损坏了,并且出现了以下日志:输入图像描述 单独的视频文件播放得很好,大多数拼接的输出也是如此,但有些部分会变成这样并冻结:输入图像描述


它以前可以很好地组合前面和后面:/ 我尝试更新但无济于事。@llogan - Manumit
@llogan 这些单独的文件在VLC和Potplayer上播放得很好,但是当它们被串联起来时,这两个媒体播放器都无法播放它们。 - Manumit
1个回答

1
您正在将两个分辨率不同的视频文件连接在一起。
  • front.mp4 的分辨率为1920x1080
  • rear.mp4 的分辨率为1280x720
重现问题并不太困难(您可以将代码放入一个.bat文件中):
rem Create tmplist.txt
echo file 'front.mp4' > tmplist.txt
echo file 'rear.mp4' >> tmplist.txt

rem Create video with resolution 192x108 for example (instead of 1920x1080)
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=25 -f lavfi -i sine=frequency=300 -acodec aac -ar 22050 -vcodec libx265 -crf 17 -pix_fmt yuv420p -t 3 front.mp4

rem Create video with resolution 128x72 for example (instead of 1280x720)
ffmpeg -y -f lavfi -i testsrc=size=128x72:rate=25 -f lavfi -i sine=frequency=400 -acodec aac -ar 22050 -vcodec libx265 -crf 17 -pix_fmt yuv420p -t 3 rear.mp4

rem Concatenate:
ffmpeg -y -f concat -safe 0 -i tmplist.txt -c copy tmp.mp4

3秒后的结果:
在此输入图片描述


解决方案:将所有串联的输入视频转换为相同的分辨率。
注意:
- 至少需要重新编码一些视频。 - 我认为最好的解决方案是将较低分辨率的视频转换为更高分辨率,然后应用“concat”。
ffmpeg -y -i rear.mp4 -vf scale=192:108,setsar=1 -vcodec libx265 -crf 22 -pix_fmt yuv420p resized_rear.mp4

ffmpeg -y -f concat -safe 0 -i tmplist.txt -c copy tmp2.mp4

不太推荐的解决方案:

有一个单一的解决方案,但它会重新编码所有视频(降低质量)。
我不知道是否有使用文本文件的解决方案。

连接两个文件的示例 - 第二个视频被调整大小:

ffmpeg -y -i front.mp4 -i rear.mp4 -filter_complex "[1:v]scale=192:108,setsar=1[v1];[0:v][0:a][v1][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" -vcodec libx265 -crf 22 -pix_fmt yuv420p tmp_resized.mp4

我之前为什么可以毫无问题地这样做? 这是否与我来回更改文件类型(.mp4 --> .zzz --> .mp4)有关?这会破坏头文件或其他什么吗? - Manumit
1
我不知道...你确定之前有两个分辨率不同的视频文件吗?有可能你修改了其中一个摄像头的分辨率设置吗? - Rotem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接