我一直想从 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
这里实际上有两个独立的问题:
在第一个命令行中,参数的顺序可能不正确。我认为开关
-newaudio
应该放在最后,即输出文件名之后。第二个命令行“删除字幕”,由于输入文件有字幕,因此您需要使用开关
-sn
来删除它们。否则,FFmpeg 似乎需要列表中至少指定的一个-map
。
答案4
在您的第一个命令中,您没有指定 test.mkv 是您的输出文件。看来您需要将该部分更改为类似... -c copy test.mkv
或指定编解码器... -c:s copy test.mkv
。
不确定该-newsubtitle
标志在里面起什么作用。但是,如果您有要添加的字幕文件,您应该可以输入另一个标志-i input.srt
。请参阅此关联为了那个原因。
在您的第二条命令中,我认为您似乎正在尝试映射视频流并尝试复制它。因此,您可能需要尝试删除该-vcodec copy
指令,这样它应该就可以正常工作了。:)