このパッケージは、Laravel 10 の FFmpeg との統合を提供します。Laravel のファイルシステムは、ファイルのストレージを処理します。
私たちは、Laravel パッケージを開発し、無料で配布することでコミュニティを誇りを持ってサポートしています。このパッケージで時間を節約できる場合、またはプロとして信頼している場合は、メンテナンスと開発のスポンサーになることを検討し、最新のプレミアム パッケージである慣性テーブルをチェックしてください。問題やプル リクエストの追跡には時間がかかりますが、喜んでお手伝いいたします。
フィルターやその他の高度な機能のサポートを含む、PHP-FFMpeg の非常に簡単なラッパー。
Laravelのファイルシステム、設定システム、ロギング処理との統合。
Laravel 10と互換性があり、Package Discoveryをサポートします。
HLS の組み込みサポート。
暗号化された HLS (AES-128) および回転キー (オプション) の組み込みサポート。
連結、複数の入力/出力、画像シーケンス (タイムラプス)、複雑なフィルター (およびマッピング)、フレーム/サムネイルのエクスポートの組み込みサポート。
ウォーターマーク (位置決めと操作) の組み込みサポート。
ビデオからモザイク/スプライト/タイルを作成するためのサポートが組み込まれています。
VTT プレビュー サムネイルファイルを生成するためのサポートが組み込まれています。
PHP 8.1 以降が必要です。
FFmpeg 4.4 および 5.0 でテスト済み。
最新バージョンの FFmpeg がインストールされていることを確認します。
ffmpeg -バージョン
パッケージは、composer 経由でインストールできます。
コンポーザーには pbmedia/laravel-ffmpeg が必要です
Package Discovery を使用していない場合は、サービス プロバイダーとファサードをapp.php
構成ファイルに追加します。
// config/app.php'providers' => [ ...ProtoneMediaLaravelFFMpegSupportServiceProvider::class、 ... ];'エイリアス' => [ ...'FFMpeg' => ProtoneMediaLaravelFFMpegSupportFFMpeg::class ... ];
artisan CLI ツールを使用して構成ファイルを公開します。
php 職人ベンダー:publish --provider="ProtoneMediaLaravelFFMpegSupportServiceProvider"
set_command_and_error_output_on_exception
構成キーがデフォルトでtrue
になり、例外がより多くの情報を提供できるようになりました。詳細については、「例外の処理」セクションを参照してください。
ログにメッセージを書き込むときに使用するログ チャネルを選択するために、 enable_logging
構成キーがlog_channel
に置き換えられました。それでもログを完全に無効にしたい場合は、新しい構成キーをfalse
に設定できます。
HLS エクスポートのセグメント長とキーフレーム間隔は2
以上である必要があります。以下はサポートされなくなりました。
Laravel 9 は Flysystem 1.x から 3.x に移行したため、このバージョンは Laravel 8 以前とは互換性がありません。
ウォーターマーク操作機能を使用している場合は、 spatie/image
v2 にアップグレードしてください。
名前空間はProtoneMediaLaravelFFMpeg
に変更され、ファサードの名前はProtoneMediaLaravelFFMpegSupportFFMpeg
に変更され、サービス プロバイダーの名前はProtoneMediaLaravelFFMpegSupportServiceProvider
に変更されました。
エクスポートの連鎖は引き続きサポートされていますが、エクスポートごとにフィルターを再適用する必要があります。
HLS プレイリストには、ビットレート、フレームレート、解像度のデータが含まれるようになりました。セグメントでは、新しい命名パターンも使用されます (詳細を参照)。エクスポートがプレーヤーで引き続き機能することを確認してください。
HLS エクスポートは、各形式/ストリームを個別にエクスポートするのではなく、 1 つのジョブとして実行されるようになりました。これには、FFMpeg のmap
とfilter_complex
機能が使用されます。 addFilter
へのすべての呼び出しをaddLegacyFilter
に置き換えるだけで十分な場合がありますが、一部のフィルターは手動で移行する必要があります。フィルターの追加について詳しくは、HLS のドキュメントをお読みください。
オーディオまたはビデオ ファイルを変換します。
FFMpeg::fromDisk('曲') ->open('昨日.mp3') ->エクスポート() ->toDisk('変換された曲') ->inFormat(新しいFFMpegFormatAudioAac) ->保存('昨日.aac');
fromDisk()
メソッドの代わりに、 fromFilesystem()
メソッドを使用することもできます。ここで、 $filesystem
IlluminateContractsFilesystemFilesystem
のインスタンスです。
$media = FFMpeg::fromFilesystem($filesystem)->open('yesterday.mp3');
トランスコーディングの進行状況を監視できます。 onProgress
メソッドを使用してコールバックを提供すると、完了した割合がわかります。このパッケージの以前のバージョンでは、コールバックをフォーマット オブジェクトに渡す必要がありました。
FFMpeg::open('steve_howe.mp4') ->エクスポート() ->onProgress(function ($percentage) {echo "{$percentage}% がトランスコードされました"; });
コールバックは、 $remaining
(秒単位) と$rate
も公開する場合があります。
FFMpeg::open('steve_howe.mp4') ->エクスポート() ->onProgress(function ($percentage, $remaining, $rate) {echo "残り {$remaining} 秒のレート: {$rate}"; });
アップロードされたファイルは、 Request
インスタンスから直接開くことができます。リクエストが中止された場合に備えて、最初にアップロードしたファイルを保存することをお勧めしますが、必要に応じて、 UploadedFile
インスタンスを開くこともできます。
クラスUploadVideoController {パブリック関数 __invoke(リクエスト $request) { FFMpeg::open($request->file('video')); } }
openUrl
メソッドを使用して、Web からファイルを開くことができます。オプションの 2 番目のパラメーターを使用してカスタム HTTP ヘッダーを指定できます。
FFMpeg::openUrl('https://videocoursebuilder.com/lesson-1.mp4'); FFMpeg::openUrl('https://videocoursebuilder.com/lesson-2.mp4', ['認可' => '基本 YWRtaW46MTIzNA==', ]);
エンコードが失敗すると、基になるFFMpegExceptionRuntimeException
クラスを拡張するProtoneMediaLaravelFFMpegExportersEncodingException
がスローされます。このクラスには、問題の特定に役立つ 2 つのメソッドがあります。 getCommand
メソッドを使用すると、実行されたコマンドをすべてのパラメーターとともに取得できます。 getErrorOutput
メソッドを使用すると、完全な出力ログが得られます。
このパッケージの以前のバージョンでは、例外のメッセージは常にEncoding failedでした。 set_command_and_error_output_on_exception
構成キーをfalse
に更新することで、このメッセージにダウングレードできます。
試す { FFMpeg::open('昨日.mp3') ->エクスポート() ->inFormat(新しいAac) ->保存('昨日.aac'); catch (EncodingException $例外) {$command = $例外->getCommand();$errorLog = $例外->getErrorOutput(); }
フィルターは、 Closure
を通じて、または PHP-FFMpeg の Filter オブジェクトを使用して追加できます。
FFMpegFiltersVideoVideoFilters を使用します。 FFMpeg::fromDisk('ビデオ') ->open('スティーブ_ハウ.mp4') ->addFilter(function (VideoFilters $filters) {$filters->resize(new FFMpegCooperativeDimension(640, 480)); }) ->エクスポート() ->toDisk('converted_videos') ->inFormat(新しいFFMpegFormatVideoX264) ->save('small_steve.mkv');// または $start = FFMpegCooperativeTimeCode::fromSeconds(5)$clipFilter = new FFMpegFiltersVideoClipFilter($start); FFMpeg::fromDisk('ビデオ') ->open('スティーブ_ハウ.mp4') ->addFilter($clipFilter) ->エクスポート() ->toDisk('converted_videos') ->inFormat(新しいFFMpegFormatVideoX264) ->保存('short_steve.mkv');
また、 export
メソッドの後にaddFilter
メソッドを呼び出すこともできます。
FFMpegFiltersVideoVideoFilters を使用します。 FFMpeg::fromDisk('ビデオ') ->open('スティーブ_ハウ.mp4') ->エクスポート() ->toDisk('converted_videos') ->inFormat(新しいFFMpegFormatVideoX264) ->addFilter(function (VideoFilters $filters) {$filters->resize(new FFMpegCooperativeDimension(640, 480)); }) ->保存('small_steve.mkv');
サイズ変更は一般的な操作であるため、専用のメソッドを追加しました。
FFMpeg::open('steve_howe.mp4') ->エクスポート() ->inFormat(新しいFFMpegFormatVideoX264) ->リサイズ(640, 480) ->保存('steve_howe_resize.mp4');
最初の引数は幅、2 番目の引数は高さです。オプションの 3 番目の引数はモードです。 fit
(デフォルト)、 inset
、 width
、またはheight
から選択できます。オプションの 4 番目の引数は、標準比率の使用を強制するかどうかのブール値です。これらのモードについては、 FFMpegFiltersVideoResizeFilter
クラスで確認できます。
場合によっては、組み込みフィルターを使用したくない場合があります。一連のオプションを指定することで、独自のフィルターを適用できます。これには、引数として配列または複数の文字列を指定できます。
FFMpeg::fromDisk('ビデオ') ->open('スティーブ_ハウ.mp4') ->addFilter(['-itsoffset', 1]);// orFFMpeg::fromDisk('videos') ->open('スティーブ_ハウ.mp4') ->addFilter('-itsoffset', 1);
addWatermark
メソッドを使用すると、ウォーターマークを簡単に追加できます。 WatermarkFactory
を使用すると、オーディオ ファイルやビデオ ファイルを開くのと同じように、特定のディスクからウォーターマーク ファイルを開くことができます。 fromDisk
メソッドを破棄すると、 filesystems.php
構成ファイルで指定されたデフォルトのディスクが使用されます。
ウォーターマーク ファイルを開いたら、 top
、 right
、 bottom
、 left
各メソッドを使用してファイルを配置できます。これらのメソッドの最初のパラメータはオフセットです。これはオプションであり、負の値にすることもできます。
ProtoneMediaLaravelFFMpegFiltersWatermarkFactory を使用します。 FFMpeg::fromDisk('ビデオ') ->open('スティーブ_ハウ.mp4') ->addWatermark(function(WatermarkFactory $watermark) {$watermark->fromDisk('local') ->開く('ロゴ.png') →右(25) ->下(25); });
Position メソッドを使用する代わりに、 horizontalAlignment
メソッドとverticalAlignment
メソッドを使用することもできます。
水平方向の配置には、 WatermarkFactory::LEFT
、 WatermarkFactory::CENTER
、およびWatermarkFactory::RIGHT
定数を使用できます。垂直方向の配置には、 WatermarkFactory::TOP
、 WatermarkFactory::CENTER
、およびWatermarkFactory::BOTTOM
定数を使用できます。どちらのメソッドも、オプションの 2 番目のパラメーター (オフセット) を受け取ります。
FFMpeg::open('steve_howe.mp4') ->addWatermark(function(WatermarkFactory $watermark) {$watermark->open('logo.png') ->horizontalAlignment(WatermarkFactory::LEFT, 25) ->verticalAlignment(WatermarkFactory::TOP, 25); });
WatermarkFactory
openUrl
メソッドを使用して Web からファイルを開くこともサポートしています。カスタム HTTP ヘッダーもサポートします。
FFMpeg::open('steve_howe.mp4') ->addWatermark(function(WatermarkFactory $watermark) {$watermark->openUrl('https://videocoursebuilder.com/logo.png');// or$watermark->openUrl('https://videocoursebuilder.com/ logo.png', ['認可' => '基本 YWRtaW46MTIzNA==', ]); });
GET リクエストをより詳細に制御したい場合は、オプションの 3 番目のパラメーターを渡すことができます。これにより、Curl リソースが提供されます。
$watermark->openUrl('https://videocoursebuilder.com/logo.png', ['認可' => '基本 YWRtaW46MTIzNA==', ], function($curl) {curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); });
このパッケージは、Spatie の Image パッケージを使用してウォーターマークを操作できます。まず、Composer を使用してパッケージをインストールします。
作曲家にはスパティ/イメージが必要です
これで、 WatermarkFactory
インスタンスにもう 1 つの操作メソッドを連鎖させることができます。
FFMpeg::open('steve_howe.mp4') ->addWatermark(function(WatermarkFactory $watermark) {$watermark->open('logo.png') →右(25) →下(25) ->幅(100) ->高さ(100) ->グレースケール(); });
利用可能なすべての方法についてはドキュメントを確認してください。
このパッケージには、ストリームをトランスコードせずにファイルをエクスポートできるProtoneMediaLaravelFFMpegFFMpegCopyFormat
クラスが付属しています。これを使用して別のコンテナを使用することもできます。
ProtoneMediaLaravelFFMpegFFMpegCopyFormat を使用します。 FFMpeg::open('video.mp4') ->エクスポート() ->inFormat(新しいコピーフォーマット) ->保存('video.mkv');
// 'fromDisk()' メソッドは必要ありません。ファイルは // 設定ファイルで指定されているように、デフォルトの 'ディスク' から開かれます。FFMpeg::open('my_movie.mov')// FTP にエクスポート、WMV->export() で変換 ->toDisk('ftp') ->inFormat(新しいFFMpegFormatVideoWMV) ->save('my_movie.wmv')// Amazon S3 にエクスポート、X264 で変換 ->export() ->toDisk('s3') ->inFormat(新しいFFMpegFormatVideoX264) ->save('my_movie.mkv');// 'toDisk()' メソッドを破棄することもできます。// これで、変換されたファイルは、// ソースと同じディスクに保存されます!->export() ->inFormat(新しいFFMpegFormatVideoWebM) ->save('my_movie.webm')// オプションで、エクスポートされたファイルの可視性を設定できます// ->export() ->inFormat(新しいFFMpegFormatVideoWebM) ->withVisibility('パブリック') ->保存('my_movie.webm')
FFMpeg::fromDisk('ビデオ') ->open('スティーブ_ハウ.mp4') ->getFrameFromSeconds(10) ->エクスポート() ->toDisk('サムネイル') ->save('FrameAt10sec.png');// 'getFrameFromSeconds()' メソッドの代わりに、// 'getFrameFromString()' または // 'getFrameFromTimecode()' メソッドも使用できます:$media = FFMpeg ::open('steve_howe.mp4');$frame = $media->getFrameFromString('00:00:13.37');// または $timecode = new FFMpegCooperativeTimeCode(...);$frame = $media->getFrameFromTimecode($timecode);
ファイルシステムに保存する代わりに、フレームの生のコンテンツを取得することもできます。
$contents = FFMpeg::open('video.mp4') ->getFrameFromSeconds(2) ->エクスポート() ->getFrameContents();
タイル機能を強化するTileFilter
があります。複数のフレームのエクスポートをより高速かつ簡単にするために、この機能を利用していくつかのヘルパー メソッドを追加しました。たとえば、 exportFramesByInterval
メソッドを使用して、固定間隔でフレームをエクスポートできます。あるいは、エクスポートするフレーム数をexportFramesByAmount
メソッドに渡すと、ビデオの長さに基づいて間隔が計算されます。
FFMpeg::open('video.mp4') ->exportFramesByInterval(2) ->保存('thumb_%05d.jpg');
どちらのメソッドも、フレームの幅と高さを指定するオプションの 2 番目と 3 番目の引数を受け入れます。幅と高さの両方を渡す代わりに、どちらか一方だけを渡すこともできます。 FFmpeg はソースのアスペクト比を尊重します。
FFMpeg::open('video.mp4') ->exportFramesByAmount(10, 320, 180) ->保存('thumb_%05d.png');
どちらのメソッドも、JPEG などの非可逆形式にエクスポートするときに画像の品質を指定するオプションの 4 番目の引数を受け入れます。 JPEG の範囲は2-31
で、 2
が最高品質、 31
最低品質です。
FFMpeg::open('video.mp4') ->exportFramesByInterval(2, 640, 360, 5) ->保存('thumb_%05d.jpg');
ビデオからタイルを作成できます。タイルの生成方法を指定するには、 exportTile
メソッドを呼び出します。以下の例では、生成された各イメージは 3x5 グリッド (つまり 15 フレームを含む) で構成され、各フレームは 160x90 ピクセルです。ビデオから 5 秒ごとにフレームが取得されます。幅と高さの両方を渡す代わりに、どちらか一方だけを渡すこともできます。 FFmpeg はソースのアスペクト比を尊重します。
ProtoneMediaLaravelFFMpegFiltersTileFactory を使用します。 FFMpeg::open('steve_howe.mp4') ->exportTile(関数 (TileFactory $factory) {$factory->interval(5) ->スケール(160、90) ->グリッド(3, 5); }) ->保存('tile_%05d.jpg');
width と height の両方を渡す代わりに、 scale(160)
やscale(null, 90)
のように、どちらか一方だけを渡すこともできます。アスペクト比は尊重されます。 TileFactory
は、 margin
、 padding
、 width
、およびheight
メソッドもあります。 JPEG などの非可逆形式にエクスポートするときに品質を指定するquality
方法もあります。 JPEG の範囲は2-31
で、 2
が最高品質、 31
最低品質です。
このパッケージは、ビデオ プレーヤーにプレビュー サムネイルを追加するための WebVTT ファイルを生成することもできます。これは JW プレーヤーによってすぐにサポートされており、コミュニティ主導の Video.js 用プラグインも利用できます。目的のファイル名を使用して、 TileFactory
でgenerateVTT
メソッドを呼び出すことができます。
FFMpeg::open('steve_howe.mp4') ->exportTile(関数 (TileFactory $factory) {$factory->interval(10) ->スケール(320、180) ->グリッド(5, 5) ->generateVTT('サムネイル.vtt'); }) ->保存('tile_%05d.jpg');
MediaExporter
のsave
メソッドがMediaOpener
の新しいインスタンスを返すため、複数の変換を連鎖させることができます。これを使用してアイテムをループすることができます。たとえば、1 つのビデオから複数のフレームをエクスポートできます。
$mediaOpener = FFMpeg::open('video.mp4');foreach ([5, 15, 25] as $key => $秒) {$mediaOpener = $mediaOpener->getFrameFromSeconds($秒) ->エクスポート() ->save("thumb_{$key}.png"); }
MediaOpener
にはeach
メソッドも付属しています。上記の例は次のようにリファクタリングできます。
FFMpeg::open('video.mp4')->each([5, 15, 25], function ($ffmpeg, $秒, $key) {$ffmpeg->getFrameFromSeconds($秒)->export()- >save("thumb_{$key}.png"); });
エクスポーターのasTimelapseWithFramerate
メソッドを使用して、一連の画像からタイムラプスを作成できます。
FFMpeg::open('feature_%04d.png') ->エクスポート() ->フレームレート付きタイムラプス(1) ->inFormat(新しい X264) ->保存('タイムラプス.mp4');
異なるディスクからでも複数の入力を開くことができます。これには、FFMpeg のmap
とfilter_complex
機能が使用されます。配列を使用してopen
メソッドを連鎖させることで、複数のファイルを開くことができます。異なるディスクからの入力を混合できます。
FFMpeg::open('video1.mp4')->open('video2.mp4'); FFMpeg::open(['video1.mp4', 'video2.mp4']); FFMpeg::fromDisk('アップロード') ->open('video1.mp4') ->fromDisk('アーカイブ') ->open('video2.mp4');
複数の入力を開く場合は、FFMpeg が入力をルーティングする方法を認識できるようにマッピングを追加する必要があります。このパッケージは、 addFormatOutputMapping
メソッドを提供します。このメソッドは、 -filter_complex
部分の形式、出力、および出力ラベルという 3 つのパラメーターを取ります。
出力 (2 番目の引数) は、 ProtoneMediaLaravelFFMpegFilesystemMedia
のインスタンスである必要があります。 make
メソッドを使用してインスタンスを作成し、ディスクの名前とパスを指定して呼び出します (例を参照)。
別々のビデオ入力とオーディオ入力を 1 つの出力にマッピングするこの例を確認してください。
FFMpeg::fromDisk('ローカル') ->open(['video.mp4', 'audio.m4a']) ->エクスポート() ->addFormatOutputMapping(new X264, Media::make('local', 'new_video.mp4'), ['0:v', '1:a']) ->保存();
これは基礎となるライブラリの例です。
// このコードは 2 つの入力ビデオを受け取り、それらを 1 つの出力ビデオに水平にスタックし、// この新しいビデオに最初のビデオのオーディオを追加します。 (// 入力が 1 つ、出力が 1 つだけの単純なフィルター グラフでは不可能です).FFMpeg::fromDisk('local') ->open(['video.mp4', 'video2.mp4']) ->エクスポート() ->addFilter('[0:v][1:v]', 'hstack', '[v]') // $in, $parameters, $out->addFormatOutputMapping(new X264, Media::make('ローカル'、'stacked_video.mp4')、['0:a'、'[v]']) ->保存();
単一入力と同様に、コールバックをaddFilter
メソッドに渡すこともできます。これにより、 FFMpegFiltersAdvancedMediaComplexFilters
のインスタンスが得られます。
FFMpegFiltersAdvancedMediaComplexFilters を使用します。 FFMpeg::open(['video.mp4', 'video2.mp4']) ->エクスポート() ->addFilter(function(ComplexFilters $filters) {// $filters->watermark(...);});
Web からファイルを開く場合も同様に機能します。オプションでカスタム HTTP ヘッダーを使用して、URL の配列をopenUrl
メソッドに渡すことができます。
FFMpeg::openUrl(['https://videocoursebuilder.com/lesson-3.mp4','https://videocoursebuilder.com/lesson-4.mp4', ]); FFMpeg::openUrl(['https://videocoursebuilder.com/lesson-3.mp4','https://videocoursebuilder.com/lesson-4.mp4', ], ['認可' => '基本 YWRtaW46MTIzNA==', ]);
URL ごとに別の HTTP ヘッダーのセットを使用する場合は、 openUrl
メソッドをチェーンできます。
FFMpeg::openUrl('https://videocoursebuilder.com/lesson-5.mp4', ['認可' => '基本 YWRtaW46MTIzNA==', ])->openUrl('https://videocoursebuilder.com/lesson-6.mp4', ['認可' => '基本 bmltZGE6NDMyMQ==', ]);
FFMpeg::fromDisk('ローカル') ->open(['video.mp4', 'video2.mp4']) ->エクスポート() ->concatWithoutTranscoding() ->保存('concat.mp4');
FFMpeg::fromDisk('ローカル') ->open(['video.mp4', 'video2.mp4']) ->エクスポート() ->inFormat(新しい X264) ->concatWithTranscoding($hasVideo = true, $hasAudio = true) ->保存('concat.mp4');
Media
クラスを使用すると、ファイルの長さを決定できます。
$media = FFMpeg::open('wwdc_2006.mp4');$durationInSeconds = $media->getDurationInSeconds(); // int$durationInMiliseconds = $media->getDurationInMiliseconds(); を返します。 // 浮動小数点を返します
リモート ディスクに対してファイルを開いたり保存したりすると、サーバー上に一時ファイルが作成されます。これらのファイルのエクスポートまたは処理が完了したら、 cleanupTemporaryFiles()
メソッドを呼び出してファイルをクリーンアップできます。
FFMpeg::cleanupTemporaryFiles();
デフォルトでは、一時ディレクトリのルートは PHP のsys_get_temp_dir()
メソッドによって評価されますが、 temporary_files_root
構成キーをカスタム パスに設定することで変更できます。
HLS を行うために M3U8 プレイリストを作成できます。
$lowBitrate = (新しい X264)->setKiloBitrate(250);$midBitrate = (新しい X264)->setKiloBitrate(500);$highBitrate = (新しい X264)->setKiloBitrate(1000); FFMpeg::fromDisk('ビデオ') ->open('スティーブ_ハウ.mp4') ->exportForHLS() ->setSegmentLength(10) // オプション->setKeyFrameInterval(48) // オプション->addFormat($lowBitrate) ->addFormat($midBitrate) ->addFormat($highBitrate) ->保存('adaptive_steve.m3u8');
HLS エクスポータのaddFormat
メソッドは、オプションの 2 番目のパラメータをコールバック メソッドとして受け取ります。これにより、形式ごとに異なるフィルターを追加できます。まず、 「複数の入力」セクションを確認して、複雑なフィルターがどのように処理されるかを理解してください。
addFilter
メソッドを使用して、複雑なフィルターを追加できます ( $lowBitrate
例を参照)。 scale
フィルターは頻繁に使用されるため、ヘルパー メソッドがあります ( $midBitrate
例を参照)。呼び出し可能オブジェクトを使用してComplexFilters
インスタンスにアクセスすることもできます。パッケージには$in
引数と$out
引数が用意されているため、心配する必要はありません ( $highBitrate
例を参照)。
HLS エクスポートは、FFMpeg のmap
およびfilter_complex
機能を使用して構築されます。これは、形式ごとに 1 つのエクスポートを実行していた以前のバージョン (1.x ~ 6.x) からの重大な変更です。アップグレードする場合は、 addFilter
呼び出しをaddLegacyFilter
呼び出しに置き換えて、結果を確認します ( $superBitrate
例を参照)。すべてのフィルターがこのように機能するわけではなく、一部のフィルターは手動でアップグレードする必要があります。
$lowBitrate = (新しい X264)->setKiloBitrate(250);$midBitrate = (新しい X264)->setKiloBitrate(500);$highBitrate = (新しい X264)->setKiloBitrate(1000);$superBitrate = (新しい X264)- >セットキロビットレート(1500); FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->addFormat($lowBitrate, function($media) {$media->addFilter('scale=640:480'); }) ->addFormat($midBitrate, function($media) {$media->scale(960, 720); }) ->addFormat($highBitrate, function ($media) {$media->addFilter(function ($filters, $in, $out) {$filters->custom($in, 'scale=1920:1200', $out ); // $in、$parameters、$out}); }) ->addFormat($superBitrate, function($media) {$media->addLegacyFilter(function ($filters) {$filters->resize(new FFMpegCooperativeDimension(2560, 1920)); }); }) ->保存('adaptive_steve.m3u8');
カスタム パターンを使用して、セグメントとプレイリストに名前を付けることができます。 useSegmentFilenameGenerator
は 5 つの引数が与えられます。 1 番目、2 番目、および 3 番目の引数は、エクスポートのベース名、現在の反復の形式、および現在の反復のキーに関する情報を提供します。 4 番目の引数は、セグメントパターンで呼び出す必要があるコールバックです。 5 番目の引数は、プレイリストパターンで呼び出す必要があるコールバックです。これはプライマリ プレイリストの名前ではなく、各フォーマットのプレイリストの名前であることに注意してください。
FFMpeg::fromDisk('ビデオ') ->open('スティーブ_ハウ.mp4') ->exportForHLS() ->useSegmentFilenameGenerator(function ($name, $format, $key, 呼び出し可能な $segments, 呼び出し可能な $playlist) {$segments("{$name}-{$format->getKiloBitrate()}-{$key}-%03d .ts");$playlist("{$name}-{$format->getKiloBitrate()}-{$key}.m3u8"); });
AES-128 暗号化を使用して各 HLS セグメントを暗号化できます。これを行うには、キーを使用して HLS エクスポーターのwithEncryptionKey
メソッドを呼び出します。 HLSExporter
クラスには、キーを生成するためのgenerateEncryptionKey
ヘルパー メソッドが提供されています。エクスポートされた結果はキーがなければ価値がないため、キーは必ず適切に保管してください。デフォルトでは、キーのファイル名はsecret.key
ですが、 withEncryptionKey
メソッドのオプションの 2 番目のパラメータを使用して変更できます。
ProtoneMediaLaravelFFMpegExportersHLSExporter;$encryptionKey = HLSExporter::generateEncryptionKey(); を使用します。 FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->withEncryptionKey($encryptionKey) ->addFormat($lowBitrate) ->addFormat($midBitrate) ->addFormat($highBitrate) ->保存('adaptive_steve.m3u8');
HLS エクスポートの安全性をさらに高めるために、エクスポートされた各セグメントのキーをローテーションできます。これにより、保存する必要がある複数のキーが生成されます。 withRotatingEncryptionKey
メソッドを使用してこの機能を有効にし、キーのストレージを実装するコールバックを提供します。
FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->withRotatingEncryptionKey(function ($filename, $contents) {$videoId = 1;// このコールバックを使用して暗号化キーを保存しますStorage::disk('secrets')->put($videoId . '/' . $filename, $contents);// または...DB::table('hls_secrets')->insert(['video_id' => $videoId,'filename' => $filename,'contents' => $contents, ]); }) ->addFormat($lowBitrate) ->addFormat($midBitrate) ->addFormat($highBitrate) ->保存('adaptive_steve.m3u8');
withRotatingEncryptionKey
メソッドには、同じキーを使用するセグメントの数を設定するオプションの 2 番目の引数があります。これのデフォルトは1
です。
FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->withRotatingEncryptionKey($callable, 10);
一部のファイルシステム、特に安価で遅い VPS では、回転キーを処理できるほど高速ではありません。これによりNo key URI specified in key info file
などのエンコード例外が発生する可能性があります。考えられる解決策の 1 つは、キーに別のストレージを使用することです。これは、 temporary_files_encrypted_hls
構成キーを使用して指定できます。 UNIX ベースのシステムでは、 tmpfs
ファイルシステムを使用して読み取り/書き込み速度を向上させることができます。
// config/laravel-ffmpeg.phpreturn ['temporary_files_encrypted_hls' => '/dev/shm'];
暗号化された HLS の操作をさらに改善するために、アプリケーション専用にプレイリストをオンザフライで変更するDynamicHLSPlaylist
クラスを追加しました。このようにして、認証および認可ロジックを追加できます。プレーンな Laravel コントローラーを使用しているため、ゲートやミドルウェアなどの機能を使用できます。
この例では、HLS エクスポートをpublic
ディスクに保存し、暗号化キーを公開されていないsecrets
ディスクに保存しました。ブラウザは暗号化キーにアクセスできないため、ビデオは再生されません。各プレイリストには暗号化キーへのパスがあり、アクセス可能なエンドポイントを指すようにこれらのパスを変更する必要があります。
この実装は 2 つのルートで構成されます。 1 つは暗号化キーで応答し、もう 1 つは変更されたプレイリストで応答します。最初のルート ( video.key
) は比較的単純なので、ここに追加のロジックを追加する必要があります。
2 番目のルート ( video.playlist
) は、 DynamicHLSPlaylist
クラスを使用します。 FFMpeg
ファサードでdynamicHLSPlaylist
メソッドを呼び出すと、メディア ファイルを開くのと同様に、 fromDisk
メソッドとopen
メソッドを利用してプレイリストを開くことができます。次に、3 つのコールバックを提供する必要があります。それぞれの関数は相対パスを提供し、完全なパスが返されることを期待しています。 DynamicHLSPlaylist
クラスはIlluminateContractsSupportResponsable
インターフェイスを実装しているため、インスタンスを返すことができます。
最初のコールバック (KeyUrlResolver) は、暗号化キーへの相対パスを提供します。 2 番目のコールバック (MediaUrlResolver) は、メディア セグメント (.ts ファイル) への相対パスを提供します。 3 番目のコールバック (PlaylistUrlResolver) は、プレイリストへの相対パスを提供します。
Storage::disk('public')->url('adaptive_steve.m3u8')
を使用してプライマリ プレイリストへの完全な URL を取得する代わりに、 route('video.playlist', ['playlist' => 'adaptive_steve.m3u8'])
を使用できるようになりました。 route('video.playlist', ['playlist' => 'adaptive_steve.m3u8'])
。 DynamicHLSPlaylist
クラスは、すべてのパスと URL を処理します。
Route::get('/video/secret/{key}', function ($key) {return Storage::disk('secrets')->download($key); })->name('video.key'); Route::get('/video/{playlist}', function ($playlist) {return FFMpeg::dynamicHLSPlaylist() ->fromDisk('パブリック') ->開く($プレイリスト) ->setKeyUrlResolver(function ($key) {return Route('video.key', ['key' => $key]); }) ->setMediaUrlResolver(function ($mediaFilename) {return Storage::disk('public')->url($mediaFilename); }) ->setPlaylistUrlResolver(function ($playlistFilename) {return Route('video.playlist', ['playlist' => $playlistFilename]); }); })->name('video.playlist');
ここでは、HLS 暗号化に関するライブ コーディング セッションを見つけることができます。
https://www.youtube.com/watch?v=WlbzWoAcez4
getProcessOutput
メソッドを呼び出すことで、生のプロセス出力を取得できます。使用例は限られていますが、ファイルの分析に使用できます (たとえば、 volumedetect
フィルターを使用)。これは、 all
、 errors
、 output
3 つのメソッドを持つProtoneMediaLaravelFFMpegSupportProcessOutput
クラスを返します。各メソッドは、対応する行を含む配列を返します。
$processOutput = FFMpeg::open('video.mp4') ->エクスポート() ->addFilter(['-filter:a', 'volumedetect', '-f', 'null']) ->getProcessOutput();$processOutput->all();$processOutput->errors();$processOutput->out();
ファイルを「開く」ときに取得する Media オブジェクトは、実際には、基礎となるドライバーに属する Media オブジェクトを保持します。ここでわかるように、動的メソッド呼び出しを処理します。こうすることで、基礎となるドライバーのすべてのメソッドを引き続き使用できます。
// これにより、ProtoneMediaLaravelFFMpegMediaOpener$media = FFMpeg::fromDisk('videos')->open('video.mp4') のインスタンスが得られます;// 'getStreams' メソッドは、基礎となる Media オブジェクトで呼び出されます。このオブジェクトには存在しません。$codec = $media->getStreams()->first()->get('codec_name');
基礎となるオブジェクトに直接アクセスしたい場合は、オブジェクトを関数として呼び出します (invoke)。
// これにより、ProtoneMediaLaravelFFMpegMediaOpener$media = FFMpeg::fromDisk('videos')->open('video.mp4') のインスタンスが得られます;// これにより、FFMpegMediaMediaTypeInterface$baseMedia = $media(); のインスタンスが得られます。
進行状況リスナーはトランスコードされたパーセンテージを公開しますが、基になるパッケージには現在のパスと現在の時間を公開する内部AbstractProgressListener
もあります。使用例は限られていますが、このリスナー インスタンスにアクセスしたい場合があります。これを行うには、形式をProgressListenerDecorator
で装飾します。この機能は非常に実験的なものであるため、運用環境で使用する前に必ず徹底的にテストしてください。
FFMpegFormatProgressListenerAbstractProgressListener を使用します;ProtoneMediaLaravelFFMpegFFMpegProgressListenerDecorator を使用します;$format = new FFMpegFormatVideoX264;$decoratedFormat = ProgressListenerDecorator::decorate($format); FFMpeg::open('video.mp4') ->エクスポート() ->inFormat($decoratedFormat) ->onProgress(function () use ($decoratedFormat) {$listeners = $decoratedFormat->getListeners(); // リスナーの配列$listener = $listeners[0]; // AbstractProgressListener のインスタンス$listener->getCurrentPass() ;$listener->getTotalPass();$listener->getCurrentTime(); }) ->保存('new_video.mp4');
基礎となるオプションの一部は削除できないため、エクスポーターにコールバックを追加することで、最終的な FFmpeg コマンドを操作できます。 beforeSaving
メソッドを使用して、1 つ以上のコールバックを追加できます。
FFMpeg::open('video.mp4') ->エクスポート() ->inFormat(新しい X264) ->beforeSaving(function ($commands) {$commands[] = '-hello';return $commands; }) ->保存('concat.mp4');
注: これは連結およびフレームのエクスポートでは機能しません。
このパッケージの使用を開始するのに役立つブログ投稿は次のとおりです。
https://protone.media/en/blog/how-to-use-ffmpeg-in-your-laravel-projects
ここでは、Video.js を使い始める方法について 20 分間で概要を説明します。 CDN からの Video.js の組み込み、Laravel Mix (Webpack) を使用した ES6 モジュールとしてのインポート、再利用可能な Vue.js コンポーネントの構築について説明します。
https://www.youtube.com/watch?v=nA1Jy8BPjys
カスタムフィルター
FFmpeg がコマンドの実行に失敗しました
ビデオファイルのサイズを取得する
トランスコーディングの進行状況の監視
FFProbeをロードできません
最近の変更点の詳細については、CHANGELOG を参照してください。
$ コンポーザーテスト
詳細については、「貢献」を参照してください。
Inertia Table
: 組み込みのクエリ ビルダーを備えた Inertia.js の究極のテーブル。
Laravel Blade On Demand
: メモリ内で Blade テンプレートをコンパイルするための Laravel パッケージ。
Laravel Cross Eloquent Search
: 複数の Eloquent モデルを検索するための Laravel パッケージ。
Laravel Eloquent Scope as Select
: PHP で Eloquent クエリ スコープと制約を複製するのをやめます。このパッケージを使用すると、クエリのスコープと制約をサブクエリとして追加して再利用できます。
Laravel MinIO Testing Tools
: MinIO S3 サーバーに対してテストを実行します。
Laravel Mixins
: Laravel の便利なコレクション。
Laravel Paddle
: Webhook/イベントをサポートする Laravel 用の Paddle.com API 統合。
Laravel Task Runner
: ブレードコンポーネントなどのシェルスクリプトを作成し、ローカルまたはリモートサーバー上で実行します。
Laravel Verify New Email
: このパッケージは、新しい電子メール アドレスを検証するためのサポートを追加します。ユーザーが電子メール アドレスを更新すると、新しいアドレスが検証されるまで古いアドレスは置き換えられません。
Laravel XSS Protection
: クロスサイトスクリプティング(XSS)からアプリを保護するLaravelミドルウェア。リクエスト入力をサニタイズし、Blade echo ステートメントをサニタイズすることもできます。
セキュリティ関連の問題を発見した場合は、問題トラッカーを使用する代わりに [email protected] に電子メールを送信してください。質問がある場合は電子メールで質問せず、問題を開いてください。
パスカル・バルジェット
すべての貢献者
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。