用python进行视频剪辑


Posted in Python onNovember 02, 2020

一、目标

python,利用moviepy和pydub将一段视频进行区间切割

二、源码

import os
from moviepy.video.io.VideoFileClip import VideoFileClip
from pydub import AudioSegment


def clip_video(source_file, target_file, start_time, stop_time):
  """
  利用moviepy进行视频剪切
  :param source_file: 原视频的路径,mp4格式
  :param target_file: 生成的目标视频路径,mp4格式
  :param start_time: 剪切的起始时间点(第start_time秒)
  :param stop_time: 剪切的结束时间点(第stop_time秒)
  :return:
  """
  validate_file(source_file)
  source_video = VideoFileClip(source_file)
  video = source_video.subclip(int(start_time), int(stop_time)) # 执行剪切操作
  video.write_videofile(target_file) # 输出文件


def clip_audio(source_file, target_file, start_time, stop_time):
  """
  利用pydub进行音频剪切。pydub支持源文件为 mp4格式,因此这里的输入可以与视频剪切源文件一致
  :param source_file: 原视频的路径,mp4格式
  :param target_file: 生成的目标视频路径,mp4格式
  :param start_time: 剪切的起始时间点(第start_time秒)
  :param stop_time: 剪切的结束时间点(第stop_time秒)
  :return:
  """
  validate_file(source_file)
  audio = AudioSegment.from_file(source_file, "mp4")
  audio = audio[start_time * 1000: stop_time * 1000]
  audio_format = target_file[target_file.rindex(".") + 1:]
  audio.export(target_file, format=audio_format)


def combine_video_audio(video_file, audio_file, target_file, delete_tmp=False):
  """
  利用 ffmpeg将视频和音频进行合成
  :param video_file:
  :param audio_file:
  :param target_file:
  :param delete_tmp: 是否删除剪切过程生成的原视频/音频文件
  :return:
  """
  validate_file(video_file)
  validate_file(audio_file)
  # 注:需要先指定音频再指定视频,否则可能出现无声音的情况
  command = "ffmpeg -y -i {0} -i {1} -vcodec copy -acodec copy {2}".format(audio_file, video_file, target_file)
  os.system(command)
  if delete_tmp:
    os.remove(video_file)
    os.remove(audio_file)


def clip_handle(source_file, target_file, start_time, stop_time, tmp_path=None, delete_tmp=False):
  """
  将一个视频文件按指定时间区间进行剪切
  :param source_file: 原视频文件
  :param target_file: 目标视频文件
  :param start_time: 剪切的起始时间点(第start_time秒)
  :param stop_time: 剪切的结束时间点(第stop_time秒)
  :param tmp_path: 剪切过程的文件存放位置
  :param delete_tmp: 是否删除剪切生成的文件
  :return:
  """
  # 设置临时文件名
  if tmp_path is None or not os.path.exists(tmp_path):
    # 如果没有指定临时文件路径,则默认与目标文件的位置相同
    tmp_path = target_file[: target_file.rindex("/") + 1]
  target_file_name = target_file[target_file.rindex("/") + 1: target_file.rindex(".")]
  tmp_video = tmp_path + "v_" + target_file_name + ".mp4"
  tmp_audio = tmp_path + "a_" + target_file_name + ".mp4"

  # 执行文件剪切及合成
  clip_video(source_file, tmp_video, start_time, stop_time)
  clip_audio(source_file, tmp_audio, start_time, stop_time)
  combine_video_audio(tmp_video, tmp_audio, target_file, delete_tmp)


def validate_file(source_file):
  if not os.path.exists(source_file):
    raise FileNotFoundError("没有找到该文件:" + source_file)


def test_example():
  """
  测试例子
  :return:
  """
  root_path = 'XXX/videos/'
  video_name = "test.mp4"
  source_file = root_path + video_name
  start_time = 5
  stop_time = 6

  # 设置目标文件名
  target_name = str(start_time) + "_" + str(stop_time)
  target_file = root_path + "c_" + target_name + ".mp4"
  # 处理主函数
  clip_handle(source_file, target_file, start_time, stop_time)


if __name__ == "__main__":
  test_example()

三、遇到的问题

1. moviepy切割后的视频没有声音

解决方案:通过pydub切割后再合并

2. 直接利用ffmpeg切割后,视频会出现黑屏、时间区间不准确、分辨率低

解决方案:用了各种命令也没有成功,所以放弃。。。

3. 合并时,不支持mp3、 wav等格式

解决方案:统一保存为mp4

以上就是用python进行视频剪辑的详细内容,更多关于python 视频剪辑的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python避免死锁方法实例分析
Jun 04 Python
python模拟事件触发机制详解
Jan 19 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
selenium+python截图不成功的解决方法
Jan 30 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
Django实现跨域的2种方法
Jul 31 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
Python自动化测试基础必备知识点总结
Feb 07 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 Python
Python循环之while无限迭代
Apr 30 Python
如何通过python实现IOU计算代码实例
Nov 02 #Python
Opencv常见图像格式Data Type及代码实例
Nov 02 #Python
Jupyter安装链接aconda实现过程图解
Nov 02 #Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 #Python
python定时截屏实现
Nov 02 #Python
PyQT5速成教程之Qt Designer介绍与入门
Nov 02 #Python
如何基于matlab相机标定导出xml文件
Nov 02 #Python
You might like
PHP 函数语法介绍一
2009/06/14 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
python实现websocket的客户端压力测试
2019/06/25 Python
pow在python中的含义及用法
2019/07/11 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
《夜晚的实验》教学反思
2014/02/19 职场文书
教学评估实施方案
2014/03/16 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
医学专业毕业生求职信
2014/06/20 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
vue+echarts实现多条折线图
2022/03/21 Vue.js