- 示例工程
【免费下载链接】python-mini-projects
A collection of simple python mini projects to enhance your python skills
本文围绕 python-mini-projects 仓库中的 Split_a_video_file_by_given_time_period 示例,讲解如何基于 ffmpeg-python 将一个视频文件按给定时间点拆分为两段。文中既包含可直接复制的命令行用法,也深入到 videosplitter.py 的源码实现,帮助你理解 trim 滤镜与 ffmpeg-python 链式 API 的工作原理,读完即可在本地环境完成视频按时间段拆分。
一、项目定位:一次时间点,两段输出
该示例解决一个非常常见的视频处理需求:在给定的有效时间段内,把视频拆分成两个文件。例如一场长视频录播,你想以第 50 秒为界,将前 50 秒与第 50 秒之后的内容分别导出为两个独立文件,那么 videosplitter 正是为此设计的。
其核心思路可以概括为:
- 第一段输出:
starttime到endtime之间的片段; - 第二段输出:
endtime到视频末尾的剩余片段。
也就是说,你只需要提供一个时间分割点(通过starttime与endtime两个参数共同表达),脚本就会自动生成两个互不重叠、首尾相接的输出文件。
二、环境准备与依赖安装
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.txt2.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 filenamestarttime:Start time in secondsendtime:End time in secondsoutputfile1:Output filenameoutputfile2:Output filename
借助-h帮助,即使忘记参数顺序,也能随时自查。
3.3 时间参数的类型约束
从源码可以看到,starttime与endtime在 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滤镜,start取starttime,end取endtime,即保留[starttime, endtime)时间范围内的帧; - v2(第二段):对输入流应用
trim滤镜,start取endtime且不指定 end,即保留从endtime到视频结尾的所有帧。
trim是 ffmpeg 内置的时间裁剪滤镜,它通过时间戳筛选保留指定窗口内的帧,丢弃窗口外的帧,是"按时间段取片段"的标准实现。v1、v2共用同一个输入节点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 完整执行流程
- 用户在命令行提供输入文件、起始时间、结束时间、两个输出文件名;
- argparse 完成参数解析与浮点校验;
ffmpeg.input()打开输入媒体文件;- 两条
trim滤镜分别截取对应时间段; - 两次
run()依次编码写出两个输出文件; - 命令退出,目录下生成拆分后的两个视频文件。
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将片段时间戳归零,这属于可自行扩展的优化方向; - 转码而非流复制:脚本未指定
codec或vcodec/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
相关推荐
python-mini-projects 实战指南:基于 OpenCV 的 Capture Video Frames 视频帧提取
python mini projects 实战指南:基于 OpenCV 的 Capture Video Frames 视频帧提取 本文以 python mini
示例工程用 Python 脚本按字母顺序归档文件:python-mini-projects 文件整理实战
用 Python 脚本按字母顺序归档文件:python mini projects 文件整理实战 本文以 python mini projects 仓库中的 W
示例工程使用 boto3 上传文件到 AWS S3:python-mini-projects 的 S3_File_Upload 实战指南
使用 boto3 上传文件到 AWS S3:python mini projects 的 S3_File_Upload 实战指南 本文以 python mini
示例工程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考