ffmpeg:合并/合并多个mp4视频不起作用,输出只包含第一个视频

dtb*_*ker 50 ffmpeg

这是我用来组合多个视频的命令:

ffmpeg -i 75_540_38HQ2.mp4 -i 76_70_20.mp4 -i 76_173_80.mp4 -i 81_186_35.mp4 -vcodec copy -acodec copy Mux1.mp4

结果Mux1.mp4不包含所有视频.只有第一个视频(75_540_38HQ2.mp4).源和结果视频的文件大小在下面(如您所见,生成的视频略大于第一个视频):

$ ls -lh
-rw-r--r-- 1 dbaker dbaker  42M 2011-03-24 11:59 75_540_38HQ2.mp4
-rw-r--r-- 1 dbaker dbaker 236M 2011-03-24 12:09 76_173_80.mp4
-rw-r--r-- 1 dbaker dbaker  26M 2011-03-24 12:05 76_70_20.mp4
-rw-r--r-- 1 dbaker dbaker  54M 2011-03-24 12:15 81_186_35.mp4
-rw-r--r-- 1 dbaker dbaker  44M 2011-03-24 14:48 Mux1.mp4

这是ffmpeg命令的输出.对我来说它看起来没问题,显示了多个源输入和单个输出.

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Mar 21 2011 18:05:32 with gcc 4.4.5
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
  libpostproc   51. 2. 0 / 51. 2. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '75_540_38HQ2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:00:29.99, start: 0.000000, bitrate: 11517 kb/s
    Stream #0.0(eng): Video: h264, yuv420p, 1280x960 [PAR 1:1 DAR 4:3], 11575 kb/s, 29.94 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16, 127 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '76_70_20.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:00:19.98, start: 0.000000, bitrate: 10901 kb/s
    Stream #1.0(eng): Video: h264, yuv420p, 1280x960 [PAR 1:1 DAR 4:3], 10804 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #1.1(eng): Audio: aac, 48000 Hz, stereo, s16, 128 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from '76_173_80.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:03:09.99, start: 0.000000, bitrate: 10393 kb/s
    Stream #2.0(eng): Video: h264, yuv420p, 1280x960 [PAR 1:1 DAR 4:3], 10321 kb/s, 29.96 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #2.1(eng): Audio: aac, 48000 Hz, stereo, s16, 128 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00

Seems stream 0 codec frame rate differs from container frame rate: 119.88 (120000/1001) -> 30000.00 (30000/1)
Input #3, mov,mp4,m4a,3gp,3g2,mj2, from '81_186_35.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:00:35.00, start: 0.000000, bitrate: 12700 kb/s
    Stream #3.0(eng): Video: h264, yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 12620 kb/s, 59.91 fps, 30k tbr, 60k tbn, 119.88 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #3.1(eng): Audio: aac, 48000 Hz, stereo, s16, 128 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Output #0, mp4, to 'Mux1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
    Stream #0.0(eng): Video: libx264, yuv420p, 1280x960 [PAR 1:1 DAR 4:3], q=2-31, 11575 kb/s, 30k tbn, 29.97 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, 128 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #2.1 -> #0.1
Press [q] to stop encoding
frame=  883 fps=632 q=-1.0 Lsize=   44730kB time=29.40 bitrate=12465.1kbits/s    
video:41678kB audio:2969kB global headers:0kB muxing overhead 0.184548%

我在这里做一些令人眼花缭乱的事吗?

源视频来自摄像机,并采用小片段 ffmpeg -i bigfile.mp4 -ss 20 -t 10 -vcodec copy etc..

谢谢堆!戴夫


编辑:无法解决它所以我只使用avidemux GUI工具.它似乎附加了MP4就好了.

一定是MP4的问题,或者只是gopro相机的问题.

bcm*_*inc 19

假设您要连接电影,可以使用以下命令:

ffmpeg -f concat -i inputs.txt -vcodec copy -acodec copy Mux1.mp4
Run Code Online (Sandbox Code Playgroud)

使用inputs.txt中的以下文本:

file 75_540_38HQ2.mp4 
file 76_70_20.mp4 
file 76_173_80.mp4
file 81_186_35.mp4
Run Code Online (Sandbox Code Playgroud)

注意:某些发行版(如Ubuntu)在其存储库中没有ffmpeg,而是将ffmpeg定义为avconv的别名.这对avconv不起作用,所以在这种情况下你必须自己编译ffmpeg.您可以通过运行ffmpeg并检查第一个输出行是否以"FFmpeg开发人员"结束来检查您是否拥有真正的ffmpeg.


Rod*_*olo 13

忘记FFmpeg,改用MP4Box,它简单快捷:

    mp4box -add video1.mp4 -cat video2.mp4 -cat video3.mp4 output.mp4
Run Code Online (Sandbox Code Playgroud)

它适用于Windows,Linux和OS X:http: //www.videohelp.com/tools/mp4box

如果你在Windows上,你可以使用YAMB,它是MP4Box的GUI,效果很好:http: //www.videohelp.com/tools/YAMB

更新2016年6月: FFmpeg添加了一个串联过滤器,更多信息请访问:https: //stackoverflow.com/a/11175851/218418


Dav*_*ope 7

从ffmpeg手册页"示例"部分:

您可以在输出中放置许多相同类型的流:

ffmpeg -i test1.avi -i test2.avi -vcodec copy -acodec copy \ -vcodec copy -acodec copy test12.avi -newvideo -newaudio
Run Code Online (Sandbox Code Playgroud)

除了第一个视频和音频流之外,生成的输出文件test12.avi将包含在输入流列表中找到的第二个视频和第二个音频流.

必须在要添加它们的输出文件的名称后面立即指定"-newvideo"," - newaudio"和"-newsubtitle"选项.

如果您想要连接它们,则常见问题解答中有说明.

我不确定这个问题/答案是否属于SuperUser.

  • -newvideo,-newaudio,-newsubtitle已从当前版本中删除.您必须使用-map选项.(我没有把我的大脑包裹起来.)如果有人想要展示如何使用-map将MP4串联起来,这将是非常棒的. (6认同)
  • 这些文档描述了concat过滤器以及在这种情况下如何使用-map选项:http://ffmpeg.org/trac/ffmpeg/wiki/How%20to%20concatenate%20(join,%20merge)%20media%20files (2认同)

Rei*_*lis 6

您必须将它们转换为可以轻松连接的 MPEG 格式。以下是我为 GoPro 视频使用并称为“ffcat”的脚本。它本质上运行了几个“ffmpeg -i”命令,这些命令生成可连接的 MPEG,这些命令通过管道传输到 ffmpeg 命令,然后将它们转换为 H.264 mp4 文件。

它还可以将视频大小调整为 720p,但您可能不希望这样。

“h264options”是我最近在h264.code-shop.com的互联网上找到的标志

希望这会有所帮助,里德


cmd="( "

h264options="-vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \
 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \
 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \
 -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \
   -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\
 -qmax 51 -qdiff 4"

outfile="out-`date +%F-%H%M.%S`.mp4"

for i; do
    cmd="${cmd}ffmpeg -i $i -ab 256000 -vb 10000000 -mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -f mpeg -; "
done
cmd="${cmd} ) | ffmpeg -y -i - -threads 8 ${h264options} -vb 10000000 -acodec libfaac -ar 44100 -ab 128k -s 1280x720 ${outfile}"
echo "${cmd}"
eval ${cmd}
Run Code Online (Sandbox Code Playgroud)

  • 这具有将视频转码两次的负面影响。我可以想象您可能需要转码一次,但不需要两次。 (6认同)
  • MP4 文件在连接之前不需要转换为 MPEG 格式。为了做最简单的连接,所有输入文件都是mp4,输出文件也是mp4,根本不需要转码。Windows 7中的ffmpeg命令行(使用bcpinc的inputs.txt文件,见下文)是:ffmpeg -f concat -i input.txt -c copy output.mp4 (4认同)

Sat*_*kar 5

如果所有输入视频具有相同的编解码器,并且您希望输出视频也在同一编解码器中,则简单concat适用于mp4和mkv文件. https://trac.ffmpeg.org/wiki/Concatenate
你需要创建一个像这样的文本文件

# this is a comment
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
Run Code Online (Sandbox Code Playgroud)

然后使用命令

ffmpeg -f concat -i mylist.txt -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)

我使用了相同参考页面中的示例,它运行得很好.唯一的问题是视频未正确捕获.它可能会引入音频视频同步问题,因为它只是将PTS和DTS信息从源视频复制到目标视频.
要获得完整的校对解决方案,您需要逐个数据包读取视频,然后将所有数据包放在一个视频中,并进行自定义优化,例如丢弃重复的PTS数据包并保持单调的PTS值.