Laravel で動画エンコードするライブラリ、「protonemedia/laravel-ffmpeg」を利用します。
「laravel-ffmpeg」を利用する前に、 ffmpg のインストールが必要です。ここでは Macでのインストールを説明します。
Homebrew でffmpg をインストールします。また XCode Tools も事前インストールしておいてください。
% brew install ffmpeg
ffmpeg のバージョンを確認します。
% ffmpeg -version
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
Composer で laravel-ffmpeg をインストールします。
% composer require pbmedia/laravel-ffmpeg
artisan コマンドで laravel-ffmpeg をパブリッシュします。
php artisan vendor:publish --provider="ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider"
% php artisan vendor:publish
ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider の番号を入力します。
...
[13] Provider: Livewire\LivewireServiceProvider
[14] Provider: ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider
[15] Tag: config
...
>14
「Publishing complete」が表示されれば成功です。
Publishing complete.
パブリッシュが成功すると「config/laravel-ffmpeg.php」が作成されます。 「config/laravel-ffmpeg.php」の内容は以下の通りです。
return [
'ffmpeg' => [
'binaries' => env('FFMPEG_BINARIES', 'ffmpeg'),
'threads' => 12,
],
'ffprobe' => [
'binaries' => env('FFPROBE_BINARIES', 'ffprobe'),
],
'timeout' => 3600,
'enable_logging' => true,
'set_command_and_error_output_on_exception' => false,
'temporary_files_root' => env('FFMPEG_TEMPORARY_FILES_ROOT', sys_get_temp_dir()),
]
ffmpeg、ffprobeのパスをターミナルで調べます。
% which ffmpeg
/usr/local/bin/ffmpeg
% which ffprobe
/usr/local/bin/ffprobe
ffmpeg、ffprobeのパスを環境設定ファイル .env に ffmpeg 設定します。
FFMPEG_BINARIES=/usr/local/bin/ffmpeg
FFPROBE_BINARIES=/usr/local/bin/ffprobe
config/app.php に Providor と Facade の alias を設定をします。 namespace は「Pbmedia\LaravelFFMpeg\」です。
'providers' => [
...
ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider::class,
...
],
...
'providers' => [
...
'FFMpeg' => ProtoneMedia\LaravelFFMpeg\Support\FFMpeg::class,
...
]
storage/app/public/mp4/ に .mp4 ファイルをアップしておきます。 今回は「sample.mp4」とします。
Laravel の Controller などで確認してみましょう。
...
use ProtoneMedia\LaravelFFMpeg\Support\FFMpeg
...
class HomeController extends Controller
{
...
public function index()
{
$media = FFMpeg::fromDisk('public')->open('mp4/sample.mp4');
$mediaStreams = $media->getStreams();
$duration = $media->getDurationInSeconds();
$codec = $mediaStreams[0]->get('codec_name');
return view('admin.index')->with(
[
'mediaStreams' => $mediaStreams,
'duration' => $duration,
'codec' => $codec
]
)
}
...
}