用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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
Centos5.x下升级python到python2.7版本教程
Feb 14 Python
Python脚本实现集群检测和管理功能
Mar 06 Python
Python中的rfind()方法使用详解
May 19 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
深入理解Python中range和xrange的区别
Nov 26 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
python实现简单淘宝秒杀功能
May 03 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
使用Python实现画一个中国地图
Nov 23 Python
python 爬取小说并下载的示例
Dec 07 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下使用SMTP发邮件的代码
2008/01/10 PHP
用mysql内存表来代替php session的类
2009/02/01 PHP
discuz的php防止sql注入函数
2011/01/17 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
extjs form textfield的隐藏方法
2008/12/29 Javascript
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
Python中time模块和datetime模块的用法示例
2016/02/28 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
python__new__内置静态方法使用解析
2020/01/07 Python
纽约州一群才华横溢的金匠制作而成:Hearth Jewelry
2019/03/22 全球购物
上海期货面试题
2014/01/31 面试题
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
文秘大学生求职信
2014/02/25 职场文书
质量负责人岗位职责
2015/02/15 职场文书