PHP需调用ffmpeg转码视频为FLV格式,前提是服务器已安装ffmpeg并配置正确;使用escapeshellarg防护命令注入,推荐参数为-c:v libx264 -c:a libmp3lame -f flv;但FLV已过时,建议优先转MP4或HLS。

PHP 本身不能直接转码视频,但可以通过 执行系统命令 调用 ffmpeg 工具完成转码。把视频转成 FLV 格式,关键在于确保服务器已安装 ffmpeg,并用 PHP 的 exec、shell_exec 或 proc_open 发起命令。
确认 ffmpeg 已正确安装并可执行
在终端运行:
ffmpeg -version
如果返回版本信息,说明可用。若提示“command not found”,需先安装 ffmpeg(Linux 常用 apt install ffmpeg 或 yum install ffmpeg;Windows 需下载二进制并配置环境变量)。
立即学习“PHP免费学习笔记(深入)”;
基础转码命令(PHP 中调用)
FLV 是较老的封装格式,现代 ffmpeg 默认可能不启用某些编码器(如 libx264 + libmp3lame),需显式指定参数。推荐命令示例:
ffmpeg -i input.mp4 -c:v libx264 -c:a libmp3lame -f flv output.flv
说明:
-
-i input.mp4:输入文件路径(支持 MP4、AVI、MOV 等常见格式) -
-c:v libx264:使用 H.264 编码视频(FLV 容器支持) -
-c:a libmp3lame:使用 MP3 编码音频(FLV 推荐音频格式) -
-f flv:强制输出为 FLV 封装格式
PHP 中安全执行转码(含错误处理)
不建议直接拼接用户上传的文件名,防止命令注入。应做路径校验、过滤和转义:
<?php
$input = '/path/to/uploaded/video.mp4'; // 务必验证是合法本地路径
$output = '/path/to/output/video.flv';
// 简单校验(实际项目中建议用更严格的白名单或 realpath + in_array)
if (!is_file($input) || pathinfo($input, PATHINFO_EXTENSION) === 'flv') {
die('无效输入文件');
}
$cmd = sprintf(
"ffmpeg -i %s -c:v libx264 -c:a libmp3lame -f flv %s 2>&1",
escapeshellarg($input),
escapeshellarg($output)
);
$output_log = shell_exec($cmd);
if (file_exists($output) && filesize($output) > 0) {
echo "转换成功!";
} else {
echo "失败,日志:", htmlspecialchars($output_log);
}
?>
注意事项与替代建议
FLV 格式已基本被弃用(HTML5 不原生支持,Flash 已停止维护)。除非对接旧系统(如某些 RTMP 推流或老版播放器),否则建议:
- 转成 MP4(H.264 + AAC):兼容性更好,浏览器直接播放
- 如需流媒体,考虑 HLS(m3u8 + ts)或 DASH
- 生产环境建议用队列(如 Redis + Worker)异步处理,避免 PHP 请求超时
- 大文件转码时注意 PHP 的
max_execution_time和内存限制



















