2016-01-06 39 views
1

如果我有兩個視頻從不同角度拍攝同一主題,然後我想創建一個視頻,但組合不僅僅是串聯,而是從每個視頻線性抽取時間線樣本的視頻創建相同的時間線輸出視頻。可能嗎?使用ffmpeg合併多個來源的採樣視頻

例如,如果兩個視頻每個都拍攝1分鐘。那麼當我結合時,我想要結合從第一個0-15秒,然後從第二個15-30秒,然後從第一個30-45,然後從第二個視頻45-60。創建一個1分鐘的視頻。

同樣作爲一般情況下,如果以上情況是可能的,只要總剪輯添加到原始拍攝時間,時間樣本不需要是均勻分佈的,而是從每個視頻中隨機分配的。

作爲一個更普遍的情況,如果上述可能的話,將其擴展到兩個以上的視頻源,可以說3個視頻以上述方式在隨機時間剪輯組合成一個視頻。

千恩萬謝 Mrunal

+0

我們可以假定所有的視頻編碼與同一GOP結構,你會在我幀只砍? – incBrain

+0

是的,爲了簡單起見,所有的視頻都會使用相同的攝像機來保持編碼的一致性和設置的均勻性。但是,如果我們假設攝像機略有不同,據我所知一些高清網絡攝像機具有板載處理能力,而有些則不是那麼難以達到類似的結果。 –

回答

1

您可以將您的問題到這三子任務做到這一點:

  1. 創建每個視頻15秒塊。

可以做這樣的:

ffmpeg -y -i vid1.mp4 -vcodec copy -ss 00:00:00 -t 00:00:15 vid1_chunk_0.mp4 
ffmpeg -y -i vid1.mp4 -vcodec copy -ss 00:00:15 -t 00:00:15 vid1_chunk_1.mp4 
... 
  • 創建具有在等中描述here所需順序所有塊一個簡單的文本文件。
  • 此文件(我們稱之爲list.txt)應該是這樣的:

    file '/path/to/vid1_chunk_0.mp4' 
    file '/path/to/vid2_chunk_1.mp4' 
    file '/path/to/vid1_chunk_2.mp4' 
    ... 
    
    使用
  • 級聯:ffmpeg -y -f concat -i list.txt -c copy final.mp4
  • 下面是一個例子python腳本:

    import os 
    
    def sec2hms(seconds): 
        m, s = divmod(seconds, 60) 
        h, m = divmod(m, 60) 
        return "%02d:%02d:%02d" % (h, m, s) 
    
    def createchunks(video, vid_dur, chunk_dur): 
        chunks = list() 
        for n in range(0, vid_dur/chunk_dur): 
         cmd = 'ffmpeg -y -v quiet' 
         cmd += ' -i ' + video 
         cmd += ' -vcodec copy' 
         cmd += ' -ss ' + sec2hms(n*chunk_dur) 
         cmd += ' -t ' + sec2hms(chunk_dur) 
         cmd += ' ' + video[:-4] + '_chunk_' + str(n) + '.mp4' 
         print cmd 
         os.system(cmd) 
         chunks.append(video[:-4] + '_chunk_' + str(n) + '.mp4') 
        return chunks 
    
    # step 1. create 15 sec. chunks of first 60 sec. of content 
    vid1_chunks = createchunks('vid1.mp4', 60, 15) 
    vid2_chunks = createchunks('vid2.mp4', 60, 15) 
    
    # step 2. create a list.txt file (alternating order) 
    filenames = [None] * len(vid1_chunks) 
    filenames[::2] = vid1_chunks[::2] 
    filenames[1::2] = vid2_chunks[1::2] 
    with open('list.txt', 'w') as listfile: 
        for fname in filenames: 
         listfile.write('file \'' + fname + '\'\n') 
    
    # step 3. concatenate 
    cmd = 'ffmpeg -y -v quiet -f concat -i list.txt -c copy final.mp4' 
    os.system(cmd) 
    
    +0

    非常感謝您的詳細回覆和腳本。我衷心感謝。我會採取這個做一些實驗。我有更多的想法,我會在實驗中進一步提問。 –

    +0

    @MrunalGawade不客氣。試試看,如果(並且只有)解決了你的問題,不要忘記接受答案,所以其他遇到同樣問題的人可以更快地找到解決方案。 – incBrain

    +0

    好的。但是我可能需要一點時間才能嘗試一下,因爲我要出站幾天。要接受答案,我必須點擊左側答案的向上箭頭? –

    1

    如果幀精度不是impo rtant,你可以分兩步完成,跳過創建塊。

    創建CONCAT列表

    file 'video1.mp4' 
    inpoint 0 
    outpoint 15 
    file 'video2.mp4' 
    inpoint 15 
    outpoint 30 
    file 'video1.mp4' 
    inpoint 30 
    outpoint 45 
    file 'video2.mp4' 
    inpoint 45 
    outpoint 60 
    (fill out the text file in this manner...) 
    

    運行CONCAT

    ffmpeg -y -f concat -i list.txt -c copy final.mp4 
    
    +0

    非常感謝你Mulvya .. –

    +0

    我在執行上面的腳本得到以下錯誤。 [concat @ 0xbf7ca0]第2行:未知關鍵字'inpoint' list.txt:處理輸入時發現無效數據 –

    +0

    您使用的是哪個版本的ffmpeg? – Mulvya