2016-01-06 83 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