2013-07-02 36 views
8

我试图用ffmpeg连接两个视频。没有什么花哨;我只想要一个由视频A组成的视频,紧接着是视频B.如何连接两个视频w。 ffmpeg - 记录的代码不起作用

我已经试过了从How to concatenate (join, merge) media files上的代码,可以在Fedora 17上新建或以其他方式正常工作的ffmpeg 1.2.1上安装,但出现以下错误消息:

$ ffmpeg -i video_a.mov -i video_b.mov -filter_complex '[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' output.mp4 

ffmpeg version N-54271-g7f866c1 Copyright (c) 2000-2013 the FFmpeg developers 
    built on Jun 29 2013 11:05:42 with gcc 4.7.2 (GCC) 20120921 (Red Hat 4.7.2-2) 
    configuration: --enable-gpl --enable-nonfree --enable-pthreads --enable-libx264 --enable-libfaac --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib 
    libavutil  52. 37.101/52. 37.101 
    libavcodec  55. 17.100/55. 17.100 
    libavformat 55. 10.100/55. 10.100 
    libavdevice 55. 2.100/55. 2.100 
    libavfilter  3. 77.101/3. 77.101 
    libswscale  2. 3.100/2. 3.100 
    libswresample 0. 17.102/0. 17.102 
    libpostproc 52. 3.100/52. 3.100 

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'v1221-MTQxMzcyNTIxODU2.mov': 
    Metadata: 
    major_brand  : qt 
    minor_version : 0 
    compatible_brands: qt 
    creation_time : 2013-03-28 20:34:59 
    encoder   : Mac OS X v10.8.3 (CMA 914, CM 926.87, x86_64) 
    encoder-eng  : Mac OS X v10.8.3 (CMA 914, CM 926.87, x86_64) 
    Duration: 00:00:05.34, start: 0.000000, bitrate: 15837 kb/s 
    Stream #0:0(und): Audio: aac (mp4a/0x6134706D), 44100 Hz, mono, fltp, 221 kb/s 
    Metadata: 
     creation_time : 2013-03-28 20:34:59 
     handler_name : Core Media Data Handler 
    Stream #0:1(und): Video: h264 (Main) (avc1/0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 15512 kb/s, 29.81 fps, 30 tbr, 600 tbn, 1200 tbc 
    Metadata: 
     creation_time : 2013-03-28 20:34:59 
     handler_name : Core Media Data Handler 

Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'v1224-MTQxMzcyNTIxODg5.mov': 
    Metadata: 
    major_brand  : qt 
    minor_version : 0 
    compatible_brands: qt 
    creation_time : 2013-03-28 20:36:28 
    encoder   : Mac OS X v10.8.3 (CMA 914, CM 926.87, x86_64) 
    encoder-eng  : Mac OS X v10.8.3 (CMA 914, CM 926.87, x86_64) 
    Duration: 00:00:04.13, start: 0.000000, bitrate: 15689 kb/s 
    Stream #1:0(und): Audio: aac (mp4a/0x6134706D), 44100 Hz, mono, fltp, 221 kb/s 
    Metadata: 
     creation_time : 2013-03-28 20:36:28 
     handler_name : Core Media Data Handler 
    Stream #1:1(und): Video: h264 (Main) (avc1/0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 15446 kb/s, 29.79 fps, 30 tbr, 600 tbn, 1200 tbc 
    Metadata: 
     creation_time : 2013-03-28 20:36:28 
     handler_name : Core Media Data Handler 

Stream specifier ':0' in filtergraph description [0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [v] [a] matches no streams. 

其他一些注意事项:

  • 两个视频,我用同样的相机拍摄了工作,所以不应该有纵横任何问题比例或其他血腥的视频细节。
  • 我可以用我的ffmpeg安装做其他事情,比如将其中一个视频从.mov转换为.mp4(是的,我必须重新编译faac ...),这似乎证明了ffmpeg和视频。
  • 我试着修改上面的调用以在最后生成一个.mov文件,但是我得到了和以前一样的错误。
  • 我对上述请求尝试了一些愚蠢的黑客技巧,如连接同一视频的两个副本,以及其他来自网络周围其他地方的涉及filter_complex的其他调用。即使在被引用的工作中,我也会得到“无匹配流”的消息。
+1

请出示完整的ffmpeg的控制台输出。 – LordNeckbeard

+0

确切的命令对我很好。你确定这是你用来获取该错误的确切命令吗? – mark4o

+0

是的 - 除了改变原始命令中的文件名以使其更具可读性外,它是一种直接剪切和粘贴。 –

回答

14

对于每个输入,首先指定视频流,然后指定音频流。因为你的视频流是流1为您的每个输入,音频流为流0,这将是:

ffmpeg -i video_a.mov -i video_b.mov -filter_complex '[0:1] [0:0] [1:1] [1:0] 
    concat=n=2:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' output.mp4 

或者更好的是,下面的命令应该工作的不管原始流的顺序,和将采取第一音频流,如果有多于一个:

ffmpeg -i video_a.mov -i video_b.mov -filter_complex '[0:v] [0:a:0] [1:v] [1:a:0] 
    concat=n=2:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' output.mp4 
+0

优秀 - 两个版本在这里都能正常工作。谢谢! –

+2

我总是得到错误 [AVFilterGraph @ 0000000002500a00]没有这样的过滤器:'[0:v]' 配置过滤器时出错。 有什么我在这里失踪? – desto

+3

@desto:如果您使用的是Windows,请将所有单引号改为双引号,并确保将其全部输入到一行中。 – mark4o

3

的毗连分路器

加入的的concat分路器到FFMPEG 1.1。如果您的ffmpeg的版本是旧的,从这里获得最新静态二进制:http://www.ffmpeg.org/download.html

说明

与所有你想在下面的表格已经连接起来的文件创建一个文件mylist.txt(系开始忽略短划线):

# this is a comment 
file '/path/to/file1' 
file '/path/to/file2' 
file '/path/to/file3' 

请注意,这些可以是相对路径或绝对路径。

ffmpeg -f concat -i mylist.txt -c copy output 

有可能产生与循环,或用printf一个bash这个列表文件:然后你就可以使用的文件编码。无论是下列之一会生成一个包含每个*在工作目录的.wav列表文件:

for f in ./*.wav; do echo "file '$f'" >> mylist.txt; done 
printf "file '%s'\n" ./*.wav > mylist.txt 

来源:ffmpeg wiki

相关问题