用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 17 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 Python
python实现简单聊天应用 python群聊和点对点均实现
Sep 14 Python
numpy使用技巧之数组过滤实例代码
Feb 03 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
Python实现的根据文件名查找数据文件功能示例
May 02 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
Django实现发送邮件找回密码功能
Aug 12 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
python自动脚本的pyautogui入门学习
Apr 01 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
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
php目录遍历函数opendir用法实例
2014/11/20 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
jQuery实现本地存储
2020/12/22 jQuery
python计算书页码的统计数字问题实例
2014/09/26 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
python对离散变量的one-hot编码方法
2018/07/11 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
把pandas转换int型为str型的方法
2019/01/29 Python
python web框架中实现原生分页
2019/09/08 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
J2EE系统只能是基于web
2015/09/08 面试题
机械系大学毕业生推荐信
2013/11/27 职场文书
幼儿园教师工作制度
2014/01/22 职场文书
2014年政协工作总结
2014/12/09 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
安全温馨提示语大全
2015/07/14 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
Javascript中async与await的捕捉错误详解
2022/03/03 Javascript
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server