我也在摸索批量添加视频的缩略图的方法, 目前摸索的是这样:
- 首先要生成缩略图, 这个工具非常多, 也很简单.
但有个要求是要和源视频的常宽一致.最好和源视频的比例一致. 如果视频是video.mp4, 缩略图生成为同名 video.jpg - 然后使用ffmpeg将源视频随意截取一秒, 然后用缩略图替换这一秒视频的每一帧. 得到一个 _video.mp4. 也就是封面视频.
- 然后使用ffmpeg的concat方式, 将 _video.mp4 和 video.mp4 链接起来生成带一秒封面的视频 final.mp4
我也尝试了一些语句, 但是效果差强人意, 有的可以, 有的不行.
问题在于第二步合成的一秒视频, 没有很好的匹配源视频的规格, 造成成片语音脱轨, 延迟明显.
基本满足需要了.
下面是我的代码, python, 将其存为py文件, 然后在一个准备好的视频和thumbnails的目录中运行即可.
from subprocess import run
import glob
import os
video_files = glob.glob('*.mp4')
img_exts = ['.jpg', '.png']
for vid in video_files:
basename = vid.rsplit('.', 1)[0]
cover_vid_name = '_' + basename + '.mp4'
thumb_name = [ basename+ext for ext in img_exts if os.path.exists(basename+ext)][0]
cmd = [
'ffmpeg',
'-ss', '1',
'-i', vid,
'-i', thumb_name,
"-f",
"lavfi",
"-i",
"anullsrc=channel_layout=stereo:sample_rate=44100",
'-t', '1',
'-filter_complex', "[1][0]scale2ref[i][v];[v][i]overlay",
'-map', '2',
cover_vid_name
]
run(cmd)
for v in video_files:
con_file = 'lgrmdsvz.txt'
with open(con_file, 'w', encoding='utf-8') as f:
f.write(f"file '_{v}'\n")
f.write(f"file '{v}'")
cmd = [
"ffmpeg",
"-f",
"concat",
"-safe",
"0",
"-i",
con_file,
"-c",
"copy",
"___"+v
]
run(cmd)