詳解Laravel如何安裝FFmpeg并進行視頻文件處理
Ubuntu 18.04 安裝FFmpeg
1、下載源碼編譯安裝
github地址:github.com/PHP-FFMpeg/PHP-FFMpeg
安裝依賴的庫
主要安裝三個:yasm ,sdl1.2 和 sdl2.0
安裝 yasmsudo apt-get install yasm 安裝 sdl1.2sudo apt-get install libsdl1.2-dev 安裝 sdl2.0sudo apt-get install libstdl2-devsudo apt-get install libstdl2-dev
如果sdl2.0 安裝出現錯誤的話可以選擇編譯安裝方式:
官網下載最新版本: www.libsdl.org/download-2.0.php
解壓后進入到目錄中,依次執行以下命令:
./configure make sudo make install
編譯安裝ffmpeg
進入ffmpeg文件夾,依次執行以下命令:
./configuremakesudo make install
在這里插入圖片描述
測試是否安裝成功
ffmpeg -version ffplay -version
laravel 安裝PHP-FFMpeg擴展
composer require php-ffmpeg/php-ffmpeg
基本使用
1.1、 引入到項目
引入完成,它需要制定 兩個配置文件信息,以便我們正常使用,也就是上文所講的 ffmpeg 和 ffprobe
1.2、全局配置
到 AppServiceProvider.php 中添加代碼
public function boot() { $this->registerSingleObject(); } private function registerSingleObject() { // $ffmpeg = FFMpeg::create(array( // 'ffmpeg.binaries' => '/usr/local/ffmpeg/ffmpeg', // 'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe', // 'timeout' => 3600, // The timeout for the underlying process // 'ffmpeg.threads' => 12, // The number of threads that FFMpeg should use // )); $this->app->singleton('ffmpeg', function ($app) { return FFMpeg::create([ 'ffmpeg.binaries' => '/usr/local/ffmpeg/ffmpeg', 'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe', ]); }); $this->app->singleton('ffprobe', function ($app) { return FFProbe::create([ 'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe', ]); }); }
使用單例模式獲取 FFMpeg 和 FFProbe 對象,其中 exec('which ffmpeg') 是獲取 程序位置信息,以便創建類
基礎封裝
舉例:
視頻的第一秒為封面
獲取視頻基礎信息
<?php namespace AppHelpers; use FFMpegCoordinateTimeCode; use IlluminateSupportStr; class FFMpegUtil{ // 獲取視頻信息 public static function getVideoInfo($streamPath) { $ffprobe = app('ffprobe'); $stream = $ffprobe->streams($streamPath)->videos()->first(); return $stream ? $stream->all() : []; } // 截取 public static function getCover($streamPath, $fromSecond) { $ffmpeg = app('ffmpeg'); $video = $ffmpeg->open($streamPath); $frame = $video->frame(TimeCode::fromSeconds($fromSecond)); //提取第幾秒的圖像 $fileName = 'video/' . Str::random(12) . '.jpg'; if (!is_dir(storage_path("video"))) { mkdir(storage_path("video"), 0777); } $frame->save(storage_path($fileName)); return $fileName; } }
業務使用
接受 Request 對象傳入的 視頻 為例子
public function saveVideotoQiniu($file){ Auth::loginUsingId(1); if ($user = getUser()) { // 1.判斷是否存在此視頻 $path = $file->getRealPath(); $hash = md5_file($path); $video = Video::firstOrNew(['json->hash' => $hash]); if ($video->id) { $video->touch(); return $video; } // 2.保存到 云 $cdn_path = $this->saveFile($file); $db_path = getPath($cdn_path); // 3.獲取截圖 $fileName = FFMpegUtil::getCover($path, 1); $image = $this->saveImage(new UploadedFile(storage_path($fileName), 'file.jpg')); //4.設置視頻信息 $data = []; $data = FFMpegUtil::getVideoInfo($path); $duration = array_get($data, 'duration'); $duration = $duration > 0 ? ceil($duration) : $duration; $video->path = $db_path; $video->user_id = $user->id; $video->setJsonData('width', array_get($data, 'width')); $video->setJsonData('height', array_get($data, 'height')); $video->duration = $duration; $video->setJsonData('cover', $image->path); $video->save(); } }
例子中的 saveImage 是將圖片上傳到 云端的函數,返回上傳后的圖片 url