用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文件操作类操作实例详解
Jul 11 Python
python中的错误处理
Apr 10 Python
python之文件读取一行一行的方法
Jul 12 Python
python 字典中取值的两种方法小结
Aug 02 Python
在IPython中进行Python程序执行时间的测量方法
Nov 01 Python
Python实现堡垒机模式下远程命令执行操作示例
May 09 Python
python文本数据处理学习笔记详解
Jun 17 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
Python matplotlib可视化实例解析
Jun 01 Python
python和go语言的区别是什么
Jul 20 Python
利用python绘制正态分布曲线
Jan 04 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 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
基于Zookeeper的使用详解
2013/05/02 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
关于COOKIE个数与大小的问题
2011/01/17 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
python抓取网页内容示例分享
2014/02/24 Python
python操作xml文件示例
2014/04/07 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
keras中的backend.clip用法
2020/05/22 Python
python中pyqtgraph知识点总结
2021/01/26 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
Java面试笔试题大全
2016/11/23 面试题
企业管理标语
2014/06/10 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL