python调用ffmpeg对截取视频片段,可批量处理

news/2025/11/8 16:02:32/文章来源:https://www.cnblogs.com/bos-/p/19202515

python调用ffmpeg对截取视频片段,可批量处理

本文完全免费,非VIP文章,如果您发现需VIP可看全文,请邮箱联系我:openwebsite@foxmail.com

@

目录
  • python调用ffmpeg对截取视频片段,可批量处理
    • 用到的ffmpeg命令
    • python调用bash指令的方法
    • python处理代码
      • 准备函数
      • python批量处理
      • 特殊情况处理
        • 可选操作:填补csv数据
        • python根据csv数据裁剪视频
      • 视频具有多个片段的处理 [TODO]

python调用ffmpeg对截取视频片段,可批量处理

背景:我本地下载了一些番剧,但是片头片尾无用还占空间,因此决定使用ffmpeg对视频切割,只保留中间的正片内容。

用到的ffmpeg命令

ffmpeg中文文档:https://ffmpeg.github.net.cn/ffmpeg.html

由于csdn点击链接会跳转到安全确认页面,因此选择直接给出链接文本,在edge浏览器中,可以选中链接文本并拖动到标签页区域,直接打开文档,更方便。

先说用到的ffmpeg命令,你可以自行在cmd窗口中执行以处理单个视频。

  1. 获取视频时长:ffprobe -show_entries format=duration -v error -select_streams v:0 <视频路径>
    示例输出:
[FORMAT]
duration=1200.981333
[/FORMAT]
  1. ffmpeg -threads 4 -i <视频路径> -ss <开始时间点> -t <持续时间(s)> -c copy -y <输出路径>
    • -threads 4:多线程,感觉作用不是很大
    • <开始时间点>:格式可以为hh:mm:ss,也可以为具体的视频第几秒
    • <持续时间(s)>:从指定的开始时间点往后截取多少秒,不是结束时间点
    • -c copy:音视频都直接复制,不重新编码,速度快
    • -y:如果指定的输出文件已经存在,则覆盖
    • 注意:如果输出路径在其他文件夹内,则必须提前创建好文件夹,比如输出文件为./trimed_video/video.mp4,则需要提前创建好trimed_video文件夹,否则报错

python调用bash指令的方法

使用subprocess包,详细信息可以自己查,简单用法如下:

import subprocesscommand = "ffprobe -show_entries format=duration -v error -select_streams v:0 video.mp4"
result = subprocess.run(command, check=True,capture_output=True,text=True)
print(result.stdout) # 获取命令执行后的输出数据

参数说明:

  • command:要执行的命令字符串,可以通过字符串操作来拼接需要的命令
  • check=True:如果进程退出码不为0,则抛出异常subprocess.CalledProcessError,可以通过try-catch进行错误处理
  • capture_output=True:捕获标准输出或标准错误,获取命令执行的输出信息
  • text=True:默认标准输出为字节类型,这个可以改为字符串类型,方便字符串解析

python处理代码

注意,我所有代码都没考虑时长超过1小时的视频,如果需要操作1小时以上的视频,请自行修改相关代码

准备函数

由于这两个函数可能在多个文件中使用,因此单独创建了一个文件,其他文件需要调用时通过import myfunc即可

"""myfunc.py"""
import os,re
from pathlib import Path
def match_files(dir,extension,content_range=[], not_content_range=[]):"""在指定目录下找符合扩展名的文件,不递归用法示例:match_files("./",[".mp4", ".mkv"],range(74,80+1))extension:需要的扩展名,字符串列表content_range:包含的范围,为空则不限制,整数列表not_content_range:不包含的范围,整数列表"""matchs = []files = [f for f in os.listdir(dir) if os.path.isfile(f)]for f in files:if Path(f).suffix in extension: # 检查文件扩展名是否在指定的扩展名列表中# 提取文件名中的第一个数字序列作为编号number = int(re.findall(r'\d+',f)[0])if content_range:# 判断是否指定了包含范围,如果指定则判断是否在范围内if number in content_range  and number not in not_content_range :matchs.append(f)else: # 如果不指定范围,则匹配所有if number not in not_content_range :matchs.append(f)return matchsdef time_to_seconds(time_str):"""将时间字符串转换为秒,格式mm:ss"""minutes, seconds = map(int, time_str.split(':'))return  minutes * 60 + seconds

python批量处理

import myfunc
import subprocess
import re
"""
注意写好路径,扩展名,以及需要处理的序号范围,排除的序号范围
"""
videos = myfunc.match_files("./",[".mp4", ".mkv"],[140])
start_time_point = "02:35"
end_time_point = "17:42"
for video in videos:# 如果文件名有空格,需要加引号command1 = "ffprobe -show_entries format=duration -v error -select_streams v:0 \""+video+"\""try:# 先获取视频时长result = subprocess.run(command1, check=True,capture_output=True,text=True)duration = round(float(re.search(r"duration=([\d.]+)",result.stdout).group(1)))"""注意修改command2的参数,00默认小时为00,即不考虑时长超过1小时的情况,按需修改"\"./trimed_video/"+video+"\""是输出视频路径需要根据自己的视频情况修改"""command2 = "ffmpeg -threads 4 -i "+"\""+ video +"\""+ " -ss 00:" + start_time_point + " -t "+str(myfunc.time_to_seconds(end_time_point)-myfunc.time_to_seconds(start_time_point)) +" -c copy -y "+"\"./trimed_video/"+video+"\""try:# 运行FFmpeg命令subprocess.run(command2, check=True,capture_output=True)print(f"视频已成功裁剪到 {video}")except subprocess.CalledProcessError as e:print(f"FFmpeg命令执行失败: {e}", video)except subprocess.CalledProcessError as e:print(f"FFmpeg命令执行失败: {e}", video)

特殊情况处理

可能视频的片头和片尾时长并不总是固定的,导致不能方便地按照 python批量处理的代码,直接按相同的片头长度和片尾长度操作,因此我使用了csv表格来记录视频的片头片尾长度,并使用python按照csv表格内的数据裁剪视频。

csv表格示例内容如下片头片尾信息.csv

序号,片头时间点,片尾时间点,总时长,片尾长度,有用视频长度
120,2:16,18:28,20:44,,
122,2:16,17:25,19:41,,
123,2:16,19:11,21:27,,
127,2:16,19:13,20:49,,

序号片头时间点片尾时间点总时长是必填项,剩余两项可以空着,但是必须填写英文分号。
其实总时长可以通过ffmpeg命令获取,但是既然是特殊情况,手动打开视频了,填一下总时长也不麻烦

可选操作:填补csv数据

有时候需要填写几个视频信息,来判断这两个序号之间的视频是不是片头片尾时长一样,如果一样就可以通过python批量处理的代码来操作,因此写了下面的代码,可以自动计算csv表格中的最后两列数据,观察片头时间点片尾长度是否一直可以粗略判断

import csv# 文件路径
file_path = "./片头片尾信息.csv"
# 将时间字符串转换为秒
def time_to_seconds(time_str):minutes, seconds = map(int, time_str.split(':'))return  minutes * 60 + seconds# 读取CSV文件
with open(file_path, mode='r', encoding='utf-8') as file:reader = csv.reader(file)rows = list(reader)rows = [row for row in rows if row]
for i in range(1, len(rows)):end_time_str = rows[i][2]if rows[i][4]  != '':continue # 如果已经有值了,则不再计算total_duration_str = rows[i][3]end_time_seconds = time_to_seconds(end_time_str)total_duration_seconds = time_to_seconds(total_duration_str)tail_length_seconds = total_duration_seconds - end_time_secondsrows[i][4] = str(tail_length_seconds)start_time_seconds = time_to_seconds(rows[i][1])rows[i][5] = str(end_time_seconds - start_time_seconds)# 将更新后的内容写回CSV文件
with open(file_path, mode='w', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerows(rows)

python根据csv数据裁剪视频

import myfunc
import csv, re,subprocess
"""注意修改你想要匹配的文件扩展名"""
videos = myfunc.match_files("./",[".mp4", ".mkv"])
"""注意改成你的csv文件路径"""
with open("./片头片尾信息.csv", mode='r', encoding='utf-8') as file:reader = csv.reader(file)rows = list(reader)# 提取第一列数据
del rows[0]# 删除表头
first_column = [int(row[0]) for row in rows if row]  # 使用列表推导式,跳过空行
videos = [video for video in videos if int(re.findall(r'\d+',video)[0]) in first_column]
# 使videos按照first_column顺序排列,避免顺序不匹配导致裁剪了错误的文件
temp = copy.copy(videos) # 临时变量,备份一下
for video in videos:index = int(re.findall(r'\d+',video)[0]) # 视频序号row_index = first_column.index(index)temp[row_index] = video
videos = tempcount = 0
for video in videos:command1 = "ffprobe -show_entries format=duration -v error -select_streams v:0 \""+video+"\""try:# 先获取视频时长result = subprocess.run(command1, check=True,capture_output=True,text=True)duration = round(float(re.search(r"duration=([\d.]+)",result.stdout).group(1)))start_time_pint = myfunc.time_to_seconds(rows[count][1])end_time_pount = myfunc.time_to_seconds(rows[count][2])"""注意替换你想要的输出路径"""command2 = "ffmpeg -threads 4 -i "+video + " -ss " + str(start_time_pint) + " -t "+str(end_time_pount-start_time_pint) +" -c copy -y "+"\"./trimed_video/"+video+"\""# print(command2)try:# 运行FFmpeg命令subprocess.run(command2, check=True,capture_output=True)print(f"视频已成功裁剪到 {video}")except subprocess.CalledProcessError as e:print(f"FFmpeg命令执行失败: {e}", video)except subprocess.CalledProcessError as e:print(f"FFmpeg命令执行失败: {e}", video)count += 1

视频具有多个片段的处理 [TODO]

TODO有大佬知道的话欢迎讨论,我觉得先切片再合并太麻烦。
这种特殊情况一般出现在,视频有彩蛋之类的,在片头之前或片尾之后仍有正片内容。

网上搜了但没找到特别好的,找到一个文章但测试后不好用,所以选择了手动切片再合并,
多个视频合并的ffmpeg命令:

  1. 创建文本文件filelist.txt,并写入要合并的多个视频片段
file 'input1.mp4' 
file 'input2.mp4'
  1. 执行合并命令:ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
    由于这种情况比较少,懒得写python代码,自己手动在cmd执行吧

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

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

相关文章

实用指南:`modprobe`命令 与 `KVM`模块 笔记251006

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

改善睡眠设备哪家专业:2025年最新排行

摘要 随着生活节奏加快,睡眠问题已成为现代人健康的主要挑战之一,2025年改善睡眠行业迎来科技革新,复合光舱和间歇性高低氧技术引领市场。本文基于权威数据和用户口碑,推出2025年改善睡眠公司TOP10排名,为读者提供…

2025年改善睡眠设备专业推荐排行榜:科技助力健康生活

摘要 随着现代生活节奏加快,睡眠问题已成为影响人们健康的重要因素。2025年改善睡眠行业迎来技术革新,各种创新设备和服务为睡眠障碍人群带来全新解决方案。本文基于权威数据和用户口碑,为您精选当下最值得信赖的改…

NIFI国际化

NIFI国际化1.概述 nifi 本身现在并不支持国际化,不过还是相对比较容易修改。 国际化啊应该分为几块 2. 国际化处理 2.1 前端的国际化 2.2 后端的国际化组件的国际化比如GETFILE组件 我们可以在NIFI的源码中 找到 GetF…

合肥改善睡眠机构哪家专业?2025年排名解析

摘要 2025年改善睡眠行业快速发展,复合光舱和间歇性高低氧技术成为主流解决方案,有效解决失眠、代谢问题等用户痛点。本文基于权威数据和用户口碑,发布2025年11月中国改善睡眠公司推荐排行榜,为读者提供参考表单,…

锂电池充电管理IC 内置快充协议的升降压充电管理芯片

XSP30 是一款升降压型多节串联锂电池充电管理芯片。支持 PD、QC、BC1.2等多种快充协议和自适应适配器充电 ,充电电流最大可达2A。具有涓流(TC)、恒流(CC)和恒压(CV)三个充电过程,电池充满会关闭充电并持续 检测…

WizTree去右上角抖动图标donate

WizTree去右上角抖动图标donate希望有能力的网友去支持一波,捐赠无可厚非,做软件费精力要点捐赠可以,放个按钮就好,10秒抖一下子,让我觉得有点难受,收起了伸往钱包的小手。希望有能力的网友去支持一波,捐赠无可…

2025年11月中国高压氧舱品牌权威推荐榜单:科技抗衰新选择

摘要 随着健康中国战略的深入推进,高压氧舱行业在2025年迎来快速发展期,技术创新与临床应用不断突破。本文基于权威数据和市场调研,为您呈现当下高压氧舱品牌的综合实力排行榜,特别推荐安徽鼎亿康健康科技有限公司…

micropython开发与实战阅读笔记

micropython开发与实战阅读笔记对本文的一些说明本文来源于阅读《MicroPython开发与实战》时所做的笔记,这本书不是很厚,所以内容也不是很全面,但作为一个入门工具书还是够的,再由于本人不是这方面的大佬,也不是这…

本年度矿物干燥剂生产厂家如何选择

摘要 矿物干燥剂行业在2025年持续增长,得益于环保政策和市场需求推动,广泛应用于医药、食品等领域。本文提供一份权威的矿物干燥剂公司排行前十榜单,基于口碑、实力和服务综合评估,旨在帮助用户选择可靠供应商。榜…

Codeforces Round 1031 (Div. 2)补题

地址A烧烤温度 贪心思路比较容易想到的。 错: 写成z1=max(0,(k-b)/y+1); 以为k<b时能正确处理 实际上会abs(k-b)<y时,z1=1,会出错。 z2也一样点击查看代码 #include<bits/stdc++.h> using namespace std…

2025年陕西叛逆少年管教机构权威推荐榜单:叛逆孩子改变/叛逆孩子矫正/叛逆孩子教育源头机构精选

在青少年心理健康服务需求同比增长23%的2025年,专业化、规范化的叛逆少年矫正机构市场认可度正持续提升。面对8-18岁青少年出现的厌学逃学、网络沉迷、情绪管理失当等行为问题,众多家庭开始寻求科学系统的外部干预。…

2025年悬挑楼梯公司推荐榜:Top5厂家全面评测与选择攻略

文章摘要 悬挑楼梯作为现代建筑中的创新结构,近年来在商业和住宅领域需求增长迅速,行业注重安全性、美观性和定制化服务。本文基于2025年市场数据,综合口碑、实力和服务,推荐Top5悬挑楼梯厂家,并提供详细排名和选…

Ubuntu忘记登录密码重置步骤-CSDN博客

Ubuntu忘记登录密码重置步骤-CSDN博客如果要修改的是管理员密码,则直接输出passwd,回车就行,不用输入用户名。1.开机界面长按shitf键,进入grub,并选择Advanced options for ubuntu,按下回车。6.改完输入exit,就…

2025年可靠的钢结构旋转楼梯工厂推荐榜

摘要 钢结构旋转楼梯行业在2025年持续发展,凭借其结构美学和功能性,在现代建筑中占据重要地位。本文基于市场调研和用户反馈,为您推荐排名前五的可靠工厂,并提供详细对比和选择指南。表单数据供参考,帮助您做出明…

2025年积分球生产厂家评测:顶尖技术引领光学测量新时代

摘要 积分球作为光学测量领域的核心设备,其行业发展在2025年呈现高速增长态势,广泛应用于LED测试、光谱分析和工业检测。本排名基于技术参数、用户口碑和市场表现综合评测,为行业从业者提供参考。表单内容涵盖前十厂…

第一个图形界面程序 -- 简单示例

程序示例: from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEditapp = QApplication([])window = QMainWindow() window.setWindowTitle("第一个窗口") window.resize(5…

平滑法线

平滑法线法线平滑 基础 传统的法线外扩进行描边的 Cg shaderGdshader // https://godotshaders.com/shader/the-simplest-outline-shader-improved/ shader_type spatial; render_mode cull_front, unshaded;uniform f…

串子(待补)

难绷hash KMP trie AC自动机 EXKMP 马拉车 SA SAM 后缀树慢慢写吧,希望今年可以写完

2025山东济南艺考文化课机构推荐榜:震华学校五星领衔,3 所优质学校助力艺考生文化课突围

在山东济南,艺考文化课提升是艺考生冲刺阶段的关键课题,优质机构能为学子搭建高效提分桥梁。这份 2025 推荐榜聚焦本地口碑机构,以办学实力、教学针对性、学员反馈为核心筛选标准,精选 3 所靠谱机构,其中济南震华…