前言:
做了很长一段时间的抖音电商,带货的短视频都是混剪出来的,想实现一个能够程序化生成带货视频的程序,这篇文章就用来解决第一个问题,也就是将下载好的素材进行镜头细分割。
一、准备工作
代码是使用Python编写的,需要用到的库有 Numpy、OpenCV-Python,使用 pip 直接安装即可:
# 使用清华大学镜像源安装速度更快
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
二、实现思路
1、通过 openCV 读取帧画面,转换成小尺寸灰度图像,并计算帧画面的哈希值
2、计算出两帧画面的汉明距离,如超过一定的阈值,则说明当前帧为两个镜头的关键帧
3、将帧索引转换成00:00:00.000的时间戳。
4、调用ffmpeg,将视频按对应的时间戳分段切开保存为视频文件
三、函数实现
计算帧图像哈希值
# 计算帧的哈希值
def frame_to_fingerprint(frame):
# 将图像缩放为 8x8 的尺寸
frame = cv2.resize(frame, (8, 8), interpolation=cv2.INTER_AREA)
# 转换为灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 计算图像的均值
average = numpy.mean(gray)
# 将像素值大于均值的设为 1,其他设为 0
binary = numpy.where(gray > average, 1, 0)
# 返回指纹
return binary.flatten()
计算两帧画面的汉明距离
# 计算两个帧画面的汉明距离
def compare_fingerprints(fingerprint1, fingerprint2):
distance = numpy.count_nonzero(fingerprint1 != fingerprint2)
# 计算相似度
similarity = 1.0 - (distance / len(fingerprint1))
return similarity
帧索引转换成时间戳
# 根据帧速率将帧索引转时间戳,参数一为帧索引,参数二为帧速率
def frames_to_time(frameIndex, frame_rate):
millis, milliseconds = divmod(frameIndex, frame_rate)
seconds, millis = divmod(frameIndex, frame_rate)
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
return ("%02d:%02d:%02d.%d" % (hours, minutes, seconds, int(millis / frame_rate * 1000)))
ffmpeg的调用方式
ffmpeg -i "文件名" -map 0 -c copy -an -f segment -segment_times 分段时间戳 -reset_timestamps 1 "Out%02d.mp4"
四、总结
至此,就实现了镜头自动分割的功能,切出来的视频文件长这个样子:

最后附上完整代码:切割镜头.py
文章评论