1. 环境准备与目标设定
1.1 目标与范围
在本教程中,我们围绕 PHP 集成 FFmpeg,实现 视频转码 与 水印处理 的完整流程,帮助开发者快速搭建生产级的多媒体处理能力。
通过本指南,你将掌握从环境搭建、命令设计到在 PHP 中调用 FFmpeg 的全链路方案,覆盖 转码参数、水印样式、以及 错误处理 与 性能优化 的要点。
适用场景包括:转换不同分辨率、统一编解码格式、以及在视频中嵌入 文字水印 或 图片水印,以满足博客、教育、媒体等多种应用需求。
1.2 运行环境与依赖确认
开始前要确认 FFmpeg 已在服务器或本地环境正确安装,并且 PHP 运行时能够访问 FFmpeg 二进制文件,这对于后续的命令执行至关重要。
常见依赖包括:Linux 发行版、PHP 8.x、以及对外部二进制的能够读取权限。
ffmpeg -version
which ffmpeg2. FFmpeg 与 PHP 的安装与集成
2.1 安装 FFmpeg
在 Linux 服务器上,FFmpeg 的安装通常通过系统包管理器完成,确保包含 ffmpeg 与 ffprobe,以支持转码与探测。
安装命令示例(Debian/Ubuntu):apt-get 方式安装后,ffmpeg 将成为全局可执行程序,供 PHP 调用。
sudo apt-get update
sudo apt-get install -y ffmpeg2.2 PHP 调用路径与工具选择
实现 PHP 集成 FFmpeg 的常用路径有两种:直接在 PHP 中通过 exec/system 等系统调用 FFmpeg,或使用 PHP-FFMpeg 这样的封装库来简化调用。
若选择直接调用,需要确保 安全性与参数转义,并处理执行结果与超时。若选择库封装,Composer 安装后可以获得更直观的 API。

composer require php-ffmpeg/php-ffmpeg3. 基本转码流程
3.1 转码目标与命令设计
转码的核心是将 输入视频转换为目标格式,同时保持或提升画质,常见参数包括 分辨率、编码格式、比特率、以及 音视频编解码。
典型的转码命令示例包含:缩放到 1280x720、视频编码为 libx264、音频编码为 aac、以及合适的输出路径。
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -preset fast -crf 23 -c:a aac -b:a 128k output.mp43.2 通过原生 PHP 调用 FFmpeg
直接在 PHP 中组装命令并执行,是最直接的集成方式,适合简单的转码任务与自定义参数的快速验证。
以下示例演示如何在 PHP 中拼接命令并执行转码,使用 escapeshellarg 防止注入,并处理返回状态以确认是否成功。
3.3 使用 PHP-FFMpeg 封装的示意
如果希望获得更高层次的 API 封装,可以借助 PHP-FFMpeg,它提供了更清晰的对象模型来处理视频对象、格式以及输出。
'/usr/bin/ffmpeg','ffprobe.binaries' => '/usr/bin/ffprobe',
]);$video = $ffmpeg->open('/path/to/input.mp4');
$format = new \FFMpeg\Format\Video\X264();
$format->setAudioCodec('aac');
$video->save($format, '/path/to/output.mp4');
?> 4. 视频水印实现
4.1 文字水印的实现思路
在视频上添加文字水印,是最常见的水印形式之一,通常通过 FFmpeg 的 drawtext 滤镜 实现,关键参数包括文本、字体、字号、颜色和位置。
文本水印 可以在输出前端查看,也可以通过时间控制实现动态水印效果,以避免版权争议。
ffmpeg -i input.mp4 -vf "drawtext=text='示例水印':fontcolor=white@0.8:fontsize=24:x=10:y=H-th-10" -codec:a copy output_text_watermark.mp44.2 图片水印的实现
若你需要在视频中加入公司徽标或品牌图片,可以使用 overlay 滤镜,将水印图片叠加在视频上,位置通过坐标控制。
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" -codec:v libx264 -codec:a aac -b:a 128k output_image_watermark.mp44.3 同时转码与水印的组合应用
在实际场景中,往往需要在转码的同时添加水印,这时可以在同一个命令中组合缩放、文字水印或图片水印,以及输出参数。
ffmpeg -i input.mp4 -i watermark.png -filter_complex "scale=1280:720,[0:v]drawtext=text='示例水印':fontcolor=white@0.8:fontsize=24:x=10:y=H-th-10 [v0];[v0][1:v]overlay=10:10
" -c:v libx264 -preset fast -crf 23 -c:a aac -b:a 128k output_combined.mp4如果采用 PHP 直接调用 FFmpeg,同样可以将上述命令作为字符串拼接并执行,确保对输入、输出路径进行正确转义以避免注入风险。
5. 错误处理与性能优化
5.1 常见错误与排错要点
在实际运行中,常见问题包括 FFmpeg 未找到、权限不足、输入输出路径错误、以及转码任务的 超时与资源限制。
为提升鲁棒性,建议在 PHP 层实现对返回码的严格判定,并对 日志输出、错误码对照、以及重试策略进行规范化处理。
# 简化日志查看示例
ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 23 output.mp4 &> ffmpeg.log
tail -n +1 ffmpeg.log | less
5.2 性能与稳定性优化要点
性能优化的核心在于合理配置 并发与硬件加速,以及选择合适的 编码参数与 资源限制,以确保大规模并发任务下的稳定性。
可考虑的方向包括:使用硬件解码/编码、多线程选项、以及对日志与监控的 指标化采集,以便快速定位瓶颈。
ffmpeg -hwaccel auto -threads 4 -i input.mp4 -c:v libx264 -preset fast -crf 23 output.mp4 

