任务描述
给定有序三元组列表 [{filename, start,duration}, ...]
,根据它调用 ffmpeg 进行视频剪辑。
思路分析
采用先切出所有片段,再连接的方式。
代码实现
视频操作部分采用 ffmpeg-python
库完成( kkroening/ffmpeg-python: Python bindings for FFmpeg - with complex filtering support (github.com) )
这里主要用到了 input
,concat
,output
,run
几个方法。
import ffmpeg
import json
def edit(clip_desc_list, output_filename):
# clip_desc_list is a list of dict{'filename'=?, 'start'=?, 'duration'=?}
clip_list = []
for clip_desc in clip_desc_list:
clip = ffmpeg.input(
clip_desc["filename"], ss=clip_desc["start"], t=clip_desc["duration"])
clip_list += [clip]
print(clip_list)
ans = clip_list[0]
for i in range(1, len(clip_list)):
ans = ffmpeg.concat(ans, clip_list[i])
ans.output(output_filename).run(quiet=False, overwrite_output=True)
if __name__ == '__main__':
bid = "BV16K4y1h7eq"
media_filename = "output/{bid}.mp4".format(bid=bid)
edit([{"filename": media_filename, "start": 0, "duration": 1}, {
"filename": media_filename, "start": 10, "duration": 1}, {"filename": media_filename, "start": 20, "duration": 1}], "output_edit/1.mp4")
References
Python3利用ffmpeg针对视频进行一些操作-刘悦的技术博客 (v3u.cn)
ffmpeg-python: Python bindings for FFmpeg — ffmpeg-python documentation (kkroening.github.io)