我正在尝试编写一个命令,以便 ffmpeg 为文件中的第一个音频流执行给定的指令,并为任何其他音频流执行不同的指令。例如,在下面的测试用例中,我希望将第一个流复制到输出文件,并将所有其他流转换为单声道。如果我这样写
ffmpeg -i INPUT -map 0 -c copy -map 0:a:0 -c:a:0 copy -map -0:a:0? -c:a libfdk_aac -ac 1 OUTPUT
Run Code Online (Sandbox Code Playgroud)
当映射稍后在命令行中被覆盖时,第一个音频流将被忽略。但是如果我将该流的指令移到其他流之后
ffmpeg -i INPUT -map 0 -c copy -map -0:a:0? -c:a libfdk_aac -ac 1 -map 0:a:0 -c:a:0 copy OUTPUT
Run Code Online (Sandbox Code Playgroud)
它不再被忽略,而是成为文件中的最后一个音频流。我知道我就在这里;我只是看不出我做错了什么。
用
ffmpeg -i INPUT -map 0 -c copy -c:a libfdk_aac -c:a:0 copy -ac 1 OUTPUT
Run Code Online (Sandbox Code Playgroud)
您只需要映射一次流。这是必须正确设置的编解码器选项的顺序。首先设置为复制所有流。然后使用编码器覆盖音频设置,然后重置第一个音频以再次复制。
这是适用于采用流说明符的选项的通用逻辑,例如-b:v, -c:a -map 0:s:1..etc
假设您有三个视频流和三个音频流,按第一列的顺序映射。下表显示了按第一行的顺序应用选项时会发生什么:
(stream) -c copy -c:a:0 aac -c:a libfdk_aac -c:4 mp3
0:v:0 copy copy copy copy
0:v:1 copy copy copy copy
0:v:2 copy copy copy copy
0:a:0 copy aac libfdk_aac libfdk_aac
0:a:1 copy copy libfdk_aac mp3
0:a:2 copy copy libfdk_aac libfdk_aac
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2988 次 |
| 最近记录: |