使用ffmpeg组合来自多个来源的采样视频

时间:2016-01-06 16:15:05

标签: video ffmpeg

如果我有两个视频从不同的角度拍摄相同的主题,然后我想创建一个视频,但组合不仅仅是连接,而是从每个视频线性地进行时间排列,以创建同一时间线输出视频。有可能吗?

例如如果两个视频分别拍摄1分钟。然后,当我结合时,我希望从第一个结合0-15秒,然后从第二个结束15-30秒,然后从第一个结束30-45,然后从第二个视频结合45-60。创建1分钟的视频。

同样作为一般情况,如果可能的话,时间样本不需要均匀分布,而是从每个视频中随机分配,只要总剪辑加起来为原始拍摄时间。

如果有更多通用的情况,如果可以将其扩展到两个以上的视频源,可以说以上述方式将3个视频组合在一个随机时间剪辑中以创建单个视频。

非常感谢 Mrunal

2 个答案:

答案 0 :(得分:1)

您可以将问题分为以下三个子任务来完成此操作:

  1. 每个视频创建15秒的块。
  2. 你可以这样做:

    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
    ...
    
    1. 创建一个简单的文本文件,其中包含所需的所有块,如here所述。
    2. 此文件(我们称之为list.txt)应如下所示:

      file '/path/to/vid1_chunk_0.mp4'
      file '/path/to/vid2_chunk_1.mp4'
      file '/path/to/vid1_chunk_2.mp4'
      ...
      
      1. 使用:ffmpeg -y -f concat -i list.txt -c copy final.mp4
      2. 连接

        以下是一个示例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)
        

答案 1 :(得分:1)

如果帧精度不重要,可以分两步完成,跳过块创建。

创建联合列表

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