BoomBoss.cn

  • 首页
  • Python
  • Linux
  • 技术文章
  • 示例页面
  • 访问网盘
BoomBoss
无愧于心,不困于情,不念过去,无畏将来
  1. 首页
  2. Python
  3. 正文

使用Python结合FFmpeg实现视频自动切镜头

2022-12-29 1877点热度 0人点赞 0条评论

前言:

做了很长一段时间的抖音电商,带货的短视频都是混剪出来的,想实现一个能够程序化生成带货视频的程序,这篇文章就用来解决第一个问题,也就是将下载好的素材进行镜头细分割。

一、准备工作

代码是使用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

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: ffmpeg openCV python 剪辑
最后更新:2023-01-01

BoomBoss

选择大于努力,成功绝非偶然

打赏 点赞
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2024 年 7 月
  • 2023 年 11 月
  • 2023 年 10 月
  • 2022 年 12 月

分类

  • Linux
  • Python
  • 技术文章
  • 网站搭建

Copyright © 2022 BoomBoss.cn. All Rights Reserved.

Theme Kratos Made By Seaton Jiang

赣ICP备2021010953号