1.1 下載原始碼
github地址:github.com/PHP-FFMpeg/PHP-FFMpeg
1.2 安裝依賴的庫
主要安裝三個:yasm ,sdl1.2 和 sdl2.0
安裝 yasm
sudo apt-get install yasm
安裝sdl1.2
sudo apt-get install libsdl1.2-dev
安裝 sdl2.0
sudo apt-get install libstdl2-devsudo apt-get install libstdl2-dev
如果sdl2.0 安裝出現錯誤的話可以選擇編譯安裝方式:
官網下載最新版本: www.libsdl.org/download-2.0.php
解壓後進入到目錄中,依次執行以下命令:
./configure
make
sudo make install
1.3編譯安裝ffmpeg
進入ffmpeg資料夾,依次執行以下命令:
./configure
make
sudo make install
在這裡插入圖片描述
1.4 測試是否安裝成功
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
本作品採用《CC 協議》,轉載必須註明作者和本文連結