用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中数据解析
May 05 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
Python异常模块traceback用法实例分析
Oct 22 Python
python标准库os库的函数介绍
Feb 12 Python
python ffmpeg任意提取视频帧的方法
Feb 21 Python
Python实现井字棋小游戏
Mar 09 Python
python中plt.imshow与cv2.imshow显示颜色问题
Jul 16 Python
浅谈anaconda python 版本对应关系
Oct 07 Python
Python图像处理之图像拼接
Apr 28 Python
Python TypeError: ‘float‘ object is not subscriptable错误解决
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可变函数学习小结
2015/11/29 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python学习资料
2007/02/08 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
医院护士求职自荐信格式
2013/09/21 职场文书
车间操作工岗位职责
2013/12/19 职场文书
市场营销管理制度
2014/01/29 职场文书
园艺师求职信
2014/04/27 职场文书
售后服务承诺书模板
2014/05/21 职场文书
实现中国梦思想汇报2014
2014/09/13 职场文书
护士医德医风自我评价
2014/09/15 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python