php本身不处理视频编码,转vp9必须用ffmpeg生成webm(非mp4),因mp4容器原生不支持vp9;强制写入mp4会导致播放失败,正确命令为ffmpeg -i input.mp4 -c:v libvpx-vp9 -c:a libopus output.webm。

PHP本身不处理视频编码,要让视频转成支持VP9的MP4,关键不是改PHP代码,而是让FFmpeg命令正确生成符合规范的MP4容器+VP9视频流——但这里有个硬限制:MP4容器**原生不支持VP9视频轨道**。
为什么ffmpeg -c:v libvpx-vp9 无法直接输出MP4
VP9是WebM的原生视频编码,而MP4标准(ISO/IEC 14496-12)在2023年才通过 Amendment 4 正式纳入VP9支持,但实际兼容性极差:
- 绝大多数播放器(包括Safari、旧版Chrome、iOS系统)仍拒绝解析MP4里的VP9帧
-
ffmpeg默认会拒绝将libvpx-vp9写入MP4,报错类似:Video codec libvpx-vp9 not supported in MP4 - 即使强制用
-strict experimental绕过检查,生成的文件大概率无法播放或被CDN拦截
真正可行的VP9输出格式只有WebM
如果你的目标是轻量、高压缩、浏览器原生支持的VP9视频,必须用.webm后缀,且命令需明确指定封装和编码参数:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -c:a libopus output.webm
注意点:
-
-c:v libvpx-vp9是VP9编码器,不能写成vp9或libvpx -
-c:a libopus是WebM推荐的音频编码,MP3/AAC在WebM里可能不被支持 - 不要加
-f webm——扩展名已足够,FFmpeg会自动匹配muxer - PHP中调用时,务必用
escapeshellarg()包裹路径,例如:escapeshellarg($inputPath)
想保留MP4后缀?只能转H.265或AV1
如果业务强依赖.mp4扩展名(比如某些CDN或前端逻辑),VP9不可行,可选替代方案:
- H.265(HEVC):
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4—— 兼容性好,iOS/macOS原生支持,但Windows需Win10 1809+ - AV1:
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 output.mp4—— 新标准,压缩率优于VP9,但编码慢、硬件解码支持仍在普及中 - 别用
-c:v vp9这种写法——这是无效别名,FFmpeg会报Unknown encoder 'vp9'
PHP调用时最容易忽略的权限与超时问题
VP9/WebM编码比H.264耗时长3–5倍,PHP默认配置极易失败:
-
exec()可能被禁用,检查disable_functions是否含exec,shell_exec,system -
max_execution_time设为0(不限制)或至少300秒,否则大视频直接中断 - PHP运行用户(如
www-data)必须对输入/输出目录有读写权限,且磁盘空间充足(VP9临时文件可能达原始体积2倍) - 别用
shell_exec()捕获完整输出——大日志会撑爆内存,改用proc_open()流式读取
真正卡住的地方从来不是PHP语法,而是FFmpeg能否安静跑完、输出文件是否真能被播放器认出来。验证前先用ffprobe output.webm确认stream信息里写着Video: vp9,再扔进Chrome地址栏直连测试,别信后缀名。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











