php 7.4需调用支持libaom或libsvtav1的ffmpeg才能转av1;先验证ffmpeg -encoders | grep av1,再用proc_open安全执行命令,推荐输出mkv封装并异步处理。

PHP 7.4 本身不直接支持视频编码,它需要调用系统命令行工具(如 ffmpeg)来完成 AV1 编码。AV1 是一种较新的开源视频编码格式,需确保你安装的 FFmpeg 版本已启用 libaom(官方参考编码器)或 libsvtav1(Intel 的高性能编码器),否则无法转 AV1。
确认系统已安装支持 AV1 的 FFmpeg
在终端运行:
ffmpeg -encoders | grep av1
若看到类似 libaom-av1 或 libsvtav1 的输出,说明支持;否则需重新编译或下载静态构建版(推荐从 johnvansickle.com 下载带 AV1 支持的 Linux 静态二进制包)。
PHP 中调用 ffmpeg 命令转 AV1
使用 exec()、shell_exec() 或 proc_open() 执行命令。推荐用 proc_open() 便于捕获错误和控制超时:
- 基础命令示例(使用 libaom-av1,平衡画质与速度):
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -b:v 0 -cpu-used 2 -threads 4 output_av1.mp4 -
-crf 30:控制质量(范围 0–63,越小越好,30 是中等质量) -
-b:v 0:启用 CRF 模式(必须配-crf) -
-cpu-used 2:编码速度/质量权衡(0=最慢最准,8=最快最差;建议 2–4) -
-threads 4:指定线程数,避免默认占用全部 CPU
PHP 安全执行示例(含路径校验与错误处理)
务必过滤输入文件名,防止命令注入:
$input = '/safe/path/input.mp4';
$output = '/safe/path/output_av1.mp4';
// 简单校验:只允许字母、数字、下划线、点、斜杠,且必须是绝对路径
if (!preg_match('/^\/[\w\/\.\-]+$/', $input) || !preg_match('/^\/[\w\/\.\-]+$/', $output)) {
die('Invalid file path');
}
if (!file_exists($input)) {
die('Input file not found');
}
$cmd = sprintf(
'ffmpeg -i %s -c:v libaom-av1 -crf 30 -b:v 0 -cpu-used 2 -threads 4 %s 2>&1',
escapeshellarg($input),
escapeshellarg($output)
);
$outputLog = [];
$returnCode = 0;
exec($cmd, $outputLog, $returnCode);
if ($returnCode !== 0) {
error_log("FFmpeg failed: " . implode("\n", $outputLog));
die('Encoding failed. Check logs.');
}
注意容器封装与兼容性
AV1 视频通常建议封装为 .mkv(Matroska),因 MP4 标准对 AV1 支持有限(部分播放器可能无法识别 MP4 中的 AV1 流):
- 改用
output.mkv替代output_av1.mp4 - 若坚持 MP4,可加
-strict experimental(仅限旧版 FFmpeg),但不推荐用于生产环境 - 音频流建议保留或重编码为 Opus:
-c:a libopus -b:a 96k
AV1 编码耗时远高于 H.264/H.265,适合离线批量处理,不适合实时响应。生产环境建议结合队列(如 Redis + Worker)异步执行,避免阻塞 PHP 请求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











