用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赋值操作方法分享
Mar 23 Python
python多线程操作实例
Nov 21 Python
深入解析Python中函数的参数与作用域
Mar 20 Python
python 写入csv乱码问题解决方法
Oct 23 Python
python交互式图形编程实例(三)
Nov 17 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
Python通过调用mysql存储过程实现更新数据功能示例
Apr 03 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
pandas使用之宽表变窄表的实现
Apr 12 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
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
vue ssr 指南详读
2018/06/29 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
python 算法 排序实现快速排序
2012/06/05 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
基于python traceback实现异常的获取与处理
2019/12/13 Python
Python面向对象编程基础实例分析
2020/01/17 Python
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
简历中求职的个人自我评价
2013/12/03 职场文书
数控个人求职信范文
2014/02/03 职场文书
仓库文员岗位职责
2014/04/06 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
2015财务年终工作总结范文
2015/05/22 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android
设置IIS Express并发数
2022/07/07 Servers