Linux FFmpeg不复制所有音频流

Linux FFmpeg不复制所有音频流,linux,windows,audio,video,ffmpeg,Linux,Windows,Audio,Video,Ffmpeg,我无法让ffmpeg从.mp4文件复制所有音频流。在线搜索数小时后,似乎应该复制所有流(): .mp4中的包含3个流: 录像带 音轨1 音轨2 out.mp4(应该与in.mp4相同)只包含两个流: 录像带 音轨1 FFmpeg似乎能够正确识别所有3个流,但并没有将它们全部复制过来。FFmpeg的输出: Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Stream #0:2

我无法让ffmpeg从.mp4文件复制所有音频流。在线搜索数小时后,似乎应该复制所有流():

.mp4中的
包含3个流:

  • 录像带
  • 音轨1
  • 音轨2
out.mp4
(应该与
in.mp4
相同)只包含两个流:

  • 录像带
  • 音轨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-v9-loglevel99-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(已解决):我设法从中找到了正确的语法。对于其他感兴趣的人,正确的语法是:

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


这将复制所有流。

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

请注意,当前每个输出流只能包含来自 单个输入流;例如,您不能使用“-map\u 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所指出的,这回答了一个问题,但这并不是原始海报的问题。]

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


我设法从中找到了正确的语法。正确的语法是:

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

这将复制所有3个流。

FFmpeg有选项将所有流映射到输出,您必须使用选项
-map 0
将所有流从输入映射到输出

完整地说,它可能看起来像:

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

有关更多信息,请参阅和选项的文档。

首先,我在这里尝试了这个更广泛的答案:

但是我遇到了一个不受支持的字幕曲目的问题,因此我不得不使用以下命令:

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


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

您使用的是哪个版本的ffmpeg,在哪个平台上?根据上的“错误报告”页面,在.mp4中输出
ffmpeg-v9-loglevel99-i将很有帮助。我已经添加了
ffmpeg-v9-loglevel99-i的输出。平台是Windows。FFmpeg版本是git-0a9e781(2016-06-10)
。相关文档:很好,我会做一些实验。谢谢。我设法从中找到了正确的语法。对于其他感兴趣的人,正确的语法是:
ffmpeg-i in.mp4-vcodec copy-c:a copy-map 0:0-map 0:1-map 0:2 out.mp4
,这将复制所有3个流。此答案与OP的查询无关。他们希望复制轨迹,而不是合并或拆分轨迹。OP的原始命令应该可以工作,如
流映射
代码所示。这是一个谜,为什么它没有,但单独的流编解码器语法。OP是否可以共享原始复制命令的控制台输出?我给出+1作为答案,但修改它将非常有帮助:从输入文件中选择所有视频和第三个音频流:ffmpeg-I input-map 0:v-map 0:a:2输出对于所有音频流都是相同的,可以说是0:aThis非常有用。您有兴趣添加一个完整的命令来简化它吗<代码>ffmpeg-i IN.mp4-c copy-map 0:?OUT.mp4
对于多个源,如
-i in0.mp4-i in1.aac
需要将
-map 0-map 1
添加到mux所有输入流中。您可以将
-map 0:?
替换为
-map 0
。是否有办法做到这一点,但忽略sub?我正在尝试-ss剪辑视频,如果SUB的格式不确定,它们会抛出错误。理想情况下,我只想将sub转换为可用的格式并保留它们。