如果我有两个视频从不同的角度拍摄相同的主题,然后我想创建一个视频,但组合不仅仅是连接,而是从每个视频线性地进行时间排列,以创建同一时间线输出视频。有可能吗?
例如如果两个视频分别拍摄1分钟。然后,当我结合时,我希望从第一个结合0-15秒,然后从第二个结束15-30秒,然后从第一个结束30-45,然后从第二个视频结合45-60。创建1分钟的视频。
同样作为一般情况,如果可能的话,时间样本不需要均匀分布,而是从每个视频中随机分配,只要总剪辑加起来为原始拍摄时间。
如果有更多通用的情况,如果可以将其扩展到两个以上的视频源,可以说以上述方式将3个视频组合在一个随机时间剪辑中以创建单个视频。
非常感谢 Mrunal答案 0 :(得分:1)
您可以将问题分为以下三个子任务来完成此操作:
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
...
此文件(我们称之为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)
答案 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