FFmpeg 损坏的串联输出
FFmpeg corrupted output from concatenation
EDIT/UPDATE:目前的解决方案是运行这个代码对所有文件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
录像来自同一个phone,一些来自前摄,一些来自后摄。我知道这可能会导致不同的问题?但直到最近它都运行良好。
现在此日志的输出已损坏:
单个视频文件播放得很好,大部分连接输出也是如此,但有些部分会变成这样并冻结:
您正在连接两个不同分辨率的视频文件。
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
EDIT/UPDATE:目前的解决方案是运行这个代码对所有文件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
录像来自同一个phone,一些来自前摄,一些来自后摄。我知道这可能会导致不同的问题?但直到最近它都运行良好。
现在此日志的输出已损坏:
您正在连接两个不同分辨率的视频文件。
front.mp4
为 1920x1080rear.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