2、实验环境搭建:FFmpeg、Python、测试视频源准备
做实验嘛,最怕环境没搭好就急着跑结果。我以前吃过这个亏——花了两小时调参数,最后发现是 FFmpeg 版本不对,白忙活一场。所以这一章,咱们老老实实把地基打牢。
说白了,这套实验只需要三样东西:FFmpeg(编解码核心)、Python 3.8+(自动化脚本)、测试视频源(实验素材)。我一个个说。
2.1 FFmpeg 安装与版本确认
FFmpeg 是咱们的瑞士军刀。编码、解码、转封装、提取时间戳,全得靠它。我个人习惯用静态编译版,省去一堆依赖烦恼。
2.1.1 各平台安装方式
| 平台 | 推荐方式 | 命令 / 下载地址 |
|---|---|---|
| Windows | 下载预编译 exe | https://ffmpeg.org/download.html → Windows builds → 解压后加入 PATH |
| macOS | Homebrew | brew install ffmpeg |
| Ubuntu/Debian | apt | sudo apt install ffmpeg |
| CentOS/RHEL | EPEL + rpmfusion | sudo yum install epel-release → sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm → sudo yum install ffmpeg |
-fps_mode 参数不认识,报错半天。建议至少用 FFmpeg 5.0 以上,最好 6.0+。
2.1.2 验证安装
装完后,打开终端跑一下:
ffmpeg -version
你会看到类似这样的输出:
ffmpeg version 6.1.1 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 13.2.0 (GCC)
configuration: --enable-gpl --enable-version3 --enable-nonfree
libavutil 58. 29.100 / 58. 29.100
libavcodec 60. 31.102 / 60. 31.102
libavformat 60. 16.100 / 60. 16.100
libavdevice 60. 3.100 / 60. 3.100
libavfilter 9. 12.100 / 9. 12.100
libswscale 7. 5.100 / 7. 5.100
libswresample 4. 12.100 / 4. 12.100
重点看 libavcodec 和 libavformat 的版本号。这两个库直接决定了编解码器的支持范围。嗯,这里要注意:如果版本太低,后面测试 H.265/HEVC 或 AV1 时可能会翻车。
2.2 Python 环境与依赖库
Python 负责跑自动化脚本——批量转码、提取时间戳、计算同步偏差。我建议用虚拟环境,别污染全局。
2.2.1 创建虚拟环境
python3 -m venv sync_test_env
source sync_test_env/bin/activate # Linux/macOS
sync_test_env\Scripts\activate # Windows
2.2.2 安装依赖
咱们只需要几个轻量库:
pip install numpy matplotlib pandas
- numpy:处理时间戳数组,算均值、标准差
- matplotlib:画同步偏差的散点图/箱线图
- pandas:整理实验数据,导出 CSV 报告
requirements.txt,内容就这三行。换机器时 pip install -r requirements.txt 一键搞定。
2.2.3 验证 Python 与 FFmpeg 的联动
写个简单脚本,确认 Python 能调用 FFmpeg:
import subprocess
import json
def get_ffmpeg_version():
result = subprocess.run(
['ffmpeg', '-version'],
capture_output=True, text=True
)
return result.stdout.split('\n')[0]
print(get_ffmpeg_version())
跑出来应该是 ffmpeg version 6.1.1 ... 这样的字符串。如果报 FileNotFoundError,说明 FFmpeg 没加到 PATH 里——回去检查环境变量。
2.3 测试视频源准备
测试视频不能随便找个电影片段就开干。你想想看,电影画面复杂、运动剧烈,编解码器一压,到底是编码器的问题还是画面本身的问题?根本说不清。
所以我准备了三种标准测试源:
2.3.1 源类型与用途
| 类型 | 内容 | 分辨率 | 帧率 | 时长 | 用途 |
|---|---|---|---|---|---|
| 静态色条 | 纯色 + 标准彩条 | 1920x1080 | 30 fps | 10 秒 | 检测编码器是否引入固定延迟偏移 |
| 动态时钟 | 毫秒级数字时钟 + 秒针 | 1920x1080 | 60 fps | 30 秒 | 精确测量音画同步偏差(亚帧级) |
| 自然场景 | 固定机位拍摄的街景 | 3840x2160 | 24 fps | 60 秒 | 模拟真实场景下的编解码同步表现 |
2.3.2 用 FFmpeg 生成测试源
别去网上下载,自己生成最干净。我直接给命令:
静态色条(10 秒,1080p30):
ffmpeg -f lavfi -i testsrc2=size=1920x1080:rate=30:duration=10 \
-c:v libx264 -preset ultrafast -crf 18 \
-pix_fmt yuv420p \
source_static_bars.mp4
动态时钟(30 秒,1080p60):
ffmpeg -f lavfi -i "color=c=white:s=1920x1080:r=60:d=30" \
-f lavfi -i "drawtext=text='%{localtime\:%T.%3N}':fontsize=80:fontcolor=black:x=(w-text_w)/2:y=(h-text_h)/2:rate=60" \
-c:v libx264 -preset ultrafast -crf 18 \
-pix_fmt yuv420p \
source_digital_clock.mp4
localtime 生成时钟,结果发现不同机器上时间不同步,导致对比实验数据对不上。后来改用 pts 函数生成相对时间戳——text='%{pts}',这样每帧的时间戳是绝对的、可复现的。
自然场景(60 秒,4K24):
ffmpeg -f lavfi -i "movie=filename=source_nature.mp4:loop=0" \
-c:v libx264 -preset medium -crf 18 \
-pix_fmt yuv420p \
source_nature_4k.mp4
注意:自然场景源需要你提前准备一段无压缩的原始素材。我一般用手机固定在三脚架上拍一段街景,然后用 ffmpeg -i raw.mov -c:v libx264 -preset ultrafast -crf 0 raw_encoded.mp4 转成无损版作为母版。
2.4 实验目录结构
项目一乱,后面找数据能找疯。我习惯这样组织:
sync_test_lab/
├── sources/ # 原始测试视频
│ ├── source_static_bars.mp4
│ ├── source_digital_clock.mp4
│ └── source_nature_4k.mp4
├── encoded/ # 编码后的输出
│ ├── h264/
│ ├── h265/
│ └── av1/
├── scripts/ # Python 自动化脚本
│ ├── encode_all.py
│ ├── extract_timestamps.py
│ └── analyze_sync.py
├── results/ # 实验数据 + 图表
│ ├── csv/
│ └── plots/
├── requirements.txt
└── README.md
每个子目录的作用很清楚。编码后的文件按编码器分文件夹,方便后面批量分析。
2.5 环境验证清单
正式实验前,跑一遍这个清单,确保万无一失:
- FFmpeg 版本:≥ 5.0,支持
-fps_mode和-vsync参数 - Python 版本:≥ 3.8,虚拟环境已激活
- 依赖库:numpy、matplotlib、pandas 已安装
- 测试源:三种源文件都在
sources/目录下,时长、分辨率、帧率与预期一致 - 目录结构:
encoded/、results/子目录已创建
好了,环境搭完了。下面这张图把整个实验流程串了一遍——从原始源到编码、再到同步分析,每一步的输入输出都标清楚了。
环境搭好、源文件就位,下一步就是真正的编码测试了。咱们第三章见真章。