Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell FFMPEG-连接2个MP4文件,一个有视频和音频,另一个只有音频_Shell_Audio_Video_Ffmpeg - Fatal编程技术网

Shell FFMPEG-连接2个MP4文件,一个有视频和音频,另一个只有音频

Shell FFMPEG-连接2个MP4文件,一个有视频和音频,另一个只有音频,shell,audio,video,ffmpeg,Shell,Audio,Video,Ffmpeg,我正在尝试使用FFMPEG合并2个mp4文件。其中一个文件同时具有视频和音频(track1.mp4),而另一个文件仅具有音频(track2.mp4)。这些文件的名称以以下方式列在名为'filesToMerge.txt'的文本文件中: file 'track1.mp4' file 'track2.mp4' 然后执行下面的ffmpeg命令来合并它们 ffmpeg -f concat -i filesToMerge.txt -c copy output.mp4 但是,生成的连接文件仅包含files

我正在尝试使用FFMPEG合并2个mp4文件。其中一个文件同时具有视频和音频(
track1.mp4
),而另一个文件仅具有音频(
track2.mp4
)。这些文件的名称以以下方式列在名为
'filesToMerge.txt'
的文本文件中:

file 'track1.mp4'
file 'track2.mp4'
然后执行下面的ffmpeg命令来合并它们

ffmpeg -f concat -i filesToMerge.txt -c copy output.mp4
但是,生成的连接文件仅包含
filesToMerge.txt
中列出的第一个文件。也就是说,如果
track1.mp4
(包含视频和音频)是列表中的第一个文件,则只有该文件构成output.mp4(生成的串联文件),反之亦然

我希望这两个文件都在
output.mp4
中。我使用的是Ubuntu 14.04(如果有帮助的话)。我怎样才能解决这个问题

当我运行这个命令时
ffmpeg-i track1.mp4-i track2.mp4 output.mp4
我得到以下信息

ffmpeg version N-76944-g15206ff Copyright (c) 2000-2015 the FFmpeg developers
      built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04)
      configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libdcadec --enable-libfreetype --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab
      libavutil      55.  9.100 / 55.  9.100
      libavcodec     57. 16.101 / 57. 16.101
      libavformat    57. 19.100 / 57. 19.100
      libavdevice    57.  0.100 / 57.  0.100
      libavfilter     6. 17.100 /  6. 17.100
      libavresample   3.  0.  0 /  3.  0.  0
      libswscale      4.  0.100 /  4.  0.100
      libswresample   2.  0.101 /  2.  0.101
      libpostproc    54.  0.100 / 54.  0.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'track1.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf56.40.101
      Duration: 00:00:10.76, start: 0.023220, bitrate: 351 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x400 [SAR 400:533 DAR 800:533], 181 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
        Metadata:
          handler_name    : VideoHandler
        Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 194 kb/s (default)
        Metadata:
          handler_name    : SoundHandler
    Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'track2.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2mp41
        creation_time   : 1970-01-01 00:00:00
        encoder         : Lavf52.32.0
      Duration: 00:00:32.21, start: 0.000000, bitrate: 46 kb/s
        Stream #1:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 43 kb/s (default)
        Metadata:
          creation_time   : 1970-01-01 00:00:00
          handler_name    : SoundHandler
    [libx264 @ 0x3950ce0] using SAR=400/533
    [libx264 @ 0x3950ce0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX AVX2 FMA3 LZCNT BMI2
    [libx264 @ 0x3950ce0] profile High, level 3.0
    [libx264 @ 0x3950ce0] 264 - core 142 r2491 24e4fed - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    Output #0, mp4, to 'output.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf57.19.100
        Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 800x400 [SAR 400:533 DAR 800:533], q=-1--1, 25 fps, 12800 tbn, 25 tbc (default)
        Metadata:
          handler_name    : VideoHandler
          encoder         : Lavc57.16.101 libx264
        Stream #0:1(und): Audio: aac (libfdk_aac) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, s16, 128 kb/s (default)
        Metadata:
          handler_name    : SoundHandler
          encoder         : Lavc57.16.101 libfdk_aac
    Stream mapping:
      Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
      Stream #0:1 -> #0:1 (aac (native) -> aac (libfdk_aac))
    Press [q] to stop, [?] for help
    frame=  270 fps= 99 q=28.0 Lsize=     382kB time=00:00:10.72 bitrate= 291.9kbits/s dup=1 drop=0    
    video:230kB audio:143kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.482656%
    [libx264 @ 0x3950ce0] frame I:2     Avg QP:18.87  size:109452
    [libx264 @ 0x3950ce0] frame P:68    Avg QP:15.09  size:   171
    [libx264 @ 0x3950ce0] frame B:200   Avg QP:23.33  size:    23
    [libx264 @ 0x3950ce0] consecutive B-frames:  1.1%  0.0%  1.1% 97.8%
    [libx264 @ 0x3950ce0] mb I  I16..4: 11.0% 39.6% 49.5%
    [libx264 @ 0x3950ce0] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  5.9%  0.1%  0.0%  0.0%  0.0%    skip:93.9%
    [libx264 @ 0x3950ce0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.3%  0.0%  0.0%  direct: 0.0%  skip:99.7%  L0:21.8% L1:78.2% BI: 0.0%
    [libx264 @ 0x3950ce0] 8x8 transform intra:39.7% inter:92.8%
    [libx264 @ 0x3950ce0] coded y,uvDC,uvAC intra: 92.0% 95.0% 73.2% inter: 0.1% 1.4% 0.0%
    [libx264 @ 0x3950ce0] i16 v,h,dc,p:  1% 30%  4% 66%
    [libx264 @ 0x3950ce0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  6% 55% 16%  2%  4%  2%  8%  2%  6%
    [libx264 @ 0x3950ce0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 17% 18% 13%  7%  9%  7% 12%  6% 11%
    [libx264 @ 0x3950ce0] i8c dc,h,v,p: 44% 35% 10% 11%
    [libx264 @ 0x3950ce0] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 0x3950ce0] ref P L0: 98.1%  0.2%  1.1%  0.5%
    [libx264 @ 0x3950ce0] ref B L0: 85.1% 13.2%  1.7%
    [libx264 @ 0x3950ce0] ref B L1: 93.6%  6.4%
    [libx264 @ 0x3950ce0] kb/s:174.10

如果我理解正确的话,您希望最终输出的视频文件播放track1.mp4,它将有视频和音频,然后是track2.mp4,它将只有音频而不显示任何内容?下面的答案假设这是您想要的输出

我尝试了几种解决方案,即从视频中分离音频并首先连接音频,然后重新合并,并生成一个黑色视频以与track2.mp4配合使用。我无法说服两人都去工作。我发现的最后一个效果不错的解决方案是在ffmpeg wiki的页面上进行bash

步骤非常简单。将bash脚本复制到与track1/2.mp4相同目录中名为“mmcat”的文件中。然后跑

chmod +x mmcat && ./mmcat track1.mp4 track2.mp4 final.mp4
您现在应该在final.mp4中拥有所需的文件

请注意,此方法确实涉及一些转码,因此理论上这样做会损失一些质量。根据我的实验,我不认为这是可以避免的,因为只有在编解码器完全匹配的情况下才支持流复制,而您似乎没有这种情况(您的音频文件具有不同的比特率、采样率等)


还要注意的是,在track2期间,track1视频的最后一帧中的任何内容都将被冻结显示。如果你想让它变成黑色,你最好确保你在track1中的最后一帧是黑色的。这样做已经成为OP的一个练习。

首先,感谢您恢复我的帖子。我遵照您的建议,得到了以下错误-“/tmp/mcs#u v#u all:不允许操作”。然后我打开日志记录,在日志文件中发现以下错误:“无法写入输出文件0的头(编解码器参数不正确?):处理输入时发现无效数据”和“输出文件0不包含任何流”我不确定日志文件中的错误。它们对于脚本来说可能是正常的,至少我知道它尝试了几种方法。第一个错误似乎是由于您无法访问/tmp造成的。在脚本中找到读取“TMP=/TMP”的行,并将/TMP更改为您有权访问的目录。或者,如果您有根访问权限,请尝试“sudo chmod 777/tmp”。I流,我可以使用“ffmpeg-I track1.mp4-I track2.mp4 output.mp4”创建合并视频,但是,只有音频的track2将成为track1的背景音乐。因此,似乎两者都在同时进行。您有解决方案吗?是的,您根本没有连接。相反,您正在创建一个包含一个视频曲目和两个音频曲目的文件。您需要研究ffmpeg连接(我在回答中链接到)和/或(也链接到上面)。