我有 MKV 文件,其中包含:
Stream #0:0(eng): Video: h264 (High)
Stream #0:1(pol): Audio: ac3
Stream #0:2(eng): Audio: dts (DTS)
Stream #0:3(pol): Subtitle: subrip
Stream #0:4(eng): Subtitle: hdmv_pgs_subtitle
Run Code Online (Sandbox Code Playgroud)
我想省略字幕(-sn选项),复制视频并将音频流编码为 AAC。
我尝试了一些不同的命令,并且输出文件始终相同(2个音频流,但两个声音都来自第一个音频流)。
这是我的命令:
ffmpeg -i input.mkv -sn -map 0:a? -map 0:v -c:v copy -c:a? aac output.mp4
ffmpeg -i input.mkv -sn -map 0 -c:v copy -c:a aac output.mp4
ffmpeg -i input.mkv -sn -map 0:? -c:v copy -c:a aac output.mp4
Run Code Online (Sandbox Code Playgroud)
一切几乎都可以工作,但在输出文件中,我有 2 个音频流,名称分别为 (pol) 和 (eng),但两者的声音均来自 (pol)stream0:1。
我应该使用什么命令来转换音频流,以实现两个音频流,其中 pol 和 eng 声音(两者都不是 pol)。有时输入文件只有 1 个音频流,因此命令行应该是通用的,我猜 ffmpeg 映射有?字符。
您可以使用流复制模式重新复用 ( -c copy)。这避免了重新编码。
ffmpeg -i input.mkv -map 0 -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)
-map 0从输入 #0 选择所有流input.mkv(注意 ffmpeg从 0 开始计数)。否则,将使用默认的流选择行为,即每种流类型仅选择一个流。
ffmpeg会告诉您流是否与输出容器格式不兼容,并显示错误消息:codec not currently supported in container。
目前最典型的兼容格式有:H.264视频、H.265/HEVC视频、AAC音频。
您可以使用负映射。包含除字幕之外的所有内容的示例:
ffmpeg -i input.mkv -map 0 -map -0:s -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅-map选项文档。
此示例流复制除转换为 AAC 的音频之外的所有内容:
ffmpeg -i input.mkv -map 0 -c copy -c:a aac output.mp4
Run Code Online (Sandbox Code Playgroud)