如何连接多个视频,同时保持每个视频的原始长宽比

时间:2019-12-22 18:07:05

标签: ffmpeg aspect-ratio

如何在保持原始宽高比的同时连接多个视频?我认为有两种方法可以做到这一点。要么按比例缩放视频,要么用一个命令将它们连接在一起。目前,我正在使用以下命令

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "[0]scale=iw*sar:ih,setsar=1[ref];[1][ref]scale2ref=w=oh*mdar:h=ih[s][v0];[s]pad=1024:576:(ow-iw)/2:(oh-ih)/2,setsar=1[v1];[v0][0:a:0][v1][1:a:0]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" out.mp4

在上面的示例中,参考视频(1.mp4)为720x576 [SAR 64:45 DAR 16:9]。这对于连接2个视频非常有用,但我不知道如何使其更加动态。

那么我如何使以上命令适用于3个视频?缩放和1或1串联在一起。

1 个答案:

答案 0 :(得分:-1)

即使可以直接使用ffmpeg这样做,但我还是建议不要这样做,因为它变得非常复杂,并且很难通过多个输入进行维护。

您可以分别使用相关填充将每个视频缩放到所需的分辨率,然后将视频连接到一个文件。

像TransportStream(ts)这样的

容器可以使用简单的cat命令进行连接,如下所示:

input_dir="${1:-.}"
target_width=720
target_height=576

for input in $(ls "$input_dir" | grep '\.mp4'); do
  # use your ffmpeg command to normalize to $target_width $target_height
  ffmpeg \
    -i "$input" \
    -vf "scale=w=${target_width}:h=${target_height}:force_original_aspect_ratio=1,pad=${target_width}:${target_height}:(ow-iw)/2:(oh-ih)/2" \
    "out_${input%\.*}.ts"
done

# concatenate the files to one big .ts - ORDER MATTERS!
cat out_1.ts out_2.ts > combined.ts

# convert to a different container if needed
ffmpeg -i combined.ts -c copy combined.mp4

您应该得到combined.mp4,所有视频都依次播放并缩放到正确的分辨率