Python自动剪辑搬运视频到抖音
该项目可以直接拆解他人的素材,使用python识别视频节点,做二次剪辑,实现批量化洗稿
在其他平台做过英雄联盟集锦视频,这些视频是由若干素材拼接而成。想要搬运到抖音平台,为了降低重复度,因此需要对素材做打乱处理,从而规避版权问题。
下载英雄联盟集锦视频
识别拆分素材
素材乱序重构
配上新的BGM生成抖音短视频
自动生成抖音封面
自动投稿
视频网站是YTB,使用YTB-dl下载。
可以使用如下命令
在这里指定 'bestvideo+bestaudio' ,下载后的视频格式如下图所示:
可以规范命名,按照视频编号和视频名称命名。
首先可以使用opencv对视频做逐帧分析
# 识别视频关键帧
def read_video(video_path):
cap=cv2.VideoCapture(video_path)
global fps
global end_c
global start_c
fps=cap.get(cv2.CAP_PROP_FPS)
start_c=60*1000
end_c=(int(cap.get(7)) - 25*60)*1000
c=0
cap.set(cv2.CAP_PROP_POS_FRAMES, c) # 设置读取的位置,从第几帧开始读取视频
while True:
ret, frame=cap.read()
# 检查是否完成
if not ret:
break
true_ms=cap.get(cv2.CAP_PROP_POS_MSEC)
check_hero(frame, true_ms)
check_sub(frame, true_ms)
check_start(frame, true_ms)
check_end(frame, true_ms)
c=c + 1
if c % 600==0 :
print(c_min_s(c),end=' : ')
print(cut_dir)
可以发现视频主要是由若干素材拼接而成,每一个素材都是一分钟左右的短片,那么如何识别出素材是在什么时候切换呢?
可以用以下特征:
观察到,在一个新素材出现时,会在左下角出现该素材的玩家名等基本信息,那么可以在识别到该信息后,即可判定当前时间点为素材的起始时间。
在这里我们也不需要用非常准确的智能优化方法,可以使用利用图片本身的像素特征,比较图片的相似性:
在这里使用差异哈希方法,首先将图片尺寸修正,然后将对比每个像素块的相似度,最后获得结论。
# 差异值哈希算法
def dhash(image, size):
# 将图片转化为8*8
image=cv2.resize(image, (size + 1, size), interpolation=cv2.INTER_CUBIC)
# 将图片转化为灰度图
gray=cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
dhash_str=''
for i in range(size):
for j in range(size):
if gray[i, j]> gray[i, j + 1]:
dhash_str=dhash_str + '1'
else:
dhash_str=dhash_str + '0'
result=''
for i in range(0, size * size, 4):
result +=''.join('%x' % int(dhash_str[i: i + 4], 2))
return result
由于差异哈希算法比较的是全局的结果,可以对图片做二次裁剪,分析特定图片的识别精度。
我们将完整的图片做拆分,并且将其与flag文件下的hero图片做对比。
# 检查英雄位置
def check_hero(frame, cap):
# 截取片段
copy_img=frame[-hero_h_1:-hero_h_2, hero_w_1:hero_w_2]
# 比较结果
result=campHash(copy_img, cv2.imread('https://zhuanlan.zhihu.com/p/flag/hero.jpg'), 32)
cv2.putText(copy_img, str(result)+'_'+str(cap), (0, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 0), 2)
if result < 0.2:
cv2.putText(copy_img, 'Done', (200, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 0), 2)
data=get_s(cap)
if data not in cut_dir['hero']:
cut_dir['hero'].append(data)
# 暂时保存
cv2.imwrite('https://zhuanlan.zhihu.com/p/img/' + str(cap) + '.jpg', copy_img)
hero图片如下所示
选择几乎纯白作为识别色,主要原因在于我们逐帧分析logo出现画面,其中纯白帧数出现的较短,而且效果非常明显。
截取后的视频截图如下所示
在另一个文章中,介绍了如何将图片合成gif,将以上图片合成gif,可以发现,在出现在白光时,有一个明显的阈值波峰,我们可以根据阈值设置,来识别时间的起始端。
最终拆解结果如下所示:
根据起始节点和终止节点,以及英雄特征等参数,识别视频片段的始末时间点,下一步就是对这些时间点做二次拆分。
cut_node={'hero':['0:0', '0:37', '0:55', '1:20', '1:46', '2:16', '2:39', '2:46', '3:0', '3:30', '4:5', '4:22', '4:51', '5:15', '5:47', '6:12', '6:40', '6:41', '7:8', '7:29', '7:49', '8:1', '8:22', '8:40', '8:50', '9:1', '9:9', '9:26', '9:51', '10:3', '10:14', '10:32', '10:33', '10:41', '10:58', '11:16', '11:33', '12:9', '12:40', '13:0', '13:14', '13:29', '13:36', '13:44', '14:2', '14:51', '15:6', '15:23', '15:37', '15:46'], 'sub':['2:13', '2:14', '14:39', '15:20'], 'start':['0:34'], 'end':[]}
如果直接把素材拼接,不利用视频降重,因此需要将素材调序,降低重复度,并且根据抖音实际要求,对视频长度做裁剪。这一部分比较简单,就是做拆分处理。
根据先前获得的数据,将视频做隔断
视频1 | logo | 视频2 | 视频3 订阅 | 视频4 | 片尾 hero--start--hero--hero--sub---hero--end--- start 和 end 加入hero排序` 按照间隔做分割,要超剪一点,保证没有重叠 然后间隔里有sub就删掉
核心函数如下
# 原始节点
cut_node=get_cut_node()
# 获得可以使用的视频片段
video_start_end_list=c_split(cut_node)
# 因为抖音时长在三分钟以内,所以做二次整理归类
out_cut_node=douyi_video(video_start_end_list)
# 调整顺序
fix_cut_node=fix_cut(out_cut_node, 1*fps)
这一步使用的是moviepy.editor库,这个库可以自动化的处理视频音频,可以实现很好的视频合成功能。
# 构建视频
def build_video(cut_s_list, video_path, video_num):
raw_video = VideoFileClip(video_path)
raw_video_without_audio = raw_video.without_audio()
for i, first in enumerate(cut_s_list):
if i == video_num:
exit()
audioclip = AudioFileClip('https://zhuanlan.zhihu.com/p/bgm/'+str(i)+'.mp3')
clip_list = []
for second in first:
clip_list.append(raw_video_without_audio.subclip(second[0], second[1]))
finalclip = concatenate_videoclips(clip_list)
audioclip = audioclip.subclip(0, finalclip.duration)
finalclip = finalclip.set_audio(audioclip)
finalclip.write_videofile(str(i)+'.mp4')
同样也是使用python实现,后续再介绍
可以使用代码实现自动添加封面,自动添加热点,自动添加位置信息,自动定时发布
阿卡丽峡谷穿越旅行 | 07 英雄联盟-瞬间秒杀 #lol #细节操作 #细节操作 @DOU+小助手
抖音搜索 @兔小萌
联系方式见链接
联系方式 - 兔小萌