ffmpeg:禁用多个音频流之一

hdf*_*hdf 6 unix ffmpeg audio-streaming

我有一个包含两个音频流的视频文件:

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
Run Code Online (Sandbox Code Playgroud)

有没有办法只禁用其中一个?我真正需要的是得到一个这样的文件:

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
Run Code Online (Sandbox Code Playgroud)

谢谢

llo*_*gan 15

流选择

默认情况下,ffmpeg 流选择将根据以下标准仅映射每个流类型的一个流:

  • 视频 – 分辨率最高的流
  • 音频 – 拥有最多频道的流
  • 字幕 – 第一个字幕流

在几个相同类型的流的情况下,选择具有最低索引的流。

使用该-map选项将覆盖此行为,如下所示。

示例 1:显式映射

ffmpeg通过参考输入流索引准确地告诉你想要什么流:

ffmpeg -i input -map 0:1 -map 0:2 -c copy output
Run Code Online (Sandbox Code Playgroud)
  • -c copy流复制(重新复用)每个映射的流而不是重新编码。

或使用流说明符

ffmpeg -i input -map 0:v -map 0:a:0 -c copy output
Run Code Online (Sandbox Code Playgroud)
  • 使用流说明符更加灵活,因为您不必知道确切的流索引,并且它可以帮助防止意外映射,例如尝试将视频映射到纯音频格式

  • -map 0:v将从输入 0 映射所有视频流(从 0ffmpeg开始计数,因此 0 是第一个输入,也是您的情况下的唯一输入)。

  • -map 0:a:0 将从输入 0 映射第一个音频流。

示例 2:负映射

告诉ffmpeg映射所有内容,然后选择要排除的内容:

ffmpeg -i input -map 0 -map -0:a:1 -c copy output
Run Code Online (Sandbox Code Playgroud)
  • -map 0 将映射来自输入 0 的所有流。

  • -map -0:a:1 将从输入 0 中排除第二个音频流。