使用Python和MoviePy库实现视频拼接与合成的技巧与实践

首先,我们需要导入所需的库:

 
from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip, CompositeVideoClip, ColorClip
import os
import random
from typing import List
from enum import Enum

接下来,我们定义了两个枚举类,分别表示视频的长宽比例和视频拼接模式:

 
class VideoAspect(Enum):portrait = 1landscape = 2def to_resolution(self):if self == VideoAspect.portrait:return 1080, 1920elif self == VideoAspect.landscape:return 1920, 1080class VideoConcatMode(Enum):sequential = 1random = 2

然后,我们定义了一个名为combine_videos的函数,该函数接受以下参数:

  • combined_video_path:合成视频的输出路径。
  • video_paths:一个包含待拼接视频路径的列表。
  • audio_file:背景音乐文件的路径。
  • video_aspect:视频的长宽比例,默认为VideoAspect.portrait
  • video_concat_mode:视频拼接模式,默认为VideoConcatMode.random
  • max_clip_duration:每个视频片段的最大时长,默认为5秒。
  • threads:写入视频文件时使用的线程数,默认为2。

函数的主要逻辑如下:

  1. 加载音频文件并获取其时长。
  2. 计算每个视频片段的所需时长。
  3. 获取输出目录。
  4. 获取视频的分辨率。
  5. 循环添加视频片段直到达到音频的最大时长。
  6. 根据视频拼接模式决定视频片段的顺序。
  7. 遍历video_paths列表,对每个视频片段进行处理。
  8. 如果视频片段长于剩余的音频时长,则进行裁剪。
  9. 如果计算出的片段长度小于实际视频片段长度,则进行裁剪。
  10. 调整视频片段的大小以匹配目标分辨率。
  11. 如果视频片段的时长超过最大限制,则进行裁剪。
  12. 将处理后的视频片段添加到clips列表中。
  13. 合并所有视频片段。
  14. 将合成的视频写入文件。

最后,我们给出了一个示例,展示了如何使用这个函数来拼接视频:

 
combined_video_path = "output/combined_video.mp4"
video_paths = ["input/video1.mp4", "input/video2.mp4", "input/video3.mp4"]
audio_file = "input/audio.mp3"result = combine_videos(combined_video_path, video_paths, audio_file)
print(f"视频合成完成!输出文件路径: {result}")

完整代码如下:

from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip, CompositeVideoClip, ColorClip
import os
import random
from typing import List
from enum import Enum# 定义视频的长宽比例
class VideoAspect(Enum):portrait = 1landscape = 2def to_resolution(self):if self == VideoAspect.portrait:return 1080, 1920elif self == VideoAspect.landscape:return 1920, 1080# 定义视频拼接模式
class VideoConcatMode(Enum):sequential = 1random = 2# 视频合成函数
def combine_videos(combined_video_path: str,video_paths: List[str],audio_file: str,video_aspect: VideoAspect = VideoAspect.portrait,video_concat_mode: VideoConcatMode = VideoConcatMode.random,max_clip_duration: int = 5,threads: int = 2) -> str:# 加载音频文件并获取其时长audio_clip = AudioFileClip(audio_file)audio_duration = audio_clip.durationprint(f"音频最大时长: {audio_duration} 秒")# 计算每个视频片段的所需时长req_dur = min(max_clip_duration, audio_duration / len(video_paths))print(f"每个片段的最大时长: {req_dur} 秒")# 获取输出目录output_dir = os.path.dirname(combined_video_path)# 获取视频的分辨率aspect = VideoAspect(video_aspect)video_width, video_height = aspect.to_resolution()clips = []video_duration = 0# 循环添加视频片段直到达到音频的最大时长while video_duration < audio_duration:# 根据视频拼接模式决定视频片段的顺序if video_concat_mode == VideoConcatMode.random:random.shuffle(video_paths)for video_path in video_paths:clip = VideoFileClip(video_path).without_audio()# 如果视频片段长于剩余的音频时长,则进行裁剪if (audio_duration - video_duration) < clip.duration:clip = clip.subclip(0, (audio_duration - video_duration))# 如果计算出的片段长度小于实际视频片段长度,则进行裁剪elif req_dur < clip.duration:clip = clip.subclip(0, req_dur)clip = clip.set_fps(30)# 调整视频片段的大小以匹配目标分辨率clip_w, clip_h = clip.sizeif clip_w != video_width or clip_h != video_height:clip_ratio = clip_w / clip_hvideo_ratio = video_width / video_height# 等比例缩放视频片段scale_factor = video_width / clip_w if clip_ratio > video_ratio else video_height / clip_hnew_width = int(clip_w * scale_factor)new_height = int(clip_h * scale_factor)clip_resized = clip.resize(newsize=(new_width, new_height))# 创建黑色背景以填充不匹配的部分background = ColorClip(size=(video_width, video_height), color=(0, 0, 0))clip = CompositeVideoClip([background.set_duration(clip.duration),clip_resized.set_position("center")])# 如果视频片段的时长超过最大限制,则进行裁剪if clip.duration > max_clip_duration:clip = clip.subclip(0, max_clip_duration)clips.append(clip)video_duration += clip.duration# 合并所有视频片段video_clip = concatenate_videoclips(clips)video_clip = video_clip.set_fps(30)print("正在写入视频文件...")# 将合成的视频写入文件video_clip.write_videofile(filename=combined_video_path,threads=threads,logger=None,temp_audiofile_path=output_dir,audio_codec="aac",fps=30)video_clip.close()print("视频合成完成!")return combined_video_path


【痕迹】QQ+微信朋友圈和聊天记录分析工具1.0.4
(1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。

(2)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。

  • 想不想知道经常和你聊天的那个人,聊天的频次,时段,内容云图?
  • 想不想知道你都在什么时候发朋友圈,都有谁给你点赞、评论?
  • 想不想知道哪一天的聊天频次最多,并把聊天记录甩给大模型,让它总结?


下载地址:https://www.lanzoub.com/b00rn0g47e 密码:9hww
 

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

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

相关文章

Git如何查看有多少个分支、创建分支、切换分支

2024年5月9日&#xff0c;周四上午 在 Git 中&#xff0c;新建一个分支是非常简单的。以下是如何操作的步骤&#xff1a; 查看现有分支&#xff1a;git branch这个命令会列出当前仓库中的所有本地分支。创建新分支&#xff1a;git branch <new-branch-name>这个命令会创…

[法规规划|数据概念]金融行业数据资产和安全管理系列文件解析(3)

“ 金融行业在自身数据治理和资产化建设方面一直走在前列。” 一直以来&#xff0c;金融行业由于其自身需要&#xff0c;都是国内开展信息化建设最早&#xff0c;信息化程度最高的行业。 在当今数据要素资产化的浪潮下&#xff0c;除了行业自身自身数据治理和资产化建设方面&am…

EditReady for Mac激活版:专业视频转码工具

对于视频专业人员来说&#xff0c;一款高效的视频转码工具是不可或缺的。EditReady for Mac正是这样一款强大的工具&#xff0c;它拥有简洁直观的操作界面和强大的功能&#xff0c;让您的视频处理工作事半功倍。 EditReady for Mac支持多种视频格式的转码&#xff0c;并且支持常…

【AIGC调研系列】红帽的RHEL AI能够做什么

红帽的RHEL AI&#xff08;Red Hat Enterprise Linux AI&#xff09;是一个基于开源项目InstructLab和IBM Research提供的Granite大型语言模型的基础模型平台。它旨在无缝开发、测试和运行生成式AI模型&#xff0c;以支持企业应用程序[1][2][5]。 具体来说&#xff0c;RHEL AI…

Java护照识别接口开发示例、文字识别、证件识别

护照是我们出国旅行时所必要的证件之一&#xff0c;他是我国公民去外国的旅行和工作的时候所代表的一个合法的身份证件。 在护照上面也有不少关于我们个人身份的信息&#xff0c;而手动去录入如此多的身份信息这绝对是灾难。不仅证件&#xff0c;有的场景还需要录入很多文字信息…

React 之 记忆化函数cache(十四)

const result cache&#xff08;fn&#xff09;方法&#xff1a; fn&#xff1a;要对其结果进行缓存的函数。fn 可以接受任何参数并返回任何值。 返回值result : 返回一个与 fn 具有相同类型签名的已缓存版本。在此过程中&#xff0c;它不会调用 fn。 cache 用法 import {cac…

【Java】初识网络编程

文章目录 前言✍一、互联网的发展1.独立模式2.网络的出现局域网LAN广域网WAN ✍二、网络编程概述✍三、网络编程中的术语介绍IP地址端口号协议OSI七层模型TCP\IP四层模型 ✍四、协议的层级之间是如何配合工作的 前言 在本文中&#xff0c;会对网络编程的一些术语进行解释&#…

动态规划——路径问题:931.下降路径最小和

文章目录 题目描述算法原理1.状态表示&#xff08;经验题目&#xff09;2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接&#xff1a;931.下降路径最小和 关于这⼀类题&#xff0c;看过我之前的博客的朋友对于状态表示以及状态转移是⽐较容易分析…

5分钟了解下HDFS

随着大数据时代的到来&#xff0c;传统的数据存储和管理方式已经无法满足日益增长的数据处理需求。HDFS&#xff08;Hadoop Distributed File System&#xff09;作为Apache Hadoop项目的一部分&#xff0c;以其高度的容错性、可扩展性和高吞吐量&#xff0c;成为了处理大规模数…

抖音APP运用的AI技术拆解

1.推荐系统&#xff08;RS&#xff09; 用户画像&#xff1a;根据用户的信息&#xff08;如地区、性别、年龄、收藏、关注......&#xff09;进行分析&#xff0c;构建用户画像&#xff0c;对用户进行分类&#xff1b; 行为分析&#xff1a;将用户的显形行为数据&#xff08;如…

搜维尔科技:OptiTrack是基于LED墙虚拟制作舞台的最佳选择

OptiTrack因其绝对精度、易用性、可靠性以及与现场工具的完美集成而被选中&#xff0c;仍然是全球首屈一指的基于 LED 墙的虚拟制作舞台的选择。 当今虚拟制作阶段的低延迟、超精确摄像机跟踪标准 /- 0.2 毫米 位置精度1 < 10 毫秒 系统延迟 /- 0.1 度 旋转精度2 电影…

Linux 操作系统网络编程1

目录 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型 1.1.2 网络数据传输过程 2 传输层通信协议 2.1 TCP 2.1.1 TCP的3次握手过程 2.1.2 TCP四次挥手过程 2.2 UDP 3 网络编程的IP地址 4 端口 5 套接字 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型…

vue根据文字动态判断溢出...鼠标悬停显示el-tooltip展示

使用自定义el- tooltip 组件 定义 Tooltip是一种小型弹出框&#xff0c;它显示有关特定页面元素的信息&#xff0c;例如按钮、链接或图标。Tooltip通常以半透明的气泡形式呈现&#xff0c;并出现在页面元素的旁边或下方。 它可以改善用户体验&#xff0c;使用户更容易理解页面…

Linux cmake 初窥【3】

1.开发背景 基于上一篇的基础上&#xff0c;已经实现了多个源文件路径调用&#xff0c;但是没有库的实现 2.开发需求 基于 cmake 的动态库和静态库的调用 3.开发环境 ubuntu 20.04 cmake-3.23.1 4.实现步骤 4.1 准备源码文件 基于上个试验的基础上&#xff0c;增加了动态库…

优思学院|精益六西格玛黑带培训的内容有哪些?【附思维导图】

引言 在现代企业中&#xff0c;精益六西格玛黑带&#xff08;或称六西格玛黑带&#xff09;处于实施六西格玛方法的最前线。然而&#xff0c;他们的职责远不止执行者的角色。黑带既学习六西格玛的工具&#xff0c;又主导项目以改进绩效指标。在更长远的角度看&#xff0c;他们…

擎天科技与禅道合作,打造统一的项目管理平台

统一、全面的项目管理平台能够帮助企业优化管理流程&#xff0c;提升业务效率。擎天集团选择与禅道软件合作&#xff0c;打造统一的项目管理平台&#xff0c;在降低自研软件的研发成本、打破团队信息孤岛、保障数据全面性等方面效果显著&#xff0c;大大提高了团队沟通协作效率…

程序设计:C++11原子 写优先的读写锁(源码详解)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 github位置&#xff1a;codeto…

25852-47-5,MAc-PEG-MAc通常作为高分子材料的交联剂,以提高材料的力学性能和稳定性

【试剂详情】 英文名称 Methacrylate-PEG-Methacrylate&#xff0c;MAc-PEG-MAc 中文名称 甲基丙烯酸酯-聚乙二醇-甲基丙烯酸酯 CAS号 25852-47-5 外观性状 由分子量决定&#xff0c;固体或者液体。 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k&#xf…

信阳电力乙级资质企业的风险管理与应对措施

信阳电力乙级资质企业在面对项目管理中的风险时&#xff0c;需要建立一套完善的风险管理与应对措施体系&#xff0c;以确保项目的顺利进行和企业的稳定发展。以下是一些建议&#xff1a; 一、风险识别与评估 风险识别&#xff1a; 对项目全过程进行风险识别&#xff0c;包括技术…

大宋咨询(深圳神秘顾客调查)开展某景区神秘顾客检查

旅游景区神秘顾客检查是一种有效的服务质量监控方式。为了解景区服务质量、提升景区旅游品牌形象&#xff0c;大宋咨询&#xff08;深圳神秘顾客调查&#xff09;受某景区客户委托开展旅游景点神秘人检查。 大宋咨询&#xff08;深圳神秘顾客调查&#xff09;根据星级景区等级…