2013-07-02 60 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

相關問題