You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用FFmpeg拼接不同格式、帧率及分辨率的视频?相关命令疑问

针对FFmpeg同参数视频拼接的优化建议

我明白你现在的困惑:当两个输入视频都是MP4、30fps、720×980这种完全匹配的参数时,你当前用的那条带filter_complex的命令显得有点“大材小用”,甚至可能做了不少冗余操作。下面我给你拆解清楚,再给出更合适的方案:

为什么当前命令在参数一致时没必要?

你命令里的filter_complex部分做了scale=480x640setsar=1:1,但原视频本身是720×980,这相当于强制把高清视频缩成低分辨率,完全没必要,还会损失画质。另外,当输入视频的编码、分辨率、帧率、采样率等参数完全一致时,concat滤镜其实可以简化,甚至用更高效的方式实现拼接。

推荐两种更优的方案

方案1:用concat demuxer(最快,无画质损失)

这是同参数视频拼接的最优解,因为它直接复制视频流,不需要重新编码,速度快到飞起,还能完美保留原画质。步骤如下:

  1. 先创建一个文本文件(比如input_list.txt),内容格式如下:
    file '你/file1的/绝对路径.mp4'
    file '你/file2的/绝对路径.mp4'
    
    注意:如果路径有空格,一定要用单引号括起来;如果用相对路径,确保FFmpeg能找到文件。
  2. 执行FFmpeg命令:
    ffmpeg -y -f concat -safe 0 -i input_list.txt -c copy rootPath/output.mp4
    
    解释:-f concat指定用concat demuxer,-safe 0允许使用绝对路径,-c copy表示直接复制音视频流,跳过编码步骤。

方案2:简化你的filter_complex命令(如果需要保留编码参数)

如果你因为某些原因必须重新编码(比如要调整音频参数、画质参数),那可以去掉冗余的缩放和SAR设置,简化命令:

ffmpeg -y -i file1.mp4 -i file2.mp4 -strict experimental -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1" -ab 48000 -ac 2 -ar 22050 -vcodec libx264 -crf 27 -preset ultrafast rootPath/output.mp4

这里去掉了scalesetsar-s 480x640,因为原视频参数一致,不需要强制修改分辨率;其他音频、视频编码参数可以保留你原来的设置。

什么时候需要用你原来的复杂命令?

只有当输入视频参数不一致时(比如一个是MP4一个是MOV,分辨率一个720p一个1080p,帧率一个25fps一个30fps),才需要用scale统一分辨率、fps统一帧率,确保concat滤镜能正常工作。

内容的提问来源于stack exchange,提问作者1234567

火山引擎 最新活动