背景緣由
開發過程中,客戶需要上傳視訊的時候,要求獲取視訊中的某一幀圖片作為介面展示。目前已知PHP已有視訊處理器擴充套件(php-ffmpeg)可直接使用,安裝使用後發現,php-ffmpeg對服務環境有一定的依賴,故此將此實踐分享出來,供大家參考!
服務搭建
程式碼環境安裝”php-ffmpeg/php-ffmpeg” 擴充套件包
composer require php-ffmpeg/php-ffmpeg
liunx環境伺服器安裝ffmpeg
- 將檔案依賴包【ffmpeg-4.2.2.tar.bz2】,上傳到/opt目錄下
- 解壓檔案
tar -jxvf ffmpeg-4.2.2.tar.bz2
- 進入解壓目錄
cd ffmpeg-4.2.2
- 編譯安裝
./configure --disable-x86asm --enable-shared && make && make install
- 退出到 /opt 目錄
cd /opt
- 修改使用者組許可權
chown -R www:www ffmpeg-4.2.2
- 編輯可視檢視版本
vim /etc/ld.so.conf
// 在裡面加入一句 /opt/ffmpeg-4.2.2
- 使其生效 執行命令
ldconfig
- 檢視版本資訊
ffmpeg
(如果能正常檢視錶示安裝成功) - 需要使用該功能,需要在php.ini中 disable_functions 將
proc_open,proc_get_status
兩個函式放開 - 在nginx伺服器配置中增加可訪問目錄
vim /usr/local/nginx/conf/fastcgi.conf fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/:/tmp/:/proc/:/mnt/data/:/opt/ffmpeg-4.2.2/"; // 主要新增: :/opt/ffmpeg-4.2.2/
- 重啟伺服器及php-fpm
/etc/init.d/php-fpm restart
使用案例
/**
* 獲取視訊的某一幀圖片
*
* @name getVideoFrameOfImage
*/
public static function getVideoFrameOfImage($resource, $second)
{
// 資原始檔路徑
$fileInfo = pathinfo($resource);
$fileNameNoSuffix = $fileInfo['filename'];
$dirname = $fileInfo['dirname'];
if (Config::get('app.ffmpeg')) {
$ffmpeg = FFMpeg::create(Config::get('app.ffmpeg'));
} else {
$ffmpeg = FFMpeg::create();
}
$video = $ffmpeg->open($resource);
$frameName = $dirname . '/' . $fileNameNoSuffix . '.jpg';
$video->frame(\FFMpeg\Coordinate\TimeCode::fromSeconds($second))->save($frameName);
return $frameName;
}
配置獲取(當前展示的windows的,liunx的配置全路徑的可執行檔案即可):
// (windows)視訊壓縮軟體安裝配置
'ffmpeg' => [
'ffmpeg.binaries' => 'D:\ffmpeg-20200301-1281399-win64-static\ffmpeg-20200301-1281399-win64-static\bin\ffmpeg.exe',
'ffprobe.binaries' => 'D:\ffmpeg-20200301-1281399-win64-static\ffmpeg-20200301-1281399-win64-static\bin\ffprobe.exe'
],
// (liunx)視訊壓縮軟體安裝配置
'ffmpeg' => [
'ffmpeg.binaries' => '/opt/ffmpeg-4.2.2/ffmpeg',
'ffprobe.binaries' => '/opt/ffmpeg-4.2.2/ffprobe'
],
本作品採用《CC 協議》,轉載必須註明作者和本文連結