用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 代码优化详解
Oct 27 Python
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
python使用mysql的两种使用方式
Mar 07 Python
Python中的单继承与多继承实例分析
May 10 Python
Python3标准库总结
Feb 19 Python
python 计算积分图和haar特征的实例代码
Nov 20 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
Python Http请求json解析库用法解析
Nov 28 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
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
JS中 用户登录系统的解决办法
2013/04/15 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
js打造数组转json函数
2015/01/14 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
js实现文字滚动效果
2016/03/03 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
在漏洞利用Python代码真的很爽
2007/08/26 Python
python实现多进程通信实例分析
2019/09/01 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
python 异步async库的使用说明
2020/05/04 Python
python能在浏览器能运行吗
2020/06/17 Python
Flask处理Web表单的实现方法
2021/01/31 Python
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
行政部主管岗位职责
2013/12/28 职场文书
给护士表扬信
2014/01/19 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers