繁体   English   中英

FFmpeg 不复制所有音频流

[英]FFmpeg not copying all audio streams

我无法让 ffmpeg 从 .mp4 文件复制所有音频流。 经过数小时的在线搜索,看来这应该复制所有流(如此处的示例 4 所示):

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(已解决):我设法从这张票中找到了正确的语法。 对于任何其他感兴趣的人,正确的语法是:

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

这将复制所有流。

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

全线它可能看起来像:

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

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

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

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

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

这将复制所有 3 个流。

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

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

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

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

您可能需要通读并尝试man ffmpeg-filters上的手册页说明,以了解您在命名通道和预期输出方面的复杂程度。

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

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

但是我遇到了不受支持的字幕轨道的问题,所以我不得不使用以下命令:

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

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

似乎特定的 ffmpeg 版本忽略-c copy选项并跳过音频流复制,从而导致最终文件没有音频,例如不复制音轨并生成没有声音的视频。

例如,受影响的 ffmpeg 用于 Synology Disk Station 设备:

ffmpeg version 2.7.7 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.3 (crosstool-NG 1.20.0) 20150311 (prerelease)

为了解决这个问题,无需分析文件结构并使用 -map 0:1 -map 0:2 等手动映射所有音频流,我发现了非常简单的命令来自动处理它:

ffmpeg -i INFILE -map 0 -c copy -c:a copy OUTFILE

这与-c:v -c:a不同,因为它将章节和字幕以及视频和所有不同语言的音轨保存在一起,如英语、西班牙语、法语、俄语或中文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM