PHP需调用FFmpeg处理视频旋转:先用ffprobe检测rotate元数据,若存在则方案一用-metadata:s:v:0 rotate=0零重编码清除,方案二依角度选transpose或rotate滤镜重编码修正。

PHP 本身不能直接旋转视频,但可以通过调用系统命令行工具 FFmpeg 来实现自动检测并修正视频的旋转方向(即处理 rotate 元数据)。关键在于让 FFmpeg 读取视频的 rotation 标签(如 90、180、270),然后用 -vf transpose 或 rotate 滤镜进行物理重编码或快速元数据清除。
确认视频是否含旋转元数据
很多手机拍摄的 MP4 视频会把旋转信息写在 tags: rotate=90 中,播放器靠它自动转画面,但实际像素仍是横置的。可用以下命令检查:
如果输出 rotate=90,说明需修正;若无输出或为 rotate=0,则无需处理。
方案一:仅清除旋转元数据(推荐,零重编码)
适用于只想让播放器“按原始像素显示”,不改变画布方向。速度快、无画质损失:
立即学习“PHP免费学习笔记(深入)”;
- 用
-metadata:s:v:0 rotate=0清除视频流的 rotate 标签 - 加
-c:v copy -c:a copy实现完全流拷贝 - 完整命令:
ffmpeg -i input.mp4 -metadata:s:v:0 rotate=0 -c:v copy -c:a copy output.mp4
方案二:物理旋转像素(真正翻转画面)
当需要固定朝向(如全部转成横屏)或清除元数据后仍显示异常时使用。会重编码,耗时且轻微损画质:
- 先用
ffprobe获取 rotation 值(PHP 中用exec()或shell_exec()) - 根据值选择滤镜:
• 90° →-vf "transpose=1"(顺时针90)
• 180° →-vf "transpose=1,transpose=1"或"rotate=PI"
• 270° →-vf "transpose=2"(逆时针90) - 示例(PHP 执行):
$cmd = 'ffmpeg -i input.mp4 -vf "transpose=1" -c:a copy output.mp4 2>&1';
exec($cmd, $output, $return_code);
PHP 中安全执行的关键点
- 始终对输入文件路径做
escapeshellarg()过滤,防止命令注入 - 设置超时(如
set_time_limit(300))避免卡死 - 检查
ffmpeg和ffprobe是否在系统 PATH 中,或指定绝对路径 - 捕获错误输出:
2>&1并记录日志,便于排查 codec 不支持等问题



















