用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用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
详解Python正则表达式re模块
Mar 19 Python
python实现QQ空间自动点赞功能
Apr 09 Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
python DataFrame转dict字典过程详解
Dec 26 Python
浅析Python __name__ 是什么
Jul 07 Python
python实现局部图像放大
Nov 17 Python
python如何利用cv2.rectangle()绘制矩形框
Dec 24 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 HandlerSocket的使用
2011/05/02 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
vue ssr 指南详读
2018/06/29 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
python使用psutil模块获取系统状态
2016/08/27 Python
python函数的作用域及关键字详解
2019/08/20 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
Exception类的常用方法
2012/06/16 面试题
人力资源管理专业应届生求职信
2013/09/28 职场文书
自主招生自荐信范文
2013/12/04 职场文书
社团文化节邀请函
2014/01/10 职场文书
办理信用卡工作证明
2014/01/11 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
护士自我鉴定总结
2014/03/24 职场文书
留学生求职信
2014/06/03 职场文书
酒后驾车标语
2014/06/30 职场文书
个人工作表现评价材料
2014/09/21 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
个人求职意向书
2015/05/11 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技