이 패키지는 Laravel 10용 FFmpeg와의 통합을 제공합니다. Laravel의 파일 시스템은 파일 저장을 처리합니다.
우리는 Laravel 패키지를 개발하고 무료로 제공함으로써 커뮤니티를 자랑스럽게 지원합니다. 이 패키지가 시간을 절약해 주거나 전문적으로 의존하고 있다면 유지 관리 및 개발 후원을 고려하고 최신 프리미엄 패키지인 Inertia Table을 확인해 보세요. 문제와 끌어오기 요청을 추적하는 데는 시간이 걸리지만 기꺼이 도와드리겠습니다!
필터 및 기타 고급 기능에 대한 지원을 포함하여 PHP-FFMpeg를 둘러싼 매우 쉬운 래퍼입니다.
Laravel의 파일 시스템, 구성 시스템 및 로깅 처리와 통합됩니다.
Laravel 10과 호환되며 패키지 검색을 지원합니다.
HLS에 대한 기본 지원이 제공됩니다.
암호화된 HLS(AES-128) 및 순환 키(선택 사항)에 대한 기본 지원이 제공됩니다.
연결, 다중 입력/출력, 이미지 시퀀스(시간 경과), 복잡한 필터(및 매핑), 프레임/썸네일 내보내기에 대한 기본 지원이 제공됩니다.
워터마크 지원 기능이 내장되어 있습니다(위치 지정 및 조작).
비디오에서 모자이크/스프라이트/타일 생성을 지원하는 기능이 내장되어 있습니다.
VTT 미리보기 썸네일 파일 생성 지원 기능이 내장되어 있습니다.
PHP 8.1 이상이 필요합니다.
FFmpeg 4.4 및 5.0으로 테스트되었습니다.
최신 버전의 FFmpeg가 설치되어 있는지 확인하세요.
ffmpeg -버전
작곡가를 통해 패키지를 설치할 수 있습니다.
작곡가는 pbmedia/laravel-ffmpeg가 필요합니다.
패키지 검색을 사용하지 않는 경우 app.php
구성 파일에 서비스 공급자 및 Facade를 추가하세요.
// config/app.php'providers' => [ ...ProtoneMediaLaravelFFMpegSupportServiceProvider::클래스, ... ];'별칭' => [ ...'FFMpeg' => ProtoneMediaLaravelFFMpegSupportFFMpeg::class ... ];
artisan CLI 도구를 사용하여 구성 파일을 게시합니다.
php artisan Vendor:publish --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('어제.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('동영상')); } }
openUrl
메소드를 사용하여 웹에서 파일을 열 수 있습니다. 선택적 두 번째 매개변수를 사용하여 사용자 정의 HTTP 헤더를 지정할 수 있습니다.
FFMpeg::openUrl('https://videocoursebuilder.com/lesson-1.mp4'); FFMpeg::openUrl('https://videocoursebuilder.com/lesson-2.mp4', ['인증' => '기본 YWRtaW46MTIzNA==', ]);
인코딩이 실패하면 기본 FFMpegExceptionRuntimeException
클래스를 확장하는 ProtoneMediaLaravelFFMpegExportersEncodingException
이 발생합니다. 이 클래스에는 문제를 식별하는 데 도움이 되는 두 가지 방법이 있습니다. getCommand
메소드를 사용하면 모든 매개변수와 함께 실행된 명령을 가져올 수 있습니다. getErrorOutput
메소드는 전체 출력 로그를 제공합니다.
이 패키지의 이전 버전에서는 예외 메시지가 항상 인코딩 실패 였습니다. set_command_and_error_output_on_exception
구성 키를 false
로 업데이트하여 이 메시지로 다운그레이드할 수 있습니다.
노력하다 { FFMpeg::open('어제.mp3') ->내보내기() ->inFormat(새 Aac) ->저장('어제.aac'); } catch (EncodingException $Exception) {$command = $Exception->getCommand();$errorLog = $Exception->getErrorOutput(); }
Closure
통해 또는 PHP-FFMpeg의 필터 객체를 사용하여 필터를 추가할 수 있습니다:
FFMpegFiltersVideoVideoFilters를 사용하세요. FFMpeg::fromDisk('비디오') ->열기('steve_howe.mp4') ->addFilter(function (VideoFilters $filters) {$filters->resize(new FFMpegCoordinateDimension(640, 480)); }) ->내보내기() ->toDisk('converted_videos') ->inFormat(새로운 FFMpegFormatVideoX264) ->save('small_steve.mkv');// 또는$start = FFMpegCoordinateTimeCode::fromSeconds(5)$clipFilter = new FFMpegFiltersVideoClipFilter($start); FFMpeg::fromDisk('비디오') ->열기('steve_howe.mp4') ->추가필터($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 FFMpegCoordinateDimension(640, 480)); }) ->저장('small_steve.mkv');
크기 조정은 일반적인 작업이므로 전용 메서드를 추가했습니다.
FFMpeg::open('steve_howe.mp4') ->내보내기() ->inFormat(새로운 FFMpegFormatVideoX264) ->크기 조정(640, 480) ->저장('steve_howe_resize.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
메소드를 사용하여 웹에서 파일 열기도 지원합니다. 사용자 정의 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==', ], function($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('video.mp4') ->내보내기() ->inFormat(새 CopyFormat) ->저장('video.mkv');
// 'fromDisk()' 메서드는 필요하지 않습니다. 이제 파일은 // 구성 파일에 지정된 대로 // 기본 '디스크'에서 열립니다.FFMpeg::open('my_movie.mov')// FTP로 내보내기, WMV->export()로 변환 ->디스크로('ftp') ->inFormat(새로운 FFMpegFormatVideoWMV) ->save('my_movie.wmv')// Amazon S3로 내보내기, X264에서 변환->export() ->디스크로('s3') ->inFormat(새로운 FFMpegFormatVideoX264) ->save('my_movie.mkv');// 'toDisk()' 메서드를 버릴 수도 있습니다.// 이제 변환된 파일은 // 소스와 동일한 디스크에 저장됩니다!->export() ->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 FFMpegCoordinateTimeCode(...);$frame = $media->getFrameFromTimecode($timecode);
파일 시스템에 저장하는 대신 프레임의 원시 내용을 가져올 수도 있습니다.
$contents = FFMpeg::open('video.mp4') ->getFrameFromSeconds(2) ->내보내기() ->getFrameContents();
타일 기능을 강화하는 TileFilter
있습니다. 여러 프레임을 더 빠르고 간단하게 내보내기 위해 이 기능을 활용하여 몇 가지 도우미 메서드를 추가했습니다. 예를 들어, 고정된 간격으로 프레임을 내보내려면 exportFramesByInterval
메소드를 사용할 수 있습니다. 또는 내보내려는 프레임 수를 내보내기 exportFramesByAmount
메소드에 전달하면 비디오 지속 시간을 기준으로 간격이 계산됩니다.
FFMpeg::open('video.mp4') ->exportFramesByInterval(2) ->저장('thumb_%05d.jpg');
두 방법 모두 프레임의 너비와 높이를 지정하기 위해 선택적인 두 번째 및 세 번째 인수를 허용합니다. 너비와 높이를 모두 전달하는 대신 둘 중 하나만 전달할 수도 있습니다. FFmpeg는 소스의 종횡비를 존중합니다.
FFMpeg::open('video.mp4') ->exportFramesByAmount(10, 320, 180) ->저장('thumb_%05d.png');
두 방법 모두 JPEG와 같은 손실이 있는 형식으로 내보낼 때 이미지 품질을 지정하기 위해 선택적인 네 번째 인수를 허용합니다. 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');
너비와 높이를 모두 전달하는 대신 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('thumbnails.vtt'); }) ->저장('tile_%05d.jpg');
여러 변환을 연결하는 것은 MediaExporter
의 save
메소드가 MediaOpener
의 새로운 인스턴스를 반환하기 때문에 작동합니다. 예를 들어 하나의 비디오에서 여러 프레임을 내보내는 등 항목을 반복하는 데 이를 사용할 수 있습니다.
$mediaOpener = FFMpeg::open('video.mp4');foreach ([5, 15, 25] as $key => $seconds) {$mediaOpener = $mediaOpener->getFrameFromSeconds($seconds) ->내보내기() ->save("thumb_{$key}.png"); }
MediaOpener
에는 each
메서드도 함께 제공됩니다. 위의 예는 다음과 같이 리팩터링될 수 있습니다.
FFMpeg::open('video.mp4')->each([5, 15, 25], 함수 ($ffmpeg, $seconds, $key) {$ffmpeg->getFrameFromSeconds($seconds)->export()- >save("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가 라우팅 방법을 알 수 있도록 매핑을 추가해야 합니다. 이 패키지는 -filter_complex
부분의 형식, 출력 및 출력 레이블이라는 세 가지 매개 변수를 사용하는 addFormatOutputMapping
메서드를 제공합니다.
출력(두 번째 인수)은 ProtoneMediaLaravelFFMpegFilesystemMedia
의 인스턴스여야 합니다. make
메소드를 사용하여 인스턴스화하고 디스크 이름과 경로를 사용하여 호출할 수 있습니다(예제 참조).
별도의 비디오 및 오디오 입력을 하나의 출력으로 매핑하는 이 예를 확인하세요.
FFMpeg::fromDisk('로컬') ->열기(['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(' local', 'stacked_video.mp4'), ['0:a', '[v]']) ->저장();
단일 입력과 마찬가지로 addFilter
메서드에 콜백을 전달할 수도 있습니다. 그러면 FFMpegFiltersAdvancedMediaComplexFilters
인스턴스가 제공됩니다.
FFMpegFiltersAdvancedMediaComplexFilters를 사용하세요. FFMpeg::open(['video.mp4', 'video2.mp4']) ->내보내기() ->addFilter(function(ComplexFilters $filters) {// $filters->watermark(...);});
웹에서 파일을 여는 것도 비슷하게 작동합니다. 선택적으로 사용자 정의 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('비디오') ->열기('steve_howe.mp4') ->exportForHLS() ->setSegmentLength(10) // 선택사항->setKeyFrameInterval(48) // 선택사항->addFormat($lowBitrate) ->addFormat($midBitrate) ->추가형식($highBitrate) ->저장('adaptive_steve.m3u8');
HLS 내보내기의 addFormat
메소드는 콜백 메소드일 수 있는 선택적 두 번째 매개변수를 사용합니다. 이를 통해 형식별로 다양한 필터를 추가할 수 있습니다. 먼저, 복잡한 필터가 어떻게 처리되는지 이해하려면 다중 입력 섹션을 확인하세요.
addFilter
메소드를 사용하여 복잡한 필터를 추가할 수 있습니다( $lowBitrate
예시 참조). scale
필터를 많이 사용하기 때문에 helper 메소드가 있습니다( $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);$superBitrate = (새 X264)- >setKiloBitrate(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, 함수($media) {$media->addFilter(함수($filters, $in, $out) {$filters->custom($in, 'scale=1920:1200', $out ); // $in, $parameters, $out}); }) ->addFormat($superBitrate, function($media) {$media->addLegacyFilter(function ($filters) {$filters->resize(new FFMpegCoordinateDimension(2560, 1920)); }); }) ->저장('adaptive_steve.m3u8');
맞춤 패턴을 사용하여 세그먼트 및 재생 목록의 이름을 지정할 수 있습니다. useSegmentFilenameGenerator
는 5개의 인수를 제공합니다. 첫 번째, 두 번째 및 세 번째 인수는 내보내기의 기본 이름, 현재 반복의 형식 및 현재 반복의 키에 대한 정보를 제공합니다. 네 번째 인수는 세그먼트 패턴으로 호출해야 하는 콜백입니다. 다섯 번째 인수는 재생 목록 패턴으로 호출해야 하는 콜백입니다. 참고로 이는 기본 재생목록 이름이 아니라 각 형식의 재생목록 이름입니다.
FFMpeg::fromDisk('비디오') ->열기('steve_howe.mp4') ->exportForHLS() ->useSegmentFilenameGenerator(함수 ($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
메서드의 선택적 두 번째 매개 변수를 사용하여 이를 변경할 수 있습니다.
ProtoneMediaLaravelFFMpegExportersHLSExporter;$encryptionKey = HLSExporter::generateEncryptionKey();를 사용하세요. FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->암호화키($encryptionKey) ->추가형식($lowBitrate) ->addFormat($midBitrate) ->추가형식($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, ]); }) ->추가형식($lowBitrate) ->addFormat($midBitrate) ->추가형식($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 및 Middleware와 같은 기능을 사용할 수 있습니다.
이 예에서는 HLS 내보내기를 public
디스크에 저장하고 암호화 키를 공개적으로 사용할 수 없는 secrets
디스크에 저장했습니다. 브라우저가 암호화 키에 접근할 수 없기 때문에 비디오가 재생되지 않습니다. 각 재생 목록에는 암호화 키에 대한 경로가 있으며 액세스 가능한 엔드포인트를 가리키도록 해당 경로를 수정해야 합니다.
이 구현은 두 개의 경로로 구성됩니다. 하나는 암호화 키로 응답하고 다른 하나는 수정된 재생 목록으로 응답합니다. 첫 번째 경로( video.key
)는 비교적 간단하며 여기에 추가 논리를 추가해야 합니다.
두 번째 경로( video.playlist
)는 DynamicHLSPlaylist
클래스를 사용합니다. FFMpeg
파사드에서 dynamicHLSPlaylist
메소드를 호출하고, 미디어 파일을 여는 것과 유사하게 fromDisk
및 open
메소드를 활용하여 재생 목록을 열 수 있습니다. 그런 다음 세 개의 콜백을 제공해야 합니다. 각각은 상대 경로를 제공하고 그 대가로 전체 경로를 기대합니다. DynamicHLSPlaylist
클래스는 IlluminateContractsSupportResponsable
인터페이스를 구현하므로 인스턴스를 반환할 수 있습니다.
첫 번째 콜백(KeyUrlResolver)은 암호화 키에 대한 상대 경로를 제공합니다. 두 번째 콜백(MediaUrlResolver)은 미디어 세그먼트(.ts 파일)에 대한 상대 경로를 제공합니다. 세 번째 콜백(PlaylistUrlResolver)은 재생목록에 대한 상대 경로를 제공합니다.
이제 기본 재생 목록에 대한 전체 URL을 가져오기 위해 Storage::disk('public')->url('adaptive_steve.m3u8')
사용하는 대신, 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); })->이름('video.key'); Route::get('/video/{playlist}', function ($playlist) {return FFmpeg::dynamicHLSPlaylist() ->디스크에서('공개') ->열기($playlist) ->setKeyUrlResolver(function ($key) {return path('video.key', ['key' => $key]); }) ->setMediaUrlResolver(function ($mediaFilename) {return Storage::disk('public')->url($mediaFilename); }) ->setPlaylistUrlResolver(function ($playlistFilename) {return path('video.playlist', ['playlist' => $playlistFilename]); }); })->이름('video.playlist');
여기에서 HLS 암호화에 대한 라이브 코딩 세션을 찾을 수 있습니다.
https://www.youtube.com/watch?v=WlbzWoAcez4
getProcessOutput
메소드를 호출하여 원시 프로세스 출력을 얻을 수 있습니다. 사용 사례가 제한되어 있지만 이를 사용하여 파일을 분석할 수 있습니다(예: volumedetect
필터 사용). all
, errors
및 output
의 세 가지 메서드가 있는 ProtoneMediaLaravelFFMpegSupportProcessOutput
클래스를 반환합니다. 각 메서드는 해당 행이 포함된 배열을 반환합니다.
$processOutput = FFMpeg::open('video.mp4') ->내보내기() ->addFilter(['-filter:a', 'volumeDetect', '-f', 'null']) ->getProcessOutput();$processOutput->all();$processOutput->errors();$processOutput->out();
파일을 '열' 때 얻는 미디어 개체는 실제로 기본 드라이버에 속하는 미디어 개체를 보유합니다. 여기에서 볼 수 있듯이 동적 메서드 호출을 처리합니다. 이렇게 하면 기본 드라이버의 모든 메서드를 계속 사용할 수 있습니다.
// 이것은 ProtoneMediaLaravelFFMpegMediaOpener$media = FFMpeg::fromDisk('videos')->open('video.mp4');// 'getStreams' 메소드는 이후 기본 Media 객체에서 호출됩니다// 이 객체에는 존재하지 않습니다.$codec = $media->getStreams()->first()->get('codec_name');
기본 개체에 직접 액세스하려면 개체를 함수(호출)로 호출하세요.
// 이는 ProtoneMediaLaravelFFMpegMediaOpener$media = FFMpeg::fromDisk('videos')->open('video.mp4')의 인스턴스를 제공합니다.// 이는 FFMpegMediaMediaTypeInterface$baseMedia = $media()의 인스턴스를 제공합니다.
진행 리스너는 트랜스코딩된 백분율을 표시하지만 기본 패키지에는 현재 패스와 현재 시간을 표시하는 내부 AbstractProgressListener
도 있습니다. 사용 사례가 제한되어 있지만 이 리스너 인스턴스에 액세스하고 싶을 수도 있습니다. ProgressListenerDecorator
를 사용하여 형식을 장식하면 됩니다. 이 기능은 매우 실험적이므로 프로덕션에서 사용하기 전에 철저하게 테스트하십시오.
FFMpegFormatProgressListenerAbstractProgressListener 사용; ProtoneMediaLaravelFFMpegFFMpegProgressListenerDecorator 사용;$format = 새로운 FFMpegFormatVideoX264;$ decoratedFormat = ProgressListenerDecorator::장식($format); FFMpeg::open('video.mp4') ->내보내기() ->inFormat($장식형식) ->onProgress(function () use ($ decoratedFormat) {$listeners = $ decoratedFormat->getListeners(); // 리스너 배열$listener = $listeners[0]; // AbstractProgressListener$listener->getCurrentPass()의 인스턴스 ;$listener->getTotalPass();$listener->getCurrentTime(); }) ->저장('new_video.mp4');
기본 옵션 중 일부를 제거할 수 없으므로 내보내기 도구에 콜백을 추가하여 최종 FFmpeg 명령과 상호 작용할 수 있습니다. beforeSaving
메서드를 사용하여 하나 이상의 콜백을 추가할 수 있습니다.
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를 참조하세요.
$ 작곡가 테스트
자세한 내용은 CONTRIBUTING을 참조하세요.
Inertia Table
: 내장 쿼리 빌더가 장착 된 INERTIA.JS 용 Ultimate 테이블.
Laravel Blade On Demand
: 메모리에서 블레이드 템플릿을 컴파일하는 Laravel 패키지.
Laravel Cross Eloquent Search
: Laravel 패키지가 여러 웅변적인 모델을 검색합니다.
Laravel Eloquent Scope as Select
: PHP의 웅변 쿼리 스코프 및 제약 조건을 복제 중지하십시오. 이 패키지를 사용하면 쿼리 스코프와 제약 조건을 하위 쿼리로 추가하여 재사용 할 수 있습니다.
Laravel MinIO Testing Tools
: Minio S3 서버에 대해 테스트를 실행하십시오.
Laravel Mixins
: LaRavel COODIES 컬렉션.
Laravel Paddle
: Webhooks/Events를 지원하는 Laravel 용 API 통합.
Laravel Task Runner
: 블레이드 구성 요소와 같은 쉘 스크립트를 작성하여 로컬 또는 원격 서버에서 실행하십시오.
Laravel Verify New Email
:이 패키지는 새 이메일 주소 확인에 대한 지원을 추가합니다. 사용자가 이메일 주소를 업데이트하면 새 제품이 확인 될 때까지 이전 제품을 대체하지 않습니다.
Laravel XSS Protection
: Laravel Middleware는 앱을 크로스 사이트 스크립팅 (XSS)으로부터 보호합니다. 요청 입력을 소독하고 블레이드 에코 진술을 anatize 할 수 있습니다.
보안 관련 문제를 발견하면 문제 추적기를 사용하는 대신 [email protected]로 이메일을 보내주십시오. 질문이 있으면 이메일을 보내지 말고 질문이있는 경우 문제를여십시오.
파스칼 발젯
모든 기고자
MIT 라이센스 (MIT). 자세한 내용은 라이센스 파일을 참조하십시오.