我有一个带有两个音频流的视频文件:
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 960x540, 58 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2012-07-21 06:10:08
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 164 kb/s
Metadata:
creation_time : 2012-07-21 06:10:08
Stream #0:2(eng): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 640 kb/s
Metadata:
creation_time : 2012-07-21 06:10:08
有没有办法只禁用其中一个?我真正需要的是获取这样的文件:
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 960x540, 58 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2012-07-21 06:10:08
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 164 kb/s
Metadata:
creation_time : 2012-07-21 06:10:08
谢谢
答案1
流选择
默认情况下ffmpeg
流选择根据以下标准,每个流类型仅映射一个流:
- 视频 – 分辨率最高的流
- 音频 – 频道最多的流
- 字幕 – 第一个字幕流
在同一类型的多个流的评级相同的情况下,将选择具有最低索引的流。
使用-map
选项将覆盖此行为,如下所示。
示例 1:显式映射
ffmpeg
通过参考输入流索引来准确告诉您想要什么流:
ffmpeg -i input -map 0:1 -map 0:2 -c copy output
-c copy
将要流复制(重新多路复用)每个映射流而不是重新编码。
或者使用流说明符:
ffmpeg -i input -map 0:v -map 0:a:0 -c copy output
使用流说明符更加灵活,因为你不必知道确切的流索引,并且它可以帮助防止意外映射,例如尝试将视频映射到仅音频格式
-map 0:v
将从输入 0 映射所有视频流(ffmpeg
从 0 开始计数,因此 0 是第一个输入,并且在您的情况下是唯一的输入)。-map 0:a:0
将从输入 0 映射第一个音频流。
示例 2:负映射
告诉ffmpeg
映射所有内容,然后选择要排除的内容:
ffmpeg -i input -map 0 -map -0:a:1 -c copy output
-map 0
将从输入 0 映射所有流。-map -0:a:1
将从输入 0 中排除第二个音频流。
答案2
您可以使用流说明符来选择流类型和特定流。更多信息请见此处...