PHP 7.4 通过调用系统 ffmpeg 实现 ogv 转码,需确保 ffmpeg 已安装 libtheora/libvorbis 编码器,并使用 escapeshellarg() 安全构建命令:ffmpeg -y -i input.mp4 -c:v libtheora -q:v 7 -c:a libvorbis -q:a 4 output.ogv。

PHP 7.4 本身不直接支持视频转码,它需要调用系统命令行工具 ffmpeg 来完成转码任务。而 ogv 是基于 Theora 视频编码 + Vorbis 音频编码的 Ogg 容器格式,虽然已逐渐被 WebM(VP9/AV1)取代,但仍有兼容性需求。
确认系统已安装并可用 ffmpeg
在 PHP 中执行 ffmpeg 前,必须确保:
- 服务器上已安装 ffmpeg(推荐 4.0+ 版本,对 Theora 支持更稳定)
- PHP 进程有权限执行 shell 命令(
exec、shell_exec等函数未被禁用) - 运行 PHP 的用户(如 www-data、nginx 或 apache)对输入/输出目录有读写权限
基础转码命令(先在终端验证)
建议先在服务器终端手动测试,确认 ffmpeg 能正常生成 ogv:
ffmpeg -i input.mp4 -c:v libtheora -q:v 7 -c:a libvorbis -q:a 4 output.ogv
说明:
立即学习“PHP免费学习笔记(深入)”;
-
-c:v libtheora:指定 Theora 编码器(需 ffmpeg 编译时启用) -
-q:v 7:视频质量(0–10,数值越大质量越高,文件越大;7 是较平衡值) -
-c:a libvorbis:指定 Vorbis 音频编码器 -
-q:a 4:音频质量(0–10,常用 3–5) - 注意:部分精简版 ffmpeg(如某些 Ubuntu 仓库包)可能不含
libtheora,需自行编译或换用带 full codec 支持的版本
PHP 7.4 中安全调用 ffmpeg
使用 escapeshellarg() 防止路径含空格或特殊字符导致命令失败或安全风险:
<?php
$input = '/path/to/input.mp4';
$output = '/path/to/output.ogv';
// 转义路径,防止注入
$escapedInput = escapeshellarg($input);
$escapedOutput = escapeshellarg($output);
// 构建命令(注意:-y 强制覆盖,避免交互)
$cmd = "ffmpeg -y -i {$escapedInput} -c:v libtheora -q:v 7 -c:a libvorbis -q:a 4 {$escapedOutput} 2>&1";
// 执行并捕获输出
$outputLog = shell_exec($cmd);
// 检查是否生成成功
if (file_exists($output) && filesize($output) > 1024) {
echo "转换成功:".basename($output);
} else {
echo "转换失败,请检查 ffmpeg 日志:\n" . htmlspecialchars($outputLog);
}
?>
常见问题与注意事项
⚠️ 注意事项:
- PHP 运行超时:大视频可能耗时较长,需设置
set_time_limit(0)或调整max_execution_time - 内存限制:转码过程不占 PHP 内存,但需确保系统有足够内存和磁盘空间
- 编码器缺失:若报错
Unknown encoder 'libtheora',说明 ffmpeg 不支持 Theora,可尝试:ffmpeg -encoders | grep theora查看是否列出;否则需重装支持 theora 的 ffmpeg - 替代方案:现代浏览器基本都支持 WebM(
-c:v libvpx-vp9),更小更快,ogv 仅建议用于极老环境(如旧版 Firefox)



















