php通过调用ffmpeg实现视频转码,流程为:上传校验→唯一命名保存→异步执行mp4/webm/hls多格式转码→数据库记录状态→前端轮询进度;需配置ffmpeg环境、权限、超时及日志。

PHP 本身不直接处理视频转码,但可以作为“调度器”调用外部转码工具(如 FFmpeg)完成上传后的自动多格式转码。核心思路是:接收上传 → 保存原始文件 → 启动后台转码任务 → 生成 MP4、WebM、HLS(m3u8 + ts)等常用格式。
1. 前置准备:安装并验证 FFmpeg
转码依赖 FFmpeg 命令行工具,不是 PHP 扩展(php-ffmpeg 是封装库,非必需)。确保服务器已安装且可执行:
- Linux 示例:
sudo apt install ffmpeg或从官网编译安装 - 验证:
ffmpeg -version能正常输出版本信息 - PHP 需有执行系统命令权限(
exec/shell_exec),且 Web 用户(如 www-data)对上传目录和输出目录有读写权限
2. 上传处理:安全接收并暂存视频
避免直接用原始文件名,生成唯一标识,限制类型和大小:
- 检查
$_FILES['video']['error'] === UPLOAD_ERR_OK - 白名单校验后缀:
in_array(strtolower(pathinfo($name, PATHINFO_EXTENSION)), ['mp4', 'avi', 'mov', 'mkv']) - 用
uniqid() . '_' . mt_rand(1000,9999)重命名,保存到/uploads/raw/ - 记录原始信息到数据库(如 id、原始名、路径、状态=‘uploading’)
3. 触发转码:异步执行多格式命令
不要在上传响应中同步等待转码(会超时),推荐用后台进程或队列。简易方案可用 exec + nohup 后台运行:
-
MP4(H.264+AAC,兼容性最好):
ffmpeg -i /path/in.mp4 -c:v libx264 -preset fast -crf 23 -c:a aac -b:a 128k /path/out_720p.mp4 -
WebM(VP9+Opus,适合现代浏览器):
ffmpeg -i /path/in.mp4 -c:v libvpx-vp9 -b:v 1M -c:a libopus /path/out.webm -
HLS 自适应流(含 m3u8 索引和 ts 分片):
ffmpeg -i /path/in.mp4 -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls /path/out.m3u8 - 所有命令建议重定向日志:
> /var/log/transcode_{$id}.log 2>&1 &
4. 状态跟踪与回调(可选增强)
转码耗时长,需反馈进度或完成通知:
- 数据库字段加
status('pending', 'processing', 'success', 'failed')和updated_at - PHP 启动转码后立即返回 JSON:
{"task_id": "xxx", "status": "queued"} - 前端轮询
/api/status?id=xxx获取当前状态 - 进阶可接 Redis 队列(如 Predis + Supervisor)或使用 Laravel Horizon、Symfony Messenger
不复杂但容易忽略:务必设置好 PHP 的 max_execution_time(CLI 模式不受 web 限制)、磁盘空间监控、FFmpeg 超时保护(-t 3600 限制最长1小时),以及转码失败时的错误日志捕获和告警。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











