使用 ffmpeg-python 按时间段拆分视频:python-mini-projects 的 videosplitter 实战指南
2026/9/20 22:50:31 网站建设 项目流程
  • 示例工程

【免费下载链接】python-mini-projects

A collection of simple python mini projects to enhance your python skills

项目地址:https://gitcode.com/gh_mirrors/py/python-mini-projects
点击查看免费下载

本文围绕 python-mini-projects 仓库中的 Split_a_video_file_by_given_time_period 示例,讲解如何基于 ffmpeg-python 将一个视频文件按给定时间点拆分为两段。文中既包含可直接复制的命令行用法,也深入到 videosplitter.py 的源码实现,帮助你理解 trim 滤镜与 ffmpeg-python 链式 API 的工作原理,读完即可在本地环境完成视频按时间段拆分。

一、项目定位:一次时间点,两段输出

该示例解决一个非常常见的视频处理需求:在给定的有效时间段内,把视频拆分成两个文件。例如一场长视频录播,你想以第 50 秒为界,将前 50 秒与第 50 秒之后的内容分别导出为两个独立文件,那么 videosplitter 正是为此设计的。

其核心思路可以概括为:

  • 第一段输出:starttimeendtime之间的片段;
  • 第二段输出:endtime到视频末尾的剩余片段。

也就是说,你只需要提供一个时间分割点(通过starttimeendtime两个参数共同表达),脚本就会自动生成两个互不重叠、首尾相接的输出文件。

二、环境准备与依赖安装

2.1 安装 Python

脚本是纯 Python 实现,因此首先需要在宿主机上安装 Python 运行环境(原文档明确要求 "Install python in the host system")。当前仓库的开发环境中已具备 Python 3.12.10,可直接运行。

2.2 安装 ffmpeg-python

videosplitter 依赖 ffmpeg-python 库(导入名称为ffmpeg),原文档给出的安装命令为:

pip install ffmpeg-python

同时,仓库内的 requirements.txt 也提供了锁定版本的依赖声明:

ffmpeg==1.4

即 ffmpeg-python 1.4 版本。使用 requirements.txt 安装可以保证依赖版本的一致性:

pip install -r requirements.txt

2.3 一个容易被忽略的前提:系统需要 ffmpeg 可执行文件

ffmpeg-python 本质上是 ffmpeg 命令行工具的 Python 封装:它负责用 Python 对象构建 ffmpeg 命令行参数,最终仍会调用系统中安装的ffmpeg可执行程序来完成实际的解码、滤镜与编码工作。因此,仅安装 pip 包还不够,宿主机上还需具备可用的 ffmpeg 二进制文件。若运行时报错提示找不到 ffmpeg,应先检查系统级 ffmpeg 是否已安装并加入 PATH。

三、命令行使用指南

3.1 基本用法

在原文档给出的用法中,脚本通过命令行接收 5 个位置参数,一次调用即可完成拆分:

python videosplitter.py test.mp4 0 50 out1.mp4 out2.mp4

参数含义对应关系如下:

参数含义示例值
test.mp4输入视频文件名test.mp4
0起始时间(秒)0
50结束时间(秒)50
out1.mp4第一段输出文件名out1.mp4
out2.mp4第二段输出文件名out2.mp4

上面这条命令的执行效果是:将test.mp4从第 0 秒到第 50 秒的片段导出为out1.mp4,从第 50 秒到视频结尾的片段导出为out2.mp4

3.2 查看帮助信息

原文档同时提供了帮助入口:

python videosplitter.py -h

由于源码基于 argparse 实现(见下文源码解析),执行后你会看到完整的参数说明:

  • inputfile:Input filename
  • starttime:Start time in seconds
  • endtime:End time in seconds
  • outputfile1:Output filename
  • outputfile2:Output filename

借助-h帮助,即使忘记参数顺序,也能随时自查。

3.3 时间参数的类型约束

从源码可以看到,starttimeendtime在 argparse 定义时被声明为type=float(videosplitter.py)。这意味着:

  • 时间参数必须以为单位,可以是整数,也支持小数(如12.5);
  • 若传入非数字内容,argparse 会在运行前直接报错,起到参数校验的作用;
  • 使用小数时间可以精确到毫秒级,适合需要精细切分的场景。

四、源码实现解析:ffmpeg-python 的链式调用

videosplitter.py 全文仅 24 行,却完整展示了 ffmpeg-python 最典型的"输入 → 滤镜 → 输出 → 执行"四段式调用链,非常适合作为学习 ffmpeg-python API 的入门范例。

4.1 参数解析层

parser = argparse.ArgumentParser(description='''Split A media file into two chunks''') parser.add_argument('inputfile', help="Input filename") parser.add_argument('starttime', type=float, help="Start time in seconds") parser.add_argument('endtime', type=float, help="End time in seconds") parser.add_argument('outputfile1', help="Output filename") parser.add_argument('outputfile2', help="Output filename") args = parser.parse_args()

脚本使用标准库argparse定义 5 个位置参数,其中两个时间参数强制转为浮点数。脚本描述信息为 "Split A media file into two chunks",即"把一个媒体文件拆分成两段"。

4.2 输入节点

in1 = ffmpeg.input(args.inputfile)

ffmpeg.input()创建输入流节点,对应底层 ffmpeg 命令中的-i inputfile。此处只声明了输入文件名,未附加任何额外输入选项。

4.3 核心拆分:trim 滤镜

v1 = in1.filter('trim', start=float(args.starttime), end=(args.endtime)) v2 = in1.filter('trim', start=float(args.endtime))

这是整个脚本的灵魂所在,两行代码定义了两种拆分方式:

  • v1(第一段):对输入流应用trim滤镜,startstarttimeendendtime,即保留[starttime, endtime)时间范围内的帧;
  • v2(第二段):对输入流应用trim滤镜,startendtime不指定 end,即保留从endtime到视频结尾的所有帧。

trim是 ffmpeg 内置的时间裁剪滤镜,它通过时间戳筛选保留指定窗口内的帧,丢弃窗口外的帧,是"按时间段取片段"的标准实现。v1v2共用同一个输入节点in1,相当于对同一条输入流并行做了两次不同的时间裁剪。

4.4 输出与执行

out1 = ffmpeg.output(v1, args.outputfile1) out2 = ffmpeg.output(v2, args.outputfile2) out1.run() out2.run()
  • ffmpeg.output()将裁剪后的滤镜输出连接到目标文件,生成输出节点;
  • out1.run()out2.run()分别触发两次实际的 ffmpeg 转码执行,依次生成两个输出文件。

从整体调用链看,脚本等价于在底层构造并依次运行两条 ffmpeg 命令:第一条输出[starttime, endtime)片段,第二条输出[endtime, EOF)片段。

五、运行流程与边界场景分析

5.1 完整执行流程

  1. 用户在命令行提供输入文件、起始时间、结束时间、两个输出文件名;
  2. argparse 完成参数解析与浮点校验;
  3. ffmpeg.input()打开输入媒体文件;
  4. 两条trim滤镜分别截取对应时间段;
  5. 两次run()依次编码写出两个输出文件;
  6. 命令退出,目录下生成拆分后的两个视频文件。

5.2 边界场景与实用建议

结合源码可以推断出以下行为特征与使用注意点:

  • starttime不必为 0:第一段是[starttime, endtime),如果传10 50,则 out1 是第 10~50 秒的内容,原文档示例中的0只是"从开头切起"的特例;
  • endtime既是第一段终点,也是第二段起点:因此想"一刀两断"只需设置一个分割点,例如0 90 out1.mp4 out2.mp4即以第 90 秒为界拆分;
  • endtime需小于视频总时长:若endtime超过视频总时长,第一段会取到视频末尾,第二段将没有可用帧,请确保分割点在有效范围内;
  • 时间戳细节:从源码看,脚本仅使用了trim滤镜,并未额外调用setpts等滤镜重置时间戳(videosplitter.py)。大多数播放器可以正常处理这类输出,但若在个别工具中遇到时间轴显示异常,可以考虑在trim之后串联setpts=PTS-STARTPTS将片段时间戳归零,这属于可自行扩展的优化方向;
  • 转码而非流复制:脚本未指定codecvcodec/acodec参数,实际执行会走默认编码流程,输出文件的编码格式由 ffmpeg 依据输出扩展名与默认配置决定。

六、总结

本项目用极简的代码演示了"按时间段拆分视频"的完整解决方案:借助 argparse 完成命令行交互,借助 ffmpeg-python 的input → filter('trim') → output → run调用链,一条分割点即可同时产出两段首尾相接的视频文件。它既是可直接上手的实用小工具,也是理解 ffmpeg 滤镜体系与 ffmpeg-python 链式 API 的理想参考实现。

  • 快速上手:python videosplitter.py test.mp4 0 50 out1.mp4 out2.mp4
  • 查看帮助:python videosplitter.py -h
  • 相关文件:源码、依赖声明、官方文档
  • 示例工程

【免费下载链接】python-mini-projects

A collection of simple python mini projects to enhance your python skills

项目地址:https://gitcode.com/gh_mirrors/py/python-mini-projects
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询