用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 08 Python
python执行shell获取硬件参数写入mysql的方法
Dec 29 Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 Python
Python创建xml文件示例
Mar 22 Python
Python随机函数random()使用方法小结
Apr 29 Python
python2和python3在处理字符串上的区别详解
May 29 Python
Python八皇后问题解答过程详解
Jul 29 Python
将python2.7添加进64位系统的注册表方式
Nov 20 Python
python如何通过pyqt5实现进度条
Jan 20 Python
Python内置类型性能分析过程实例
Jan 29 Python
Python编程快速上手——选择性拷贝操作案例分析
Feb 28 Python
五种Python转义表示法
Nov 27 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
一个oracle+PHP的查询的例子
2006/10/09 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
php自定义session示例分享
2014/04/22 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
python根据出生日期获得年龄的方法
2015/03/31 Python
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
Python数据可视化图实现过程详解
2020/06/12 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
用python实现一个简单的验证码
2020/12/09 Python
Why we need EJB
2016/10/20 面试题
请假条范文大全
2014/04/10 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
步步惊心观后感
2015/06/12 职场文书
篮球赛新闻稿
2015/07/17 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python
Nginx配置之禁止指定IP访问
2022/05/02 Servers