如何从 MKV 文件中删除音频流?

如何从 MKV 文件中删除音频流?

我一直想从 MKV (Matroska) 文件中删除不需要的音频流。我想这样做的原因是为了避免在 Windows Media Player 中手动选择所需的流。

输入文件提供以下 ffmpeg 信息:

Stream #0.0: Video: mpeg4, yuv420p, 704x396 [PAR 1:1 DAR 16:9], 29.98 tbr, 1k tbn, 29.98 tbc
Stream #0.1(eng): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.2(jpn): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.3(eng): Subtitle: 0x0000
Stream #0.4(eng): Subtitle: 0x0000
Stream #0.5: Attachment: 0x0000
Stream #0.6: Attachment: 0x0000

因为我想要流 0、1 和 3(子),所以我的 ffmpeg 命令如下所示:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle test.mkv

奇怪的是,出现了错误:

At least one output file must be specified

删除字幕:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -vcodec copy -acodec libmp3lame test.mkv

给了我这个:

Number of stream maps must match number of output streams

我似乎不太明白“地图”选项的工作原理。有人能帮我弄清楚吗?

答案1

如果你只想删除一个流,而不是重新编码,那么你可能想要使用MKVtoolnix 软件包(看videohelp.com 的页面)。

有几个 GUI 可能会对您有所帮助(请查看视频帮助链接)。我不确定确切的mkvmerge命令行是什么,但我认为类似这样的命令会起作用:

# first, get audio track info so we know which one to keep
mkvmerge -i input.mkv
File 'input.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AAC)
Track ID 3: audio (A_AAC)        <----------- for example, let's keep this one
Track ID 4: audio (A_AAC)

mkvmerge -o output.mkv --audio-tracks 3 input.mkv

应该完成这个技巧(抱歉,我手边没有测试文件)。该--audio-tracks选项告诉mkvmerge复制仅列出将音轨添加到新文件中。如果您想保留 2 和 3 但不保留 4,则可以使用--audio-tracks 2,3

mkvmerge有很多其他选项可以设置标题、添加延迟以同步音频等,因此检查手册页了解详情。

答案2

尝试-f强制指定格式:

ffmpeg -i 输入.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle -f mkv 测试.mkv

答案3

这里实际上有两个独立的问题:

  1. 在第一个命令行中,参数的顺序可能不正确。我认为开关-newaudio应该放在最后,即输出文件名之后。

  2. 第二个命令行“删除字幕”,由于输入文件有字幕,因此您需要使用开关-sn来删除它们。否则,FFmpeg 似乎需要列表中至少指定的一个-map

答案4

在您的第一个命令中,您没有指定 test.mkv 是您的输出文件。看来您需要将该部分更改为类似... -c copy test.mkv或指定编解码器... -c:s copy test.mkv

不确定该-newsubtitle标志在里面起什么作用。但是,如果您有要添加的字幕文件,您应该可以输入另一个标志-i input.srt。请参阅此关联为了那个原因。

在您的第二条命令中,我认为您似乎正在尝试映射视频流并尝试复制它。因此,您可能需要尝试删除该-vcodec copy指令,这样它应该就可以正常工作了。:)

相关内容