FFMPEG 在保留原件的同时重新编码所有音频流

FFMPEG Recode all audio streams while keeping originals

我正在尝试将一组额外的音轨添加到一些视频文件中,作为自动化过程的一部分。我想保留所有原始音轨并有第二个重新编码的副本。

我一直在用的是:

ffmpeg -i file
-map 0:v -codec:v copy
-map 0:a -codec:a copy
-map 0:a:0 -codec:a:0 aac -strict experimental ...(Bitrate, filters etc all with :a:0)
-map 0:s -codec:s copy
output file

但是我不知道如何更改它以处理具有多个音轨的输入文件,因为它只会转换第一个音轨。

如果我将编解码器行上的 :a:0 更改为 :a,它会生成我需要的额外副本,但会覆盖原始副本的复制编解码器。

有什么想法吗?

有两种方法。

首先使用单个命令,但可能会变长。想法是有条件地将音频流映射到文件可能具有的最大可能流。不优雅,但会完成工作。

ffmpeg -i in.mp4
          -c copy
          -map 0:v
          -map 0:a:0? -c:a:0 copy
          -map 0:a:0? -c:a:1 aac
          -map 0:a:1? -c:a:2 copy
          -map 0:a:1? -c:a:3 aac
          -map 0:a:2? -c:a:4 copy
          -map 0:a:2? -c:a:5 aac
          -map 0:a:3? -c:a:6 copy
          -map 0:a:3? -c:a:7 aac
out.mp4

第二种方法转码所有音轨并将其通过管道传输到另一个 ffmpeg 执行以进行复制。使用此方法,最终输出中流顺序的灵活性会降低。

ffmpeg -i in.mp4 -c:a aac -map 0:a -f nut - |
  ffmpeg -i - -i in.mp4 -c copy -map 1 -map 0 out.mp4