FFmpeg不复制所有音频流

Dot*_*otl 16 linux windows audio video ffmpeg

我无法让ffmpeg从.mp4文件中复制所有音频流.在线搜索了几个小时后,它似乎应该复制所有流(如下面的示例4所示):

ffmpeg -i in.mp4 -map 0 -c copy out.mp4
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

编辑:输出来自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
Run Code Online (Sandbox Code Playgroud)

编辑2(已解决):我设法从此票证中找到了正确的语法.对于任何感兴趣的人,正确的语法是:

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

这将复制所有流.

PRI*_*LOP 17

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

实线显示如下:

ffmpeg -i in.mp4 -c copy -map 0 out.mp4
Run Code Online (Sandbox Code Playgroud)

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

  • 这非常有帮助。您有兴趣添加完整的命令以使其更容易吗?`ffmpeg -i IN.mp4 -c 复制 -map 0:? 输出.mp4` (2认同)
  • 对于多个源,例如-i in0.mp4 -i in1.aac,需要添加-map 0 -map 1以复用所有输入流。 (2认同)
  • 你可以用`-map 0`替换`-map 0:?`。 (2认同)

Dot*_*otl 11

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

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

ffmpeg -i in.mp4 -vcodec copy -c:a copy -map 0:0 -map 0:1 -map 0:2 out.mp4
Run Code Online (Sandbox Code Playgroud)

这将复制所有3个流.

  • 我给+1回答,但修改它会非常有用:从输入文件中选择所有视频和第三个音频流:ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT相同是所有音频流,可以记为0:a (3认同)