FFmpeg不复制所有音频流

问题描述 投票:12回答:4

我无法让ffmpeg从.mp4文件中复制所有音频流。经过几个小时的在线搜索,似乎应该复制所有流(as shown in example 4 here):

ffmpeg -i in.mp4 -map 0 -c copy out.mp4

in.mp4包含3个流:

  • 视频
  • 音轨1
  • 音轨2

out.mp4(应与in.mp4相同)仅包含2个流:

  • 视频
  • 音轨1

FFmpeg似乎确实正确识别了所有3个流,但并未将所有流复制过来。 FFmpeg的输出:

Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #0:2 -> #0:2 (copy)

编辑:ffmpeg -v 9 -loglevel 99 -i in.mp4的输出:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from in.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.36.100
  Duration: 00:00:06.03, start: 0.000000, bitrate: 5582 kb/s
    Stream #0:0(und), 1, 1/15360: Video: h264 (Main), 1 reference frame (avc1 /
0x31637661), yuv420p(tv, bt470bg/unknown/unknown, left), 1920x1080 (0x0) [SAR 1:
1 DAR 16:9], 0/1, 5317 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
 stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(und), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
 stereo, fltp, 128 kb/s
    Metadata:
      handler_name    : SoundHandler
Successfully opened the file.
At least one output file must be specified
[AVIOContext @ 0000000001c2b9e0] Statistics: 153350 bytes read, 2 seeks

编辑2(已解决):我设法从this ticket找到正确的语法。对于任何感兴趣的人,正确的语法是:

ffmpeg -i in.mp4 -vcodec copy -c:a copy -map 0 out.mp4

这将复制所有流。

linux windows audio video ffmpeg
4个回答
12
投票

FFmpeg可以选择将所有流映射到输出,您必须使用选项-map 0来映射从输入到输出的所有流。

在实线中,它可能看起来像:

ffmpeg -i in.mp4 -c copy -map 0 out.mp4

有关更多信息,请参阅有关stream selection-map选项的文档。


11
投票

显然这是一个受欢迎的问题,所以我将我的解决方案作为答案发布(以前是评论回复),以便其他人可以看到。

我设法从这个ticket找到正确的语法。正确的语法是:

ffmpeg -i in.mp4 -vcodec copy -c:a copy -map 0:0 -map 0:1 -map 0:2 out.mp4

这将复制所有3个流。


0
投票

好的,我深入阅读ffmpeg手册页,发现这应该是有用的:

请注意,目前每个输出流只能包含来自单个输入流的通道;例如,您不能使用“-map_channel”来选择包含在不同流(来自相同或不同文件)中的多个输入音频通道,并将它们合并为单个输出流。因此,例如,当前不可能将两个单独的单声道流转换成单个立体声流。然而,将立体声流分成两个单声道单声道流是可能的。

如果您需要此功能,可能的解决方法是使用amerge过滤器。例如,如果您需要将媒体(此处为input.mkv)与2个单声道音频流合并为一个立体声通道音频流(并保留视频流),则可以使用以下命令:

ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

您可能需要仔细阅读并试验man ffmpeg-filters上的手册页说明,以了解您为命名通道和预期输出而进入的复杂程度。

[编辑:正如Mulvya所说,这回答了一个问题,但这不是原始海报的问题。]


0
投票

首先,我在这里尝试了更广泛的答案:https://stackoverflow.com/a/54616353/1422630

但是我遇到了一个不支持字幕轨道的麻烦,所以我不得不使用这个命令:

avconv -i INFILE -c copy -map 0:a -map 0:v OUTFILE

我明白,在我要求复制之后,它基本上只复制了我映射的内容(当然它映射了所有音频),因为我根本不关心嵌入的字幕。如果你想映射字幕,只需添加这个-map 0:s

© www.soinside.com 2019 - 2024. All rights reserved.