laravel-ffmpeg を使う

2021/07/20

protonemedia/laravel-ffmpeg

Laravel で動画エンコードするライブラリ、「protonemedia/laravel-ffmpeg」を利用します。

ffmpg のインストール

「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

Laravel の設定

Composer で laravel-ffmpeg をインストール

Composer で laravel-ffmpeg をインストールします。


% composer require pbmedia/laravel-ffmpeg

artisan で publish

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.

laravel-ffmpeg.php の確認

パブリッシュが成功すると「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 のパスを設定

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

Providor と alias の設定

config/app.php に Providor と Facade の alias を設定をします。 namespace は「Pbmedia\LaravelFFMpeg\」です。


    'providers' => [
        ...
        ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider::class,
        ...
    ],
    ...
    'providers' => [
        ...
        'FFMpeg' => ProtoneMedia\LaravelFFMpeg\Support\FFMpeg::class,
        ...
    ]

mp4 をストレージにアップ

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
            ] 
        )
    }
    ...
}