該套件為 Laravel 10 提供了與 FFmpeg 的整合。
我們很自豪透過開發 Laravel 包並免費贈送來支持社區。如果該軟體包可以節省您的時間或您在專業上依賴它,請考慮贊助維護和開發並查看我們最新的高級軟體包:慣性表。追蹤問題和拉取請求需要時間,但我們很樂意提供協助!
PHP-FFMpeg 的超級簡單包裝,包括對過濾器和其他高級功能的支援。
與 Laravel 的檔案系統、設定係統和日誌處理整合。
相容於 Laravel 10,支援包發現。
對 HLS 的內建支援。
內建支援加密 HLS (AES-128) 和輪換密鑰(可選)。
內建支援串聯、多個輸入/輸出、影像序列(延時)、複雜濾鏡(和映射)、幀/縮圖導出。
內建支援浮水印(定位和操作)。
內建支援從影片建立馬賽克/精靈/圖塊。
內建支援產生VTT 預覽縮圖檔。
需要 PHP 8.1 或更高版本。
使用 FFmpeg 4.4 和 5.0 進行測試。
驗證您是否安裝了最新版本的 FFmpeg:
ffmpeg-版本
您可以透過 Composer 安裝該軟體包:
作曲家需要 pbmedia/laravel-ffmpeg
如果您不使用 Package Discovery,請將服務提供者和 Facade 新增至您的app.php
設定檔。
// config/app.php'providers' => [ ...ProtoneMediaLaravelFFMpegSupportServiceProvider::類, …… ];'別名' => [ ...'FFMpeg' => ProtoneMediaLaravelFFMpegSupportFFMpeg::class …… ];
使用 artisan CLI 工具發佈設定檔:
php artisan 供應商:發佈 --provider="ProtoneMediaLaravelFFMpegSupportServiceProvider"
set_command_and_error_output_on_exception
配置鍵現在預設為true
,使異常提供更多資訊。請閱讀處理異常部分以了解更多資訊。
enable_logging
配置鍵已被log_channel
取代,用於選擇將訊息寫入日誌時使用的日誌通道。如果您仍然想要完全停用日誌記錄,可以將新的設定鍵設定為false
。
HLS導出的段長度和關鍵影格間隔應為2
或更大; less 不再支持。
由於 Laravel 9 已從 Flysystem 1.x 遷移到 3.x,因此該版本與 Laravel 8 或更早版本不相容。
如果您使用浮水印處理功能,請確保將spatie/image
升級至 v2。
命名空間已變更為ProtoneMediaLaravelFFMpeg
,外觀已重新命名為ProtoneMediaLaravelFFMpegSupportFFMpeg
,服務提供者已重命名為ProtoneMediaLaravelFFMpegSupportServiceProvider
。
仍然支援連結匯出,但您必須為每個匯出重新套用篩選器。
HLS 播放清單現在包括位元率、幀率和解析度資料。這些段落也使用新的命名模式(了解更多)。請驗證您的匯出在您的播放器中是否仍然有效。
HLS 匯出現在是作為一項作業執行,而不是單獨匯出每種格式/串流。這使用了 FFMpeg 的map
和filter_complex
功能。將所有對addFilter
呼叫替換為addLegacyFilter
可能就足夠了,但某些過濾器應手動遷移。請閱讀 HLS 文件以了解有關新增篩選器的更多資訊。
轉換音訊或視訊檔案:
FFMpeg::fromDisk('歌曲') ->打開('昨天.mp3') -> 匯出() ->toDisk('converted_songs') ->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
實例:
上傳視訊控制器類 {公用函數__invoke(請求$請求) { FFMpeg::open($request->file('video')); } }
您可以使用openUrl
方法從 Web 開啟檔案。您可以使用可選的第二個參數指定自訂 HTTP 標頭:
FFMpeg::openUrl('https://videocoursebuilder.com/lesson-1.mp4'); FFMpeg::openUrl('https://videocoursebuilder.com/lesson-2.mp4', ['授權' => '基本 YWRtaW46MTIzNA==', ]);
當編碼失敗時,應拋出ProtoneMediaLaravelFFMpegExportersEncodingException
,該異常擴展了底層FFMpegExceptionRuntimeException
類別。此類有兩種方法可以幫助您識別問題。使用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('視訊') ->開啟('steve_howe.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('視訊') ->開啟('steve_howe.mp4') ->addFilter($clipFilter) -> 匯出() ->toDisk('converted_videos') ->inFormat(新 FFMpegFormatVideoX264) ->儲存('short_steve.mkv');
您也可以在export
方法之後呼叫addFilter
方法:
使用 FFMpegFiltersVideoVideoFilters; FFMpeg::fromDisk('視訊') ->開啟('steve_howe.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_resized.mp4');
第一個參數是寬度,第二個參數是高度。可選的第三個參數是模式。您可以在fit
(預設)、 inset
、 width
或height
之間進行選擇。可選的第四個參數是一個布林值,是否強制使用標準比率。您可以在FFMpegFiltersVideoResizeFilter
類別中找到有關這些模式的資訊。
有時您不想使用內建過濾器。您可以透過提供一組選項來套用您自己的篩選器。這可以是一個陣列或多個字串作為參數:
FFMpeg::fromDisk('視訊') ->開啟('steve_howe.mp4') ->addFilter(['-itsoffset', 1]);// 或FFMpeg::fromDisk('videos') ->開啟('steve_howe.mp4') ->addFilter('-itsoffset', 1);
您可以使用addWatermark
方法輕鬆添加浮水印。使用WatermarkFactory
,您可以從特定磁碟開啟浮水印文件,就像打開音訊或視訊檔案一樣。當您放棄fromDisk
方法時,它會使用filesystems.php
設定檔中指定的預設磁碟。
開啟浮水印檔案後,您可以使用top
、 right
、 bottom
和left
方法對其進行定位。這些方法的第一個參數是偏移量,它是可選的並且可以是負數。
使用 ProtoneMediaLaravelFFMpegFiltersWatermarkFactory; FFMpeg::fromDisk('視訊') ->開啟('steve_howe.mp4') ->addWatermark(function(WatermarkFactory $watermark) {$watermark->fromDisk('local') ->開啟('標誌.png') ->右(25) ->底部(25); });
除了使用位置方法之外,您還可以使用horizontalAlignment
和verticalAlignment
方法。
對於水平對齊,您可以使用WatermarkFactory::LEFT
、 WatermarkFactory::CENTER
和WatermarkFactory::RIGHT
常數。對於垂直對齊,您可以使用WatermarkFactory::TOP
、 WatermarkFactory::CENTER
和WatermarkFactory::BOTTOM
常數。兩種方法都採用可選的第二個參數,即偏移量。
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');// 或 $watermark->openUrl('https://videocoursebuilder.com/ logo.png', ['授權' => '基本YWRtaW46MTIzNA==', ]); });
如果您想要對 GET 請求進行更多控制,可以傳入可選的第三個參數,該參數為您提供 Curl 資源。
$watermark->openUrl('https://videocoursebuilder.com/logo.png', ['授權' => '基本 YWRtaW46MTIzNA==', ], 函數($curl) {curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); });
該包可以透過使用 Spatie 的 Image 包來操作水印。首先,使用 Composer 安裝該軟體包:
作曲家需要空間/圖像
現在您可以在WatermarkFactory
實例上再連結一種操作方法:
FFMpeg::open('steve_howe.mp4') ->addWatermark(function(WatermarkFactory $watermark) {$watermark->open('logo.png') ->右(25) ->底部(25) ->寬度(100) ->高度(100) ->灰階(); });
查看文件以了解所有可用的方法。
該套件附帶ProtoneMediaLaravelFFMpegFFMpegCopyFormat
類,可讓您匯出檔案而無需對串流進行轉碼。您可能想使用它來使用另一個容器:
使用 ProtoneMediaLaravelFFMpegFFMpegCopyFormat; FFMpeg::open('視頻.mp4') -> 匯出() ->inFormat(新的CopyFormat) ->保存('視頻.mkv');
// 不需要「fromDisk()」方法,檔案現在將從預設「磁碟」打開, // 設定檔中指定。 export() ->toDisk('ftp') ->inFormat(新 FFMpegFormatVideoWMV) ->save('my_movie.wmv')//導出到Amazon S3,在X264中轉換->export() ->toDisk('s3') ->inFormat(新 FFMpegFormatVideoX264) ->save('my_movie.mkv');// 你甚至可以放棄 'toDisk()' 方法,// 現在轉換後的檔案將被儲存到 // 與來源相同的磁碟! ->inFormat(新 FFMpegFormatVideoWebM) ->save('my_movie.webm')// 您可以選擇設定匯出檔案的可見性//->export() ->inFormat(新 FFMpegFormatVideoWebM) ->withVisibility('公開') ->儲存('my_movie.webm')
FFMpeg::fromDisk('視訊') ->開啟('steve_howe.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($時間碼);
您還可以獲得幀的原始內容,而不是將其保存到檔案系統:
$contents = FFMpeg::open('video.mp4') ->getFrameFromSeconds(2) -> 匯出() ->getFrameContents();
有一個TileFilter
可以支援 Tile 功能。為了讓匯出多個影格更快、更簡單,我們利用此功能添加了一些輔助方法。例如,您可以使用exportFramesByInterval
方法以固定間隔匯出訊框。或者,您可以將要匯出的幀數傳遞給exportFramesByAmount
方法,然後該方法將根據影片的持續時間計算間隔。
FFMpeg::open('視頻.mp4') ->exportFramesByInterval(2) ->儲存('thumb_%05d.jpg');
兩種方法都接受可選的第二個和第三個參數來指定框架的寬度和高度。您也可以只傳遞其中之一,而不是同時傳遞寬度和高度。 FFmpeg 將尊重來源的寬高比。
FFMpeg::open('視頻.mp4') ->exportFramesByAmount(10, 320, 180) ->保存('thumb_%05d.png');
當您匯出為有損格式(如 JPEG)時,這兩種方法都接受可選的第四個參數來指定影像的品質。 JPEG 的範圍是2-31
,其中2
是最好的質量, 31
是最差的。
FFMpeg::open('視頻.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');
您也可以只傳遞其中之一,例如scale(160)
或scale(null, 90)
,而不是同時傳遞寬度和高度。將尊重寬高比。 TileFactory
也有margin
、 padding
、 width
和height
方法。還有一種quality
方法可以指定匯出為有損格式(如 JPEG)時的品質。 JPEG 的範圍是2-31
,其中2
是最好的質量, 31
是最差的。
該軟體包還可以產生 WebVTT 檔案以將預覽縮圖新增至您的影片播放器。 JW 播放器對此提供開箱即用的支持,並且還有社區驅動的 Video.js 插件可用。您可以使用所需的檔名來呼叫TileFactory
上的generateVTT
方法:
FFMpeg::open('steve_howe.mp4') ->exportTile(函數(TileFactory $factory) {$factory->間隔(10) ->規模(320, 180) ->格(5, 5) ->generateVTT('縮圖.vtt'); }) ->儲存('tile_%05d.jpg');
連結多個轉換是有效的,因為MediaExporter
的save
方法傳回MediaOpener
的新實例。您可以使用它來循環瀏覽項目,例如從一個影片匯出多個幀:
$mediaOpener = FFMpeg::open('video.mp4');foreach ([5, 15, 25] as $key => $seconds) {$mediaOpener = $mediaOpener->getFrameFromSeconds($seconds) -> 匯出() ->保存(“thumb_{$key}.png”); }
MediaOpener
也附帶了each
方法。上面的例子可以重構如下:
FFMpeg::open('video.mp4')->each([5, 15, 25], function ($ffmpeg, $seconds, $key) {$ffmpeg->getFrameFromSeconds($seconds)->export()- >保存(“thumb_{$key}.png”); });
您可以使用匯出器上的asTimelapseWithFramerate
方法從一系列影像建立延時攝影
FFMpeg::open('feature_%04d.png') -> 匯出() ->asTimelapseWithFramerate(1) ->inFormat(新X264) ->儲存('timelapse.mp4');
您可以開啟多個輸入,甚至可以從不同的磁碟開啟。這使用了 FFMpeg 的map
和filter_complex
功能。您可以透過使用陣列連結open
方法來開啟多個檔案。您可以混合來自不同磁碟的輸入。
FFMpeg::open('video1.mp4')->open('video2.mp4'); FFMpeg::open(['video1.mp4', 'video2.mp4']); FFMpeg::fromDisk('上傳') ->開啟('video1.mp4') ->fromDisk('存檔') ->開啟('video2.mp4');
當您開啟多個輸入時,您必須新增映射,以便 FFMpeg 知道如何路由它們。該套件提供了addFormatOutputMapping
方法,該方法採用三個參數:格式、輸出以及-filter_complex
部分的輸出標籤。
輸出(第二個參數)應該是ProtoneMediaLaravelFFMpegFilesystemMedia
的實例。您可以使用make
方法實例化,並使用磁碟名稱和路徑呼叫它(請參閱範例)。
查看此範例,它將單獨的視訊和音訊輸入映射到一個輸出。
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(...);});
從網路開啟檔案的工作原理類似。您可以將 URL 陣列傳遞給openUrl
方法,也可以選擇使用自訂 HTTP 標頭。
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
配置鍵設定為自訂路徑來修改它。
您可以建立 M3U8 播放清單來執行 HLS。
$lowBitrate = (新 X264)->setKiloBitrate(250);$midBitrate = (新 X264)->setKiloBitrate(500);$highBitrate = (新 X264)->setKiloBitrate(1000); FFMpeg::fromDisk('視訊') ->開啟('steve_howe.mp4') ->exportForHLS() ->setSegmentLength(10) // 可選->setKeyFrameInterval(48) // 可選->addFormat($lowBitrate) ->addFormat($midBitrate) ->addFormat($highBitrate) ->保存('adaptive_steve.m3u8');
HLS 導出器的addFormat
方法採用可選的第二個參數,該參數可以是回呼方法。這允許您為每種格式添加不同的過濾器。首先,請查看多個輸入部分以了解如何處理複雜的篩選器。
您可以使用addFilter
方法新增複雜的過濾器(請參閱$lowBitrate
範例)。由於scale
過濾器被大量使用,因此有一個輔助方法(請參閱$midBitrate
範例)。您也可以使用可呼叫物件來存取ComplexFilters
實例。該套件提供了$in
和$out
參數,因此您不必擔心它(請參閱$highBitrate
範例)。
HLS 匯出是使用 FFMpeg 的map
和filter_complex
功能建構的。這是對早期版本 (1.x - 6.x) 的重大更改,早期版本對每種格式執行一次匯出。如果您要升級,請將addFilter
呼叫替換為addLegacyFilter
呼叫並驗證結果(請參閱$superBitrate
範例)。並非所有過濾器都能以這種方式運作,有些過濾器需要手動升級。
$lowBitrate = (新 X264)->setKiloBitrate(250);$midBitrate = (新 X264)->setKiloBitrate(500);$highBitrate = (新 X264)->setKiloBitrate(1000);$highBitrate = (新 X264)->setKiloBitrate(1000);$highBitrate = (新 X264)->setKiloBitrate(1000);$superBrate >設定千位元率(1500); FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->addFormat($lowBitrate, function($media) {$media->addFilter('scale=640:480'); }) ->addFormat($midBitrate, 函數($media) {$media->scale(960, 720); }) ->addFormat($highBitrate, function ($media) {$media->addFilter(function ($filters, $in, $out) {$filters->custom($in, 'scale=1920:1200', $out ); // $輸入,$參數,$輸出}); }) ->addFormat($superBitrate, function($media) {$media->addLegacyFilter(function ($filters) {$filters->resize(new FFMpegCooperativeDimension(2560, 1920)); }); }) ->保存('adaptive_steve.m3u8');
您可以使用自訂模式來命名片段和播放清單。 useSegmentFilenameGenerator
為您提供 5 個參數。第一個、第二個和第三個參數提供有關導出的基本名稱、當前迭代的格式和當前迭代的鍵的資訊。第四個參數是您應該使用段模式呼叫的回呼。第五個參數是您應該使用播放清單模式呼叫的回調。請注意,這不是主播放清單的名稱,而是每種格式的播放清單的名稱。
FFMpeg::fromDisk('視訊') ->開啟('steve_howe.mp4') ->exportForHLS() ->useSegmentFilenameGenerator(function ($name, $format, $key, callable $segments, callable $playlist) {$segments("{$name}-{$format->getKiloBitrate()}-{$key}-%03d .ts");$playlist("{$name}-{$format->getKiloBitrate()}-{$key}.m3u8"); });
您可以使用 AES-128 加密來加密每個 HLS 區段。為此,請使用金鑰呼叫 HLS 導出器上的withEncryptionKey
方法。我們在HLSExporter
類別上提供了generateEncryptionKey
輔助方法來產生金鑰。請確保妥善儲存密鑰,因為如果沒有密鑰,導出的結果將毫無價值。預設情況下,金鑰的檔案名稱是secret.key
,但您可以使用withEncryptionKey
方法的可選第二個參數進行變更。
使用 ProtoneMediaLaravelFFMpegExportersHLSExporter;$encryptionKey = HLSExporter::generateEncryptionKey(); FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->withEncryptionKey($加密金鑰) ->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
方法有一個可選的第二個參數,用於設定使用相同金鑰的段數。預設為1
。
FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->withRotatingEncryptionKey($callable, 10);
某些檔案系統,尤其是廉價且緩慢的 VPS 上的檔案系統,速度不夠快,無法處理旋轉金鑰。這可能會導致編碼異常,例如No key URI specified in key info file
。一個可能的解決方案是為金鑰使用不同的存儲,您可以使用temporary_files_encrypted_hls
配置金鑰指定該儲存。在基於 UNIX 的系統上,您可以使用tmpfs
檔案系統來提高讀取/寫入速度:
// config/laravel-ffmpeg.phpreturn ['temporary_files_encrypted_hls' => '/dev/shm'];
為了更好地使用加密的 HLS,我們新增了一個DynamicHLSPlaylist
類,可以專門針對您的應用程式動態修改播放清單。這樣,您可以新增身份驗證和授權邏輯。由於我們使用普通的 Laravel 控制器,因此您可以使用 Gates 和中間件等功能。
在此範例中,我們已將 HLS 匯出儲存到public
磁碟,並將加密金鑰儲存到secrets
磁碟,該磁碟不公開。由於瀏覽器無法存取加密金鑰,因此不會播放影片。每個播放清單都有加密金鑰的路徑,我們需要修改這些路徑以指向可存取的端點。
該實現由兩條路線組成。一種使用加密金鑰進行回應,另一種使用修改後的播放清單進行回應。第一條路線 ( video.key
) 相對簡單,您應該在此處添加額外的邏輯。
第二條路線 ( video.playlist
) 使用DynamicHLSPlaylist
類別。呼叫FFMpeg
外觀上的dynamicHLSPlaylist
方法,與開啟媒體檔案類似,您可以使用fromDisk
和open
方法開啟播放清單。然後您必須提供三個回調。他們每個人都給你一個相對路徑,並期望一個完整的路徑作為回報。由於DynamicHLSPlaylist
類別實作IlluminateContractsSupportResponsable
接口,因此您可以傳回該實例。
第一個回呼 (KeyUrlResolver) 為您提供加密金鑰的相對路徑。第二個回呼 (MediaUrlResolver) 為您提供媒體段(.ts 檔案)的相對路徑。第三個回呼 (PlaylistUrlResolver) 為您提供播放清單的相對路徑。
現在,您可以使用 route Storage::disk('public')->url('adaptive_steve.m3u8')
route('video.playlist', ['playlist' => 'adaptive_steve.m3u8'])
。 DynamicHLSPlaylist
類別負責處理所有路徑和 url。
路線::get('/video/secret/{key}', function ($key) {return Storage::disk('secrets')->download($key); })->name('video.key'); 路線::get('/video/{playlist}', function ($playlist) {return FFMpeg::dynamicHLSPlaylist() ->fromDisk('公共') ->開啟($播放清單) ->setKeyUrlResolver(function ($key) {回傳路由('video.key', ['key' => $key]); }) ->setMediaUrlResolver(function ($mediaFilename) {return Storage::disk('public')->url($mediaFilename); }) ->setPlaylistUrlResolver(function ($playlistFilename) {回傳路由('video.playlist', ['playlist' => $playlistFilename]); }); })->name('video.playlist');
在這裡您可以找到有關 HLS 加密的即時編碼會話:
https://www.youtube.com/watch?v=WlbzWoAcez4
您可以透過呼叫getProcessOutput
方法來取得原始進程輸出。儘管用例有限,但您可以使用它來分析文件(例如,使用volumedetect
過濾器)。它傳回一個ProtoneMediaLaravelFFMpegSupportProcessOutput
類,該類別有三個方法: all
、 errors
和output
。每個方法都會傳回一個包含對應行的陣列。
$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 物件上調用,因為//該物件上不存在它。
如果您想直接存取底層對象,請將該物件作為函數呼叫(呼叫):
// 這為您提供了一個ProtoneMediaLaravelFFMpegMediaOpener$media = FFMpeg::fromDisk('videos')->open('video.mp4');// 這為您提供了一個FFMpegMediaMediaTypeInterface); 的 $media(face);實例;
進度偵聽器公開轉碼百分比,但底層套件還有一個內部AbstractProgressListener
,它公開當前通道和當前時間。儘管用例有限,但您可能想要存取此偵聽器實例。您可以透過使用ProgressListenerDecorator
裝飾格式來做到這一點。此功能是高度實驗性的,因此請確保在生產中使用它之前進行徹底的測試。
使用 FFMpegFormatProgressListenerAbstractProgressListener;使用 ProtoneMediaLaravelFFMpegFFMpegProgressListenerDecorator;$format = 新 FFMpegFormatVideoX264;$decoratedFormat = ProgressListenerDecorator::decorate($format); FFMpeg::open('視頻.mp4') -> 匯出() ->inFormat($decoratedFormat) ->onProgress(function () use ($decoratedFormat) {$listeners = $decoratedFormat->getListeners(); // 監聽器陣列$listener = $listeners[0]; // AbstractProgressListener 實例$listener->getCurrentC() ; $listener->getTotalPass();$listener->getCurrentTime(); }) ->儲存('new_video.mp4');
由於我們無法擺脫一些底層選項,因此您可以透過向導出器添加回調來與最終的 FFmpeg 命令進行互動。您可以使用beforeSaving
方法新增一個或多個回呼:
FFMpeg::open('視頻.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
請參閱變更日誌以了解有關最近更改內容的更多資訊。
$ 作曲家測試
詳細資訊請參閱貢獻。
Inertia Table
:內建查詢產生器的 Inertia.js 終極表。
Laravel Blade On Demand
:用於在記憶體中編譯 Blade 模板的 Laravel 套件。
Laravel Cross Eloquent Search
:Laravel 套件用於搜尋多個 Eloquent 模型。
Laravel Eloquent Scope as Select
:停止在 PHP 中重複 Eloquent 查詢範圍和約束。該套件允許您透過將查詢範圍和約束新增為子查詢來重複使用它們。
Laravel MinIO Testing Tools
:針對 MinIO S3 伺服器執行測試。
Laravel Mixins
:Laravel 好東西的集合。
Laravel Paddle
:Laravel 的 Paddle.com API 集成,支援 webhooks/事件。
Laravel Task Runner
:編寫像 Blade Components 這樣的 Shell 腳本並在本地或遠端伺服器上運行它們。
Laravel Verify New Email
:此套件新增了驗證新電子郵件地址的支援:當使用者更新其電子郵件地址時,在驗證新電子郵件地址之前,它不會取代舊電子郵件地址。
Laravel XSS Protection
:Laravel 中間件可保護您的應用程式免受跨站點腳本(XSS)的侵害。它清理請求輸入,並且可以清理 Blade echo 語句。
如果您發現任何與安全相關的問題,請發送電子郵件至 [email protected],而不是使用問題追蹤器。請不要透過電子郵件發送任何問題,如果有問題請提出問題。
帕斯卡·巴爾傑特
所有貢獻者
麻省理工學院許可證 (MIT)。請參閱許可證文件以獲取更多資訊。