python基于moviepy实现音视频剪辑

作者:ratiger 时间:2023-08-21 14:56:47 

目录
  • 实践步骤

  • 完整代码

  • 参考

实践步骤

1.寻找合适的Python库(安装是否麻烦、使用是否简便、执行会不会太久)

  • moviepy 音视频库。分析需要用的API:代码示例

2.定义输入输出

  • 输入:一个音视频文件的地址,需要剪出来的时间段

  • 输出:剪辑片段的文件

3.设计执行流程并一步步实现(定义函数,与使用具体API相关)

  1. 读入并创建clip对象。

  2. 剪辑subclip,输入时间参数可以是时间格式的字符串。

  3. 导出write_videofile。

4.结论:时间太久,片段多长就花了多久的时间;CPU全跑满了。

stackoverflowConcat videos too slow using Python MoviePY 里面有个答案说,调用包里封装的ffmpeg函数会快一些:

You have some functions that perform direct calls to ffmpeg: github.com/Zulko/movie… And are therefore extremely efficient, for simple tasks such as yours.

5.重新设计和实现,直接使用moviepy.video.io.ffmpeg_tools里的函数:ffmpeg_extract_subclip(源音视频文件,起,止,输出名)。

  • 这个函数中输入的起止时间参数只能是数字,不能是字符串,而库基本使用的接口函数传入的是字符串。看源码发现是有个把时间字符串转换成数字的装饰器的,一步步找就可以找到那个转换的函数了。

6.结论:时间快了很多,几乎是几秒内就完成。

  • 但并不明白为什么快了这么多

7.优化:一次处理多个时间段

  1. 输入由一个起止时间,变为一组起止时间

  2. 循环处理每一组起止时间

  3. 输出的文件名按顺序拼接

8.优化:每段时间配上名字

  1. 输入除了每一组的起止时间,还有后缀名

  2. 文件名+后缀得到输出的文件名

9.优化:输入输出的合法性校验

  • 校验输入地址是合法文件

  • 校验时间段(没什么必要)

    • 不可以小于0

    • 不可以大于视频时间

    • 起小于止

完整代码

需要pip install moviepy

简单的使用


from moviepy.editor import VideoFileClip, concatenate_videoclips

clipOri = VideoFileClip("E:/2020-03-29 19-31-39.mkv")

#截取两个subclip再拼接
#time_length = int(clipOri.duration) 这句可以获取片子的时
#超过时长会报错,时长默认用秒,也可以写得更细,(00:03:50.54)->3分50秒

cut1 = clipOri.subclip(0, 7053)
cut2 = clipOri.subclip(7059, 8941)

finalClip = concatenate_videoclips([cut1,cut2])

finalClip.write_videofile("E:/acut.mp4")

import os
import moviepy.video.io.ffmpeg_tools as fftool
from moviepy.tools import cvsecs

def add_suffix(file_name, suffix): # 文件名拼接后缀
   index = file_name.rfind('.') # 最后一个点号
   res = file_name[:index] + '_' + suffix + file_name[index:]
   return res

# 输入
file_name = r"./XXX.mkv"
output_arr = [
   ('04:20','05:07', '自我介绍'),
   ('05:07','17:47', '项目经历'),
   ('17:37','24:40', 'HTTPS'),
   ('24:40','28:10', '实现读写锁'),
]

if not os.path.isfile(file_name): # 校验
   print("不合法的输入", file_name)

for startStr, endStr, suffix in output_arr:
   start = cvsecs(startStr)
   end = cvsecs(endStr)

if start < 0 or start >= end: # 校验
       print("不合法的时间",startStr, endStr)
       continue

full_output_name = add_suffix(file_name, suffix)
   print('处理文件:', file_name, '时间:', startStr, '-', endStr)
   fftool.ffmpeg_extract_subclip(file_name,start,end,full_output_name) # 剪辑并输出
   print('处理功成功,输出:',full_output_name)

参考

  • moviepy的文档

    • moviepy中文文档

    • 英文文档

    • GitHub地址

  • 博文:用moviepy将视频剪掉一段

  • stack overflow Concat videos too slow using Python MoviePY

来源:https://juejin.cn/post/6973318052586717220

标签:python,moviepy,剪辑
0
投稿

猜你喜欢

  • python打包压缩、读取指定目录下的指定类型文件

    2021-01-19 08:23:26
  • 详解RIFF和WAVE音频文件格式

    2023-03-30 15:58:13
  • SQL Server 2012 开窗函数

    2024-01-28 01:39:15
  • python数据写入Excel文件中的实现步骤

    2023-11-19 23:11:45
  • mysql格式化小数保留小数点后两位(小数点格式化)

    2024-01-21 10:33:58
  • Python中使用jpype调用Jar包中的实现方法

    2023-04-24 13:48:05
  • Python使用BeautifulSoup4修改网页内容的实战记录

    2023-04-10 15:59:56
  • 深入理解Python虚拟机中字节(bytes)的实现原理及源码剖析

    2021-12-20 22:51:28
  • PyTorch安装与基本使用详解

    2023-05-09 03:20:51
  • Python操作mongodb数据库进行模糊查询操作示例

    2024-01-29 03:40:45
  • fckeditor 常用函数

    2023-01-25 15:47:11
  • PHP计算字符串真正的宽度和高度像素(图片加文字水印示例)

    2023-05-28 06:48:44
  • mysql 时间戳的用法

    2024-01-18 03:11:37
  • Python 3.x基础实战检查磁盘可用空间

    2021-05-11 09:21:25
  • Python初学者需要注意的事项小结(python2与python3)

    2021-08-16 19:49:26
  • python使用post提交数据到远程url的方法

    2023-11-12 07:10:19
  • python中torch.nn.identity()方法详解

    2021-05-21 16:51:01
  • 用python简单实现mysql数据同步到ElasticSearch的教程

    2024-01-15 14:40:39
  • Layui 数据表格批量删除和多条件搜索的实例

    2024-04-10 10:43:56
  • 解决pycharm19.3.3安装pyqt5找不到designer.exe和pyuic.exe的问题

    2022-06-08 02:29:26
  • asp之家 网络编程 m.aspxhome.com