使用moviepy进行音视频处理(超全面)

在这篇博客中,我们将探讨如何使用Python处理视频文件,包括读取视频参数、剪切视频片段、合并视频片段、裁剪视频以及调整视频大小等功能。这些功能可以广泛应用于视频编辑、视频处理等场景。

1. 视频参数获取

首先,我们定义了一个 video_parameters 函数,用于读取视频文件的一些基本信息,如视频时长、帧率和视频大小。这些信息可以在后续的视频处理中用到。

def video_parameters(video_path, is_print=False):video = VideoFileClip(video_path)if is_print==True:# 打印视频格式信息print(f"video_path: {video_path}")print(f"Duration: {video.duration} seconds")print(f"File fps: {video.fps} ")print(f"File size: {video.size} ")return video.duration, video.size

2. 视频片段剪切

接下来,我们实现了两个视频剪切函数 clip_videoclip_video2。这些函数可以从一个给定的视频文件中剪切出指定时间范围的视频片段,并保存到新的文件中。

def clip_video(file_path, start_time, end_time, output_path):# 从给定视频文件中剪切指定时间范围的片段video = VideoFileClip(file_path)clip = video.subclip(start_time, end_time)clip.write_videofile(output_path)clip.close()def clip_video2(file_path, timestamps, output_paths):# 从给定视频文件中剪切多个时间范围的片段for i, (start_time, end_time) in enumerate(timestamps):output_path = output_paths[i]video = VideoFileClip(file_path)clip = video.subclip(start_time, end_time)clip.write_videofile(output_path)clip.close()

3. 视频片段合并

merge_videos 函数可以将多个视频片段合并成一个视频文件,并为每个片段添加淡入淡出效果。这个功能在视频编辑中非常有用。

def merge_videos(video_paths, fade_duration, width, height, output_path):# 加载和处理每个视频片段clips = []for path in video_paths:clip = VideoFileClip(path).fadein(fade_duration).crossfadein(fade_duration)resized_clip = CompositeVideoClip([clip.set_position("center")], size=(width, height)).set_duration(clip.duration)clips.append(resized_clip)# 合并视频片段final_clip = concatenate_videoclips(clips)# 保存合并后的视频final_clip.write_videofile(output_path)final_clip.close()for clip in clips:clip.close()

4. 视频裁剪

crop_video 函数可以将视频按照指定的上下左右边界大小进行裁剪,并保存处理后的视频。这在需要调整视频画面大小的场景中非常有用。

def crop_video(video_path, output_path, top, bottom, left, right):# 加载视频clip = VideoFileClip(video_path)# 获取视频原始尺寸original_width, original_height = clip.size# 计算裁剪后的宽度和高度crop_width = original_width - left - rightcrop_height = original_height - top - bottom# 裁剪视频cropped_clip = clip.crop(x1=left, y1=top, x2=left + crop_width, y2=top + crop_height)# 保存处理后的视频cropped_clip.write_videofile(output_path)# 清理临时资源cropped_clip.close()clip.close()

5. 视频大小调整

最后,resize_video 函数提供了两种视频大小调整的方式:等比例缩放和固定尺寸缩放(会有黑边)。这在需要调整视频大小以适应不同设备或平台的场景中很有用。

def resize_video(video_path, type, width, height, output_path):# 加载视频clip = VideoFileClip(video_path)if type=="Proportional":# 调整视频尺寸为指定大小resized_clip = clip.resize(width=width, height=height)else:# 有黑边的放大/缩小resized_clip = CompositeVideoClip([ clip.set_position("center")], size=(width, height)).set_duration(clip.duration)resized_clip.write_videofile(output_path)resized_clip.close()clip.close()

在本篇博客中,我们将探讨如何使用 Python 来替换视频的背景音乐以及提取视频中的音频。这些功能都是利用了 Python 的 moviepy 库来实现的。

6. 替换视频背景音乐

change_bgm() 函数是用来实现替换视频背景音乐的功能。这个函数接受三个参数:

  1. video_path: 需要替换背景音乐的视频文件路径
  2. bgm_path: 新的背景音乐文件路径
  3. output_path: 保存替换背景音乐后的新视频文件路径

以下是函数的具体实现:

def change_bgm(video_path, bgm_path, output_path):print("=========change_bgm==========")print("video_path:", video_path)print("bgm_path:", bgm_path)print("output_path:", output_path)video = VideoFileClip(video_path)bgm = AudioFileClip(bgm_path)# 确保背景音乐与视频时长一致# bgm = bgm.set_duration(video.duration)while bgm.duration < video.duration:print('loop bgm')bgm = concatenate_audioclips([bgm, bgm])# 判断音频长度与输入参数的关系if bgm.duration >video.duration:bgm = bgm.subclip(0,video.duration)# 如果背景音乐时长不够,重复播放以填充整个视频时长print("=============================")# 合并视频的音频和背景音乐video = video.set_audio(bgm)# 保存带有更换背景音乐的视频video.write_videofile(output_path)# video.close()# bgm.close()

该函数的主要流程如下:

  1. 使用 VideoFileClipAudioFileClip 分别加载视频和背景音乐文件。
  2. 确保背景音乐的时长与视频时长一致。如果背景音乐时长小于视频时长,会循环播放背景音乐以填充整个视频时长。如果背景音乐时长大于视频时长,则会截取前部分与视频时长相匹配的部分。
  3. 将视频的原有音频替换为新的背景音乐,使用 set_audio() 方法实现。
  4. 最后使用 write_videofile() 方法保存带有新背景音乐的视频文件。

通过这个函数,我们可以轻松地替换视频的背景音乐,无论背景音乐的时长是否与视频时长一致。

7. 提取视频音频

extract_audio() 函数是用来提取视频中的音频的功能。这个函数接受两个参数:

  1. video_path: 需要提取音频的视频文件路径
  2. output_path: 保存提取出的音频文件路径

以下是函数的具体实现:

def extract_audio(video_path, output_path):"""提取视频中的音频,并根据指定的音频长度进行处理:param video_path: 视频文件路径:param output_path: 输出音频文件路径:param audio_length: 输入音频的长度"""print("=========extract_audio==========")print("video_path:", video_path)print("output_path:", output_path)print("===============================")video = VideoFileClip(video_path)audio = video.audio# 保存提取的音频文件audio.write_audiofile(output_path)video.close()audio.close()

该函数的主要流程如下:

  1. 使用 VideoFileClip 加载视频文件,并获取视频文件的音频部分。
  2. 使用 write_audiofile() 方法保存提取出的音频文件。
  3. 关闭视频和音频对象,释放资源。

通过这个函数,我们可以快速地从视频中提取出音频文件,在后续的音频处理中使用。

应用例子

  1. 剪裁视频示例:
crop_video("./video/test1.mp4", "./video/crop_video.mp4", 50, 100, 20, 20)
video_parameters("./video/test1.mp4",is_print=True)
video_parameters("./video/crop_video.mp4",is_print=True)

这段代码展示了如何从原始视频 test1.mp4 中剪裁出一个新的视频 crop_video.mp4。剪裁区域是距离左上角 (50, 100) 坐标,宽度和高度为 20 像素。video_parameters 函数用于打印原始视频和剪裁后视频的参数。

  1. 调整视频大小示例:
resize_video("./video/test1.mp4","Non-Proportional",1280,1280 ,"./video/resize_video.mp4")
video_parameters("./video/test1.mp4",is_print=True)
video_parameters("./video/resize_video.mp4",is_print=True)

这段代码展示了如何将原始视频 test1.mp4 调整为宽度和高度都为 1280 像素的新视频 resize_video.mp4。调整大小的方式是 “Non-Proportional”,即不保持原有的宽高比。

  1. 拼接视频示例:
video_paths = ["./video/test1.mp4", "./video/test3.mp4"]
merge_videos(video_paths, 0, 720,1280,"./video/merge_video.mp4")
video_paths = ["./video/test3.mp4", "./video/test2.mp4"]
merge_videos(video_paths, 0, 500,500,"./video/merge_video2.mp4")
video_parameters("./video/merge_video.mp4",is_print=True)
video_parameters("./video/merge_video2.mp4",is_print=True)

这段代码展示了如何将多个视频文件拼接成一个新的视频文件。第一个示例将 test1.mp4test3.mp4 拼接成 merge_video.mp4,宽度 1280 像素、高度 720 像素。第二个示例将 test3.mp4test2.mp4 拼接成 merge_video2.mp4,宽度和高度都为 500 像素。

  1. 剪辑视频示例:
clip_video("./video/test1.mp4",-1,4.20,"./video/output_video.mp4" )
video_parameters("./video/output_video.mp4",True)time_stamps = [(0, 2), (3, 5), (6, 15)]
output_paths = ["./video/clip_1.mp4", "./video/clip_2.mp4", "./video/clip_3.mp4"]
clip_video2("./video/test1.mp4", time_stamps, output_paths)

第一个示例展示了如何从视频 test1.mp4 中剪辑出一个新的视频 output_video.mp4,时长为 4.20 秒。第二个示例展示了如何根据时间戳列表 time_stampstest1.mp4 中剪辑出多个视频片段,并分别保存为 clip_1.mp4clip_2.mp4clip_3.mp4

  1. 替换背景音乐示例:
change_bgm("./video/test3.mp4","./video/test1.mp3","./video/changebgm.mp4")
extract_audio("./video/test1.mp4","./video/test1.mp3")

这段代码展示了如何将视频 test3.mp4 的背景音乐替换为 test1.mp3 音频,生成新的视频 changebgm.mp4。同时展示了如何从视频 test1.mp4 中提取出音频文件 test1.mp3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝商品详情API数据采集接口|如何快速采集淘宝商品数据?

如何快速采集淘宝商品数据 无论是谁&#xff0c;如果单凭人工的方式去收集淘宝、天猫等平台的商品数据信息&#xff0c;工作量是巨大的&#xff0c;如果借助有采集软件的第三方公司操作&#xff0c;则可实现对大数据的轻松掌握&#xff0c;但是外包给第三方公司需要支付一定的…

javaee初阶———多线程(三)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程专题第三篇,关于线程安全方面的内容 如果有不足的或者错误的请您指出! 目录 八、线程安全问题(重点)1.一个典型的线程不安全的例子2.出现线程不安全的原因3.解决线程不安…

每日一题:C语言经典例题之百文买百鸡

题目描述 公鸡五文钱一只&#xff0c;母鸡三文钱一只&#xff0c;小鸡一文钱三只&#xff0c;用m文钱买m只鸡&#xff0c;公鸡、母鸡、小鸡各买多少只&#xff1f; 输入 正整数m。 输出 只输出一个解&#xff0c;即公鸡数量最少的那个解&#xff08;输出公鸡、母鸡和小鸡的只数…

Frp多端口映射

使用AutoDL在内网搭建私有云&#xff0c;为了方便公网访问&#xff0c;需要将端口10000-11000进行内网穿透。 参考文档frp0.41使用说明 官方github仓库 1 Frp安装 见博客 frp安装及系统配置教程 建议为frp设置验证方式&#xff0c;具体做法见官方文档&#xff0c;若用toke…

Vultr服务器连接不上有哪些解决办法

近年来人们对vps主机的使用不断的呈上升的状态&#xff0c;很多人在选择国外vps主机的时候会选择Vultr美国主机商&#xff0c;因为他们的主 机性价比超高&#xff0c;同时在全球范围的数据中心也是比较多&#xff0c;我们知道服务器在使用中总会出现问题的&#xff0c;那么Vult…

对于普通人来说ChatGPT3.5和4.0的区别,要不要升级GPT4.0

ChatGPT3.5和4.0在官方给出的有哪些区别呢&#xff1f;简单罗列一下&#xff0c;我个人觉得官方给的都太高级&#xff0c;我们平时普通人很难问ChatGPT这种问题。 官方测试所涉及的能力&#xff1a; 视觉能力代码能力数学计算能力工具使用能力与人的交互能力人类专业考试的能…

Node.js从基础到高级运用】二十三、Node.js中自动重启服务器

引言 在Node.js开发过程中&#xff0c;我们经常需要修改代码后重启服务器来应用这些更改。手动重启不仅效率低下&#xff0c;而且会打断开发流程。幸运的是&#xff0c;有一些工具可以帮助我们自动化这个过程。本文将介绍如何使用nodemon来实现Node.js服务器的自动重启。 什么是…

AR智能眼镜方案_MTK平台安卓主板芯片|光学解决方案

AR眼镜作为一种引人注目的创新产品&#xff0c;其芯片、显示屏和光学方案是决定整机成本和性能的关键因素。在这篇文章中&#xff0c;我们将探讨AR眼镜的关键技术&#xff0c;并介绍一种高性能的AR眼镜方案&#xff0c;旨在为用户带来卓越的体验。 AR眼镜的芯片选型至关重要。一…

数据结构---绪论

一、绪论&#xff1a; 1.什么是数据&#xff1f; 数据是信息的载体&#xff0c;是描述客观事物属性的数&#xff0c;字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素--描述一个个体 数据元素&#xff0c;数据项&am…

React + 项目(从基础到实战) -- 第七期

使用ant design 表单组件,开发登录,注册,搜索功能 React 表单组件 ,受控组件 案列 使用defaultVlue属性 bug : 改变了数据源,但是页面未重新渲染 {/* 表单组件 */}<button onClick{()>{console.log(text);}}>打印</button><button onClick{()>[setText(&…

【质量管理】“从计划到部署:软件开发的全周期质量保证手册

在软件开发中&#xff0c;质量保证&#xff08;QA&#xff09;是一个贯穿整个开发生命周期的过程&#xff0c;而不仅仅是在开发结束后的一个阶段。确保软件质量涉及多个流程和实践&#xff0c;下面是在各个开发阶段中如何进行质量保证的策略&#xff1a; 1. 需求分析和规划阶段…

【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;C❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、Static成员 1、概念 2、特性 二、友元 1、友元函数 2、友元类 一、Static成员 1、概念 声…

【InternLM 实战营第二期笔记01】书生·浦语大模型全链路开源体系+InternLM2技术报告

本次课程链接在GitHub上&#xff1a;InternLM/Tutorial at camp2 (github.com) 第一次课程录播链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili InternLM2技术报告&#xff1a;arxiv.org/pdf/2403.17297.pdf 一、书生浦语大模型全链路开源体系笔记 Intern…

【读书笔记】自动驾驶与机器人中的SLAM技术——高翔

文章会对本书第五章节及以后章节进行总结概括。每日更新一部分。一起读书吧。 第五章——基础点云处理 重点&#xff1a;点云的相邻关系是许多算法的基础 5.1 激光雷达传感器与点云的数学模型 5.1.1激光雷达传感器的数学模型 雷达有两种&#xff1a;机械旋转式激光雷达&…

python 海龟画图tutle螺旋线

目录 初识turtle模块 基本绘图概念 示例&#xff1a;绘制一个正方形 示例&#xff1a;绘制彩色螺旋线 附录 常用命令 其它命令 在Python编程中&#xff0c;使用turtle模块进行图形绘制是一种非常有趣和富有教育意义的活动。通过控制一个小海龟&#xff08;Turtle&#x…

Spring Data 2021.2 (Raj)升级说明

Spring Data 2021.2 (Raj) Release Notes Spring Data Commons—2.7 1、 SimpleTypeInformationMapper中配置类加载器 SimpleTypeInformationMapper现在可以配置类加载器ClassLoader。确保在将类名转换为实际类对象的过程中&#xff0c;能够正确地使用到特定的类加载器。这样…

【产品经理修炼之道】- 厂商银业务之保兑仓

保兑仓 保兑仓是指供应商、购货商、银行签订三方协议&#xff0c;以银行信用为载体&#xff0c;以银行承兑汇票为结算工具&#xff0c;由银行控制货权&#xff0c;供应商受托保管货物并对银行承兑汇票保证金以外部分以货物回购为担保措施&#xff0c;购货商随缴保证金随提货而设…

《QT实用小工具·二十六》运行时间记录

1、概述 源码放在文章末尾 运行时间记录&#xff0c;包含如下功能&#xff1a; 可以启动和停止服务&#xff0c;在需要的时候启动。 可以指定日志文件存放目录。 可以指定时间日志输出间隔。 可以单独追加一条记录到日志文件。 日志为文本格式&#xff0c;清晰明了。 软…

mybatis 入门

MyBatis是一款持久层框架&#xff0c;免除了几乎所有的JDBC代码、参数及获取结果集工作。可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。 1 无框架下的JDBC操作 1&#xff09;加载驱动&#xff1a;Class.forName(“com.mysql.cj.jdbc.Driv…

AAAI24 - Model Reuse Tutorial

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 该篇 Tutorial 主要对 Model Reuse 当下的进展进行了整理和总结。 The Paradigm Shifts Tutorial 中指出在一些数据量比较…