FFmpeg连接多个视频会让视频变长。

7
我有2个视频文件,想要使用ffmpeg进行拼接。 initial.mp4 视频:h264(高)(avc1 / 0x31637661),yuv420p(电视),720x720,1077 kb/s,15.98 fps,16 tbr,600 tbn,1200 tbc(默认)。 ending.mp4 视频:h264(高)(avc1 / 0x31637661),yuv420p(电视,bt470bg),720x720 [SAR 1:1 DAR 1:1],1287 kb/s,25 fps,25 tbr,25k tbn,50 tbc(默认)。
video_instructions_with_ending.txt
file initial.mp4
file initial.mp4
file initial.mp4
file ending.mp4

FFmpeg命令

ffmpeg -f concat -i video_instructions_with_ending.txt -c copy output.mp4 -y

output.mp4 视频: h264 (High) (avc1 / 0x31637661), yuv420p(tv), 720x720, 27 kb/s, 0.43 fps, 48 tbr, 19200 tbn, 38400 tbc (默认)

输出文件应该是6秒。但输出文件为3分32秒。

感谢您的帮助!

您可以从此处获取我使用的文件。


请参考这个答案,我认为这将是你的解决方案。 - Classsic
2个回答

3
ending.mp4 上运行此命令,然后与新文件连接起来:
ffmpeg -i ending.mp4 -c copy -video_track_timescale 600 newending.mp4

简而言之,由于时间基准不同,因此最终的视频会延长播放时长。请参阅https://dev59.com/RFcQ5IYBdhLWcg3wFf8-#43337235以了解时间戳和基准的上下文信息。

嗨,谢谢您的帮助。我试过了,不幸的是合并后的视频没有新的ending.mp4。这是为什么呢? - Riandy
您的视频未经过相同的编码处理。其中一个或两个视频可能需要重新编码处理。 - Gyan

3
我尝试了以下指令,它对我起作用了。
ffmpeg -i initial.mp4 -i initial.mp4 -i initial.mp4 -i ending.mp4 -filter_complex concat=n=4:v=1:a=0 -f MOV output.mp4 -y
说明: FFmpeg有三种拼接方法

  1. 拼接协议(ffmpeg -i 'concat:input1|input2' -codec copy output)- 用于二进制拼接兼容文件,如avi、mpeg-ts文件。
  2. 拼接解复用器(你解释的方法)- 当你想避免重新编码且你的格式不支持文件级别的连接时使用。
  3. 拼接滤镜:(上述答案)- 如果需要重新编码,比如应用滤镜时使用。

第三个选项适用于我们这种情况,因为我们需要重新编码文件。


嗨,阿伦,谢谢你的解释。对于第三个选项,因为它是重新编码,我会遭受质量损失,对吧? - Riandy
不一定。我们可以应用其他参数来进行无损编码。有一个参数叫做crf(0-51)。其中0表示完全无损,51表示最大的有损。当我尝试使用18个crf时,我可以得到源比特率。以下是我尝试的命令:'ffmpeg -i initial.mp4 -i initial.mp4 -i initial.mp4 -i ending.mp4 -filter_complex concat=n=4:v=1:a=0 -crf 18 output.mp4 -y' 参考:https://trac.ffmpeg.org/wiki/Encode/H.264 - arunk2
这解决了我的问题,非常感谢!我以为在使用 MP4 时应避免使用这种方法,但显然不是!非常感谢 :) - J. Scull

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