本文展示如何用 PHP 調用 FFmpeg/mencoder 批量處理視頻文件:掃描目錄下的 .avi 文件,自動匹配同名 .srt 字幕文件,燒錄字幕並轉碼為 MP4,同時提取縮略圖。適用於視頻網站上傳後的自動化處理流水線。
<?php
$dir = './';
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
if (is_file($dir . $file) && preg_match("'\.(avi)$'", $file)) {
$sub_file = str_ireplace(".avi", ".srt", $dir . $file);
$idx_file = str_ireplace(".avi", ".idx", $dir . $file);
$thumb_file = str_ireplace(".avi", ".jpg", $dir . $file);
$out_file = str_ireplace(".avi", ".mp4", $dir . $file);
flv_convert_get_thumb($dir . $file, $sub_file, $idx_file, $thumb_file, $out_file);
}
}
closedir($handle);
}
function flv_convert_get_thumb($in, $in_sub, $in_idx, $out_thumb, $out_vid) {
// 1. 提取縮略圖:第 250 幀、286x160、16:9、MJPEG
$cmd = "ffmpeg -v 0 -y -i $in -vframes 1 -ss 250 -vcodec mjpeg -f rawvideo -s 286x160 -aspect 16:9 $out_thumb";
$res = shell_exec($cmd);
// 2. 燒錄字幕轉碼:mencoder + x264、字幕縮放 3.0、位置 99、音量 +10
$cmd = "mencoder $in -o $out_vid -sub $in_sub -subfont-text-scale 3.0 -subpos 99 -af volume=10 -aspect 16:9 -of avi -noodml -ovc x264";
$res = shell_exec($cmd);
}
?>
| 參數 | 含義 |
|---|---|
-v 0 | 日誌級別:僅錯誤 |
-y | 覆蓋輸出文件 |
-i $in | 輸入文件 |
-vframes 1 | 僅提取 1 幀 |
-ss 250 | 跳轉到第 250 幀(約 8-10 秒) |
-vcodec mjpeg | 輸出編碼:Motion JPEG |
-f rawvideo | 強制原始視頻格式 |
-s 286x160 | 輸出分辨率 |
-aspect 16:9 | 長寬比 |
| 參數 | 含義 |
|---|---|
-sub $in_sub | 指定字幕文件 |
-subfont-text-scale 3.0 | 字幕字體縮放倍數 |
-subpos 99 | 字幕垂直位置(0-100,99 靠近底部) |
-af volume=10 | 音頻濾鏡:音量增益 10dB |
-aspect 16:9 | 輸出長寬比 |
-of avi | 輸出容器格式 |
-noodml | 禁用 OpenDML(大文件支援) |
-ovc x264 | 視頻編碼器:H.264 |
-vf subtitles=file.srt 燒錄字幕,無需 mencoderffmpeg -i input.avi -vf "subtitles=input.srt:force_style='FontSize=24'" -c:v libx264 -c:a aac output.mp4
shell_exec 返回值,記錄命令輸出,失敗重試機制escapeshellarg(),防止命令注入# 燒錄 SRT 字幕 + H.264 + AAC ffmpeg -y -i input.avi -vf "subtitles=input.srt:force_style='FontName=Microsoft YaHei,FontSize=20,Outline=1,Shadow=1'" \ -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 128k -movflags +faststart output.mp4 # 提取多張縮略圖 ffmpeg -i input.avi -vf "fps=1/600,scale=320:-1" -frames:v 3 thumb_%02d.jpg
ffmpeg、mencoder(或僅 FFmpeg)shell_exec、exec(disable_functions 中移除)這套「掃描目錄 → 匹配字幕 → FFmpeg 處理 → 生成產物」的自動化腳本,是視頻類產品上傳後處理流水線的基石。