首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP + FFmpeg 給視頻添加字幕:批量處理腳本、縮略圖提取、編碼參數詳解與實戰代碼

     編輯:PHP 相關知識

服務端自動化視頻後處理:字幕燒錄、縮略圖生成、格式轉碼一條龍

本文展示如何用 PHP 調用 FFmpeg/mencoder 批量處理視頻文件:掃描目錄下的 .avi 文件,自動匹配同名 .srt 字幕文件,燒錄字幕並轉碼為 MP4,同時提取縮略圖。適用於視頻網站上傳後的自動化處理流水線。

完整 PHP 處理腳本

<?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);
}
?>

命令參數深度解析

FFmpeg 縮略圖提取

參數含義
-v 0日誌級別:僅錯誤
-y覆蓋輸出文件
-i $in輸入文件
-vframes 1僅提取 1 幀
-ss 250跳轉到第 250 幀(約 8-10 秒)
-vcodec mjpeg輸出編碼:Motion JPEG
-f rawvideo強制原始視頻格式
-s 286x160輸出分辨率
-aspect 16:9長寬比

Mencoder 字幕燒錄轉碼

參數含義
-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

進階優化建議

  1. 改用 FFmpeg 統一處理:現代 FFmpeg 已支援 -vf subtitles=file.srt 燒錄字幕,無需 mencoder
    ffmpeg -i input.avi -vf "subtitles=input.srt:force_style='FontSize=24'" -c:v libx264 -c:a aac output.mp4
  2. 異步任務隊列:視頻處理耗時長,應放入 Redis/RabbitMQ 隊列,Worker 消費,避免阻塞 Web 進程
  3. 錯誤處理與日誌:檢查 shell_exec 返回值,記錄命令輸出,失敗重試機制
  4. 安全防範:文件名參數必須 escapeshellarg(),防止命令注入
  5. 字幕格式支援:優先支援 SRT/ASS,IDX/SUB 為 VobSub 圖形字幕需額外處理
  6. 縮略圖策略:多幀提取(如 10%、50%、90%),生成預覽圖組

現代化 FFmpeg 命令模板

# 燒錄 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)
  • PHP 需啟用 shell_exec、exec(disable_functions 中移除)
  • 視頻處理佔用 CPU/IO 極高,建議專用 Worker 機器、限制併發數
  • 臨時文件定期清理,避免磁盤佔滿

這套「掃描目錄 → 匹配字幕 → FFmpeg 處理 → 生成產物」的自動化腳本,是視頻類產品上傳後處理流水線的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved