Python---批量给视频添加片头片尾

news/2025/10/24 16:08:44/文章来源:https://www.cnblogs.com/e0yu/p/19163613

在剪辑视频的时候,如果视频很少的情况可以考虑自己使用软件来拼接一下,但是如果要给几百个视频加片头片尾,那就需要使用软件来加了。

基础代码示例:

from moviepy.editor import VideoFileClip, concatenate_videoclips# 读取三段视频
piantou = VideoFileClip("piantou-10000k-25f.mp4")
video = VideoFileClip("video.mp4")
pianwei = VideoFileClip("pianwei-10000k-25f.mp4")
# 拼接并导出
outvideo = concatenate_videoclips([piantou, video, pianwei])
outvideo.write_videofile("outvideo.mp4")

这种方式可以给一个视频添加片头片尾。

批量给视频视频添加片头片尾:

import os
import re
import time
import subprocess
from multiprocessing import Pool
from typing import List, Dict# 配置路径
INPUT_VIDEO_DIR = r"E:\python-test\视频处理\原视频"  # 原视频文件夹
OUTPUT_VIDEO_DIR = r"E:\python-test\视频处理\带片头片尾视频"  # 输出文件夹
OPENING_VIDEO = r"E:\python-test\视频处理\piantou-tongyi.mp4"  # 片头视频路径
ENDING_VIDEO = r"E:\python-test\视频处理\pianwei-tongyi.mp4"  # 片尾视频路径# 支持的视频格式(可扩展)
SUPPORTED_FORMATS = ('.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv')def check_dependencies() -> bool:"""检查ffmpeg是否可用及片头片尾文件是否存在"""# 检查ffmpegtry:subprocess.run(['ffmpeg', '-version'], capture_output=True, check=True)except (subprocess.CalledProcessError, FileNotFoundError):print("错误:未找到ffmpeg!请安装并配置环境变量")return False# 检查片头文件if not os.path.exists(OPENING_VIDEO):print(f"错误:片头文件不存在 - {OPENING_VIDEO}")return False# 检查片尾文件if not os.path.exists(ENDING_VIDEO):print(f"错误:片尾文件不存在 - {ENDING_VIDEO}")return Falsereturn Truedef get_video_duration(file_path: str) -> float:"""获取视频时长(秒)"""try:result = subprocess.run(['ffmpeg', '-i', file_path],stdout=subprocess.PIPE,stderr=subprocess.STDOUT,encoding='utf-8',errors='ignore')# 匹配时长格式(如:Duration: 00:01:23.45)pattern = re.compile(r"Duration:\s*(\d+):(\d+):(\d+\.\d+)")match = pattern.search(result.stdout)if not match:return -1hours = float(match.group(1))minutes = float(match.group(2))seconds = float(match.group(3))return hours * 3600 + minutes * 60 + secondsexcept Exception as e:print(f"获取时长失败:{file_path},错误:{str(e)}")return -1def concat_videos(opening: str, main_video: str, ending: str, output: str) -> bool:"""拼接片头、主视频、片尾"""# 确保输出目录存在os.makedirs(os.path.dirname(output), exist_ok=True)# 创建临时文件列表(ffmpeg拼接需要的文件列表)temp_list = f"{output}.txt"try:with open(temp_list, 'w', encoding='utf-8') as f:f.write(f"file '{opening}'\n")f.write(f"file '{main_video}'\n")f.write(f"file '{ending}'\n")# ffmpeg命令:使用concat协议拼接(快速,无需重新编码)command = ['ffmpeg', '-f', 'concat', '-safe', '0', '-i', temp_list,'-c', 'copy', '-y',  # -y:覆盖已有文件
            output]result = subprocess.run(command,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,encoding='utf-8',errors='ignore',timeout=600  # 超时时间10分钟
        )if result.returncode != 0:print(f"拼接失败:{main_video},错误:{result.stderr[:500]}")return Falseprint(f"拼接成功:{output}")return Trueexcept Exception as e:print(f"拼接异常:{main_video},错误:{str(e)}")return Falsefinally:# 清理临时文件if os.path.exists(temp_list):try:os.remove(temp_list)except:passdef process_single_video(task: Dict[str, str]) -> None:"""处理单个视频的函数(供多进程调用)"""main_video = task['main_video']output_video = task['output_video']# 检查原视频是否有效duration = get_video_duration(main_video)if duration <= 0:print(f"跳过无效视频:{main_video}")return# 执行拼接
    concat_videos(opening=OPENING_VIDEO,main_video=main_video,ending=ENDING_VIDEO,output=output_video)def get_all_videos(folder: str) -> List[str]:"""递归获取所有支持的视频文件"""video_files = []for root, _, files in os.walk(folder):for file in files:if file.lower().endswith(SUPPORTED_FORMATS):video_files.append(os.path.join(root, file))return video_filesif __name__ == "__main__":# 检查依赖if not check_dependencies():input("按回车键退出...")exit(1)# 获取所有视频文件video_files = get_all_videos(INPUT_VIDEO_DIR)if not video_files:print(f"未在 {INPUT_VIDEO_DIR} 找到支持的视频文件(格式:{SUPPORTED_FORMATS})")input("按回车键退出...")exit(0)print(f"共找到 {len(video_files)} 个视频文件,准备添加片头片尾...")# 构建任务列表(保持原文件目录结构)tasks = []for video in video_files:# 计算输出路径(保持原目录结构)relative_path = os.path.relpath(video, INPUT_VIDEO_DIR)output_path = os.path.join(OUTPUT_VIDEO_DIR, relative_path)tasks.append({'main_video': video,'output_video': output_path})# 多进程处理start_time = time.time()print("\n开始处理...")# 进程数设为CPU核心数的一半,避免资源占用过高with Pool(processes=os.cpu_count() // 2) as pool:pool.map(process_single_video, tasks)# 统计结果total_time = time.time() - start_timeprint(f"\n处理完成!共处理 {len(video_files)} 个视频,耗时 {total_time:.2f} 秒")print(f"输出目录:{OUTPUT_VIDEO_DIR}")input("按回车键退出...")

简直了YYDS!

打完收工!

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

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

相关文章

上海AI优化:AI优化公司技术革新与行业标杆解析

上海AI优化企业新势力:解码智能流量时代的制胜密码 AI优化企业技术革新与行业标杆解析 AI优化企业如何重构搜索生态竞争格局 一、AI优化企业排行榜:技术驱动下的头部阵营 在AI重构搜索生态的2025年,上海及周边地区的…

2025 年隔离变压器厂家最新推荐榜:结合中国电力设备行业协会测评权威数据,精选实力企业深度解析船用/三相伺/医疗专用隔离变压器公司推荐

引言 在工业生产、新能源、医疗设备等领域,隔离变压器对保障电力系统稳定、规避电气干扰至关重要,市场需求逐年攀升。但行业内厂家良莠不齐,产品质量与定制能力差异显著。据中国电力设备行业协会 2025 年最新测评数…

ContextCapture无人机影像与激光点云融合建模感受

1.一直对空地融合和无人机与激光点云融合抱有很大的期待,限于没有很好的激光点云设备,一直没有实验看看结果如何。 最近入手了一台RS10,终于有高精度带地理坐标的激光点云数据了,然后就实验了一下。 2.首先遇到的一…

MongoDB 与其他数据库(如 Redis、Elasticsearch、PostgreSQL)对比

-----------------------------------------------------------------------------------------看起来你想了解 MongoDB 和其他数据库的对比,但未明确具体对比对象。我先帮你梳理 MongoDB 的核心特性,并默认对比最常…

一行命令让你修改博客上的粉丝数

在日常浏览网页时,你是否曾想过直接修改页面上的文字、调整排版,甚至临时编辑内容用于演示或截图?其实无需复杂的开发工具,只需一行简单的 JavaScript 命令,就能让任意网页瞬间变成可编辑状态 —— 这就是documen…

数据库分类详解

数据库主要分为关系型、时序型、NoSQL型三大类。关系型数据库(如MySQL)采用二维表结构,支持SQL和ACID事务,适合业务系统核心数据。时序数据库(如InfluxDB)专为时间序列数据优化,适用于监控和IoT场景。NoSQL数据…

2025年护栏厂家权威推荐榜单:不锈钢栏杆/桥梁防撞护栏/河道景观护栏,专业设计与安全防护全解析

2025年护栏厂家权威推荐榜单:不锈钢栏杆/桥梁防撞护栏/河道景观护栏,专业设计与安全防护全解析 护栏作为基础设施和建筑工程中不可或缺的安全防护设施,在城市化进程和基础设施建设中发挥着日益重要的作用。随着现代…

2025年发电机厂家推荐排行榜,发电机组出租,柴油发电机出租,甲醇发电机组租赁,移动式发电机出租,发电机组维修保养,专业可靠之选

2025年发电机厂家推荐排行榜:发电机组出租、柴油发电机出租、甲醇发电机组租赁、移动式发电机出租、发电机组维修保养专业可靠之选 行业背景与发展趋势 随着我国基础设施建设的持续推进和能源结构的优化调整,发电设备…

执行计划解释

执行计划解释 MySQL执行计划中的type和extra列是分析查询性能的关键指标: type列解析type列表示MySQL访问表数据的方式,按效率从高到低排序如下:‌system‌:表仅一行数据(系统表特例) ‌const‌:通过主键或唯一…

MATLAB中的Excel文件操作:从入门到精通 - 指南

MATLAB中的Excel文件操作:从入门到精通 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

2025 年保护罩生产厂家最新推荐榜:技术与服务双重测评,精选优质品牌权威指南PVC 法兰保护罩/不锈钢法兰保护罩/设备保护罩公司推荐

工业保护罩作为设备安全防护的核心部件,其性能直接关系到化工、石油等行业的生产安全与运营成本。为破解企业选型难题,本次榜单联合中国工业防护装备协会开展专项测评,基于 GB/T 标准及 ASTM 规范,对 126 家企业进…

Flannel 为 Kubernetes 集群中的容器提供了多种网络通信模式

Flannel 为 Kubernetes 集群中的容器主要提供了三种网络通信模式:VXLAN、host-gw 以及 UDP 。它们在工作原理和性能上有所不同,你可以根据实际的网络环境和需求进行选择。 下面这个表格整理了这三种核心模式的关键信…

linux 查看防火墙放开的端口

目录1. 使用 firewalld(推荐用于 CentOS/RHEL/Fedora)2. 使用 ufw(Ubuntu 系统常见)3. 使用 iptables(传统工具,或底层驱动)4. 使用 netstat 或 ss 查看正在监听的端口(系统级)总结在 Linux 系统中,查看防火…

在nginx中通过多级代理支持grpc协议

本文分享自天翼云开发者社区《在nginx中通过多级代理支持grpc协议》.作者:尹****聪 gRPC 是由 Google 开源的一个 RPC 框架,旨在统一服务间通信的方式。该框架基于 HTTP/2 协议传输,使用 Protocol Buffers 作为接口…

Python---批量去视频的片头和片尾

在需要对视频进行批量处理的时候,常见的就是批量去视频的片头和片尾: 具体代码示例:import os import re import time import subprocess from decimal import Decimal from multiprocessing import Poolpath = rE:…

Linux下的拼音输入法 (1)

我用的是Debian 12 KDE. 国内互联网厂的拼音输入法装了都不能用:可以理解,这哪有做游戏等挣钱啊。 用了半年的sunpinyin,会用程序往用户词典里加词 (在系列2里贴代码)。 今天折腾了一通输入法,把KDE搞坏了,Ctrl…

Docker镜像与容器:轻松理解与实战 - 实践

Docker镜像与容器:轻松理解与实战 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

从数据孤岛到智能洞察:构建面向未来的 Operation intelligence 体系

在数字世界持续运转的过程中,系统每时每刻都在产生海量的数据。我们把这些数据统称为 Operation Data(运营数据)。它不仅记录着系统的运行状态,更蕴藏着驱动业务增长、保障系统稳定、防范安全风险的关键线索。更重…

2025年低合金钢铸件厂家权威推荐榜单:水泵类铸件/矿山机械铸件/阀门类铸件源头厂家精选。

在竞争激烈的制造业中,一家位于镇江、深耕行业二十余年的铸钢企业,以每年超8000吨的产量和远销海外的实力,正赢得全球工业客户的广泛认可。 在当今制造业蓬勃发展的时代,低合金钢铸件因其优异的机械性能和成本效益…

oracle sql格式化

1、实用的 SQL*Plus 格式化脚本-- format.sql - SQL*Plus 格式化脚本 SET ECHO OFF SET FEEDBACK ON SET VERIFY OFF SET HEADING ON SET PAGESIZE 50 SET LINESIZE 200 SET TRIMSPOOL ON SET TAB OFF SET NULL "…