แพ็คเกจนี้ให้การทำงานร่วมกับ FFmpeg สำหรับ Laravel 10 ระบบไฟล์ของ Laravel จัดการการจัดเก็บไฟล์
เราภูมิใจสนับสนุนชุมชนด้วยการพัฒนาแพ็คเกจ Laravel และแจกฟรี หากแพ็คเกจนี้ช่วยคุณประหยัดเวลาหรือหากคุณต้องพึ่งพามันอย่างมืออาชีพ โปรดพิจารณาสนับสนุนการบำรุงรักษาและการพัฒนา และดูแพ็คเกจพรีเมียมล่าสุดของเรา: Inertia Table การติดตามปัญหาและการดึงคำขอต้องใช้เวลา แต่เรายินดีที่จะช่วยเหลือ!
Wrapper ที่ใช้งานง่ายสุด ๆ รอบ ๆ PHP-FFMpeg รวมถึงการรองรับตัวกรองและคุณสมบัติขั้นสูงอื่น ๆ
บูรณาการกับระบบไฟล์ของ Laravel ระบบการกำหนดค่าและการจัดการการบันทึก
เข้ากันได้กับ Laravel 10 รองรับ Package Discovery
การสนับสนุน HLS ในตัว
รองรับ HLS ที่เข้ารหัส (AES-128) และปุ่มหมุนในตัว (อุปกรณ์เสริม)
การสนับสนุนในตัวสำหรับการต่อข้อมูล, อินพุต/เอาต์พุตหลายรายการ, ลำดับรูปภาพ (ไทม์แลปส์), ตัวกรองที่ซับซ้อน (และการแมป), การส่งออกเฟรม/ภาพขนาดย่อ
การสนับสนุนลายน้ำในตัว (การวางตำแหน่งและการจัดการ)
การสนับสนุนในตัวสำหรับการสร้างโมเสก/สไปรท์/ไทล์จากวิดีโอ
การสนับสนุนในตัวสำหรับการสร้างไฟล์ ภาพขนาดย่อ VTT Preview
ต้องใช้ PHP 8.1 หรือสูงกว่า
ทดสอบกับ FFmpeg 4.4 และ 5.0
ตรวจสอบว่าคุณติดตั้ง FFmpeg เวอร์ชันล่าสุดแล้ว:
ffmpeg -รุ่น
คุณสามารถติดตั้งแพ็คเกจผ่านทางผู้แต่ง:
ผู้แต่งต้องการ pbmedia/laravel-ffmpeg
เพิ่มผู้ให้บริการและ Facade ลงในไฟล์กำหนดค่า app.php
หากคุณไม่ได้ใช้ Package Discovery
// config/app.php'providers' => [ ...ProtoneMediaLaravelFFMpegSupportServiceProvider::คลาส, - ];'นามแฝง' => [ ...'FFMpeg' => ProtoneMediaLaravelFFMpegSupportFFMpeg::class - -
เผยแพร่ไฟล์ปรับแต่งโดยใช้เครื่องมือ Artisan CLI:
ผู้ขายช่างฝีมือ php: เผยแพร่ --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
เป็นเวอร์ชัน 2
เนมสเปซได้เปลี่ยนเป็น ProtoneMediaLaravelFFMpeg
ส่วนส่วนหน้าเปลี่ยนชื่อเป็น ProtoneMediaLaravelFFMpegSupportFFMpeg
และผู้ให้บริการได้เปลี่ยนชื่อเป็น ProtoneMediaLaravelFFMpegSupportServiceProvider
ยังคงรองรับการส่งออกแบบเชื่อมโยง แต่คุณต้องใช้ตัวกรองใหม่สำหรับการส่งออกแต่ละครั้ง
ขณะนี้เพลย์ลิสต์ HLS มีข้อมูลบิตเรต อัตราเฟรม และความละเอียด กลุ่มยังใช้รูปแบบการตั้งชื่อใหม่ (อ่านเพิ่มเติม) โปรดตรวจสอบว่าการส่งออกของคุณยังคงใช้งานได้ในเครื่องเล่นของคุณ
ขณะนี้การส่งออก HLS ดำเนินการเป็นงาน เดียว แทนที่จะส่งออกแต่ละรูปแบบ/สตรีมแยกกัน สิ่งนี้ใช้คุณสมบัติ map
และ filter_complex
ของ FFMpeg อาจเพียงพอแล้วที่จะแทนที่การเรียก addFilter
ทั้งหมดด้วย addLegacyFilter
แต่ตัวกรองบางตัวควรถูกโอนย้ายด้วยตนเอง โปรดอ่านเอกสารเกี่ยวกับ HLS เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มตัวกรอง
แปลงไฟล์เสียงหรือวิดีโอ:
FFMpeg::fromDisk ('เพลง') ->เปิด('yesterday.mp3') ->ส่งออก() ->toDisk('converted_songs') -> ในรูปแบบ (FFMpegFormatAudioAac ใหม่) ->บันทึก('yesterday.aac');
แทนที่จะใช้เมธอด fromDisk()
คุณยังสามารถใช้เมธอด fromFilesystem()
โดยที่ $filesystem
เป็นอินสแตนซ์ของ IlluminateContractsFilesystemFilesystem
$media = FFMpeg::fromFilesystem($filesystem)->open('yesterday.mp3');
คุณสามารถตรวจสอบความคืบหน้าในการแปลงรหัสได้ ใช้เมธอด onProgress
เพื่อจัดให้มีการติดต่อกลับ ซึ่งจะให้เปอร์เซ็นต์ที่เสร็จสมบูรณ์แก่คุณ ในเวอร์ชันก่อนหน้าของแพ็คเกจนี้ คุณต้องส่งการโทรกลับไปยังออบเจ็กต์รูปแบบ
FFMpeg::open('steve_howe.mp4') ->ส่งออก() ->onProgress(ฟังก์ชั่น ($เปอร์เซ็นต์) {echo "{$percentage}% แปลงรหัสแล้ว"; -
การโทรกลับอาจเปิดเผย $remaining
(เป็นวินาที) และ $rate
:
FFMpeg::open('steve_howe.mp4') ->ส่งออก() ->onProgress(function ($percentage, $remaining, $rate) {echo "เหลือ {$remaining} วินาทีที่อัตรา: {$rate}"; -
คุณสามารถเปิดไฟล์ที่อัปโหลดได้โดยตรงจากอินสแตนซ์ Request
มันอาจจะดีกว่าถ้าบันทึกไฟล์ที่อัพโหลดก่อนในกรณีที่คำขอถูกยกเลิก แต่ถ้าคุณต้องการ คุณสามารถเปิดอินสแตนซ์ UploadedFile
ได้:
คลาส UploadVideoController { ฟังก์ชั่นสาธารณะ __ วิงวอน (ขอ $ คำขอ) - FFMpeg::open($request->file('video')); - -
คุณสามารถเปิดไฟล์จากเว็บได้โดยใช้วิธี openUrl
คุณสามารถระบุส่วนหัว 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('yesterday.mp3') ->ส่งออก() -> ในรูปแบบ (Aac ใหม่) ->บันทึก('yesterday.aac'); } catch (EncodingException $Exception) {$command = $Exception->getCommand();$errorLog = $Exception->getErrorOutput(); -
คุณสามารถเพิ่มตัวกรองผ่าน Closure
หรือโดยใช้วัตถุตัวกรองของ PHP-FFMpeg:
ใช้ FFMpegFiltersVideoVideoFilters; FFMpeg::fromDisk('วิดีโอ') ->เปิด('steve_howe.mp4') ->addFilter(ฟังก์ชั่น (VideoFilters $filters) {$filters->resize(new FFMpegCoordinateDimension(640, 480)); - ->ส่งออก() ->toDisk('converted_videos') ->inFormat(FFMpegFormatVideoX264 ใหม่) ->บันทึก('small_steve.mkv');// หรือ$start = FFMpegCoordinateTimeCode::fromSeconds(5)$clipFilter = ใหม่ FFMpegFiltersVideoClipFilter($start); FFMpeg::fromDisk('วิดีโอ') ->เปิด('steve_howe.mp4') ->addFilter($clipFilter) ->ส่งออก() ->toDisk('converted_videos') ->inFormat(FFMpegFormatVideoX264 ใหม่) ->บันทึก('short_steve.mkv');
คุณยังสามารถเรียกใช้เมธอด addFilter
หลัง วิธี export
:
ใช้ FFMpegFiltersVideoVideoFilters; FFMpeg::fromDisk('วิดีโอ') ->เปิด('steve_howe.mp4') ->ส่งออก() ->toDisk('converted_videos') ->inFormat(FFMpegFormatVideoX264 ใหม่) ->addFilter(ฟังก์ชั่น (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]);// orFFMpeg::fromDisk('วิดีโอ') ->เปิด('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') ->เปิด('logo.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') ->การจัดตำแหน่งแนวนอน(ลายน้ำโรงงาน::ซ้าย, 25) ->การจัดตำแหน่งแนวตั้ง(ลายน้ำFactory::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พื้นฐาน==', ], ฟังก์ชัน($curl) {curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); -
แพ็คเกจนี้สามารถจัดการลายน้ำได้โดยใช้แพ็คเกจ Spatie's 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(รูปแบบการคัดลอกใหม่) ->บันทึก('video.mkv');
// ไม่จำเป็นต้องใช้เมธอด 'fromDisk()' ไฟล์จะถูกเปิดจากค่าเริ่มต้น 'disk' ตามที่ระบุไว้ใน // ไฟล์ปรับแต่ง FFMpeg::open('my_movie.mov')// ส่งออกไปยัง FTP, แปลงเป็น WMV->export() ->toDisk('ftp') -> ในรูปแบบ (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('วิดีโอ') ->เปิด('steve_howe.mp4') ->getFrameFromSeconds(10) ->ส่งออก() ->toDisk('รูปขนาดย่อ') ->save('FrameAt10sec.png');// แทนที่จะใช้วิธี 'getFrameFromSeconds()' คุณสามารถ// ยังใช้ 'getFrameFromString()' หรือ // 'getFrameFromTimecode()' method:$media = FFMpeg ::open('steve_howe.mp4');$frame = $media->getFrameFromString('00:00:13.37');// or$timecode = new FFMpegCoordinateTimeCode(...);$frame = $media->getFrameFromTimecode($timecode);
คุณยังสามารถรับเนื้อหาดิบของเฟรมแทนที่จะบันทึกลงในระบบไฟล์:
$contents = FFMpeg::open('video.mp4') ->getFrameFromSeconds(2) ->ส่งออก() ->getFrameContents();
มี TileFilter
ที่ขับเคลื่อนคุณสมบัติ Tile เพื่อให้การส่งออกหลายเฟรมเร็วขึ้นและง่ายขึ้น เราได้ใช้คุณสมบัตินี้เพื่อเพิ่มวิธีการช่วยเหลือบางอย่าง ตัวอย่างเช่น คุณอาจใช้เมธอด exportFramesByInterval
เพื่อส่งออกเฟรมตามช่วงเวลาที่กำหนด หรือคุณสามารถส่งจำนวนเฟรมที่คุณต้องการส่งออกไปยังเมธอด exportFramesByAmount
ซึ่งจะคำนวณช่วงเวลาตามระยะเวลาของวิดีโอ
FFMpeg::open('video.mp4') -> ส่งออกเฟรมโดยช่วงเวลา (2) ->บันทึก('thumb_%05d.jpg');
ทั้งสองวิธียอมรับอาร์กิวเมนต์ตัวเลือกที่สองและสามเพื่อระบุความกว้างและความสูงของเฟรม แทนที่จะผ่านทั้งความกว้างและความสูง คุณอาจผ่านเพียงอันเดียวก็ได้ FFmpeg จะเคารพอัตราส่วนภาพของแหล่งที่มา
FFMpeg::open('video.mp4') -> ส่งออก FramesByAmount (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 $โรงงาน) {$โรงงาน->ช่วงเวลา(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 ด้วยเช่นกัน คุณสามารถเรียกเมธอด generateVTT
บน TileFactory
ด้วยชื่อไฟล์ที่ต้องการ:
FFMpeg::open('steve_howe.mp4') ->exportTile(ฟังก์ชั่น (TileFactory $โรงงาน) {$โรงงาน->ช่วงเวลา(10) -> สเกล (320, 180) -> กริด (5, 5) ->generateVTT('thumbnails.vtt'); - ->บันทึก('tile_%05d.jpg');
การเชื่อมโยงการแปลงหลายรายการใช้งานได้เนื่องจากวิธี save
ของ MediaExporter
จะส่งคืนอินสแตนซ์ใหม่ของ MediaOpener
คุณสามารถใช้สิ่งนี้เพื่อวนซ้ำรายการต่างๆ เช่น เพื่อส่งออกหลายเฟรมจากวิดีโอเดียว:
$mediaOpener = FFMpeg::open('video.mp4');foreach ([5, 15, 25] เป็น $key => $seconds) {$mediaOpener = $mediaOpener->getFrameFromSeconds($seconds) ->ส่งออก() ->บันทึก("thumb_{$key}.png"); -
MediaOpener
มาพร้อมกับ each
วิธีเช่นกัน ตัวอย่างข้างต้นสามารถปรับโครงสร้างใหม่ได้ดังนี้:
FFMpeg::open('video.mp4')->each([5, 15, 25], ฟังก์ชั่น ($ffmpeg, $seconds, $key) {$ffmpeg->getFrameFromSeconds($seconds)->export()- >บันทึก("thumb_{$key}.png"); -
คุณสามารถสร้างไทม์แลปส์จากลำดับของรูปภาพได้โดยใช้เมธอด asTimelapseWithFramerate
บนตัวส่งออก
FFMpeg::open('feature_%04d.png') ->ส่งออก() -> asTimelapseWithFramerate (1) -> ในรูปแบบ (X264 ใหม่) ->บันทึก('timelapse.mp4');
คุณสามารถเปิดอินพุตได้หลายอินพุต แม้ว่าจะมาจากดิสก์ที่แตกต่างกันก็ตาม สิ่งนี้ใช้คุณสมบัติ map
และ filter_complex
ของ FFMpeg คุณสามารถเปิดหลายไฟล์ได้โดยการผูกมัดวิธี 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
เอาต์พุต (อาร์กิวเมนต์ที่ 2) ควรเป็นอินสแตนซ์ ProtoneMediaLaravelFFMpegFilesystemMedia
คุณสามารถยกตัวอย่างด้วยวิธี make
เรียกมันด้วยชื่อของดิสก์และเส้นทาง (ดูตัวอย่าง)
ลองดูตัวอย่างนี้ ซึ่งแมปอินพุตวิดีโอและเสียงแยกกันเป็นเอาต์พุตเดียว
FFMpeg::fromDisk('ท้องถิ่น') ->เปิด(['video.mp4', 'audio.m4a']) ->ส่งออก() ->addFormatOutputMapping(ใหม่ X264, สื่อ::make('local', 'new_video.mp4'), ['0:v', '1:a']) ->บันทึก();
นี่คือตัวอย่างจากไลบรารีพื้นฐาน:
// โค้ดนี้ใช้วิดีโออินพุต 2 รายการ โดยซ้อนกันในแนวนอนในวิดีโอเอาต์พุต 1 รายการ และ// เพิ่มเสียงจากวิดีโอแรกลงในวิดีโอใหม่นี้ (เป็นไปไม่ได้// ด้วยกราฟตัวกรองธรรมดาที่มีเพียง 1 อินพุตและ 1 เอาต์พุตเท่านั้น).FFMpeg::fromDisk('local') ->เปิด(['video.mp4', 'video2.mp4']) ->ส่งออก() ->addFilter('[0:v][1:v]', 'hstack', '[v]') // $in, $parameters, $out->addFormatOutputMapping(ใหม่ X264, สื่อ::make(' ท้องถิ่น', 'stacked_video.mp4'), ['0:a', '[v]']) ->บันทึก();
เช่นเดียวกับอินพุตเดี่ยว คุณยังสามารถส่งการโทรกลับไปยังเมธอด addFilter
ได้อีกด้วย สิ่งนี้จะให้ตัวอย่างของ FFMpegFiltersAdvancedMediaComplexFilters
:
ใช้ FFMpegFiltersAdvancedMediaComplexFilters; FFMpeg::open(['video.mp4', 'video2.mp4']) ->ส่งออก() ->addFilter(function(ComplexFilters $filters) {// $filters->ลายน้ำ(...);});
การเปิดไฟล์จากเว็บก็ทำงานในลักษณะเดียวกัน คุณสามารถส่งอาร์เรย์ของ 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 พื้นฐาน==', -
หากคุณต้องการใช้ส่วนหัว HTTP ชุดอื่นสำหรับแต่ละ URL คุณสามารถโยงเมธอด openUrl
ได้:
FFMpeg::openUrl('https://videocoursebuilder.com/lesson-5.mp4', ['การอนุญาต' => 'พื้นฐาน YWRtaW46MTIzNA==', ])->openUrl('https://videocoursebuilder.com/lesson-6.mp4', ['การอนุญาต' => 'พื้นฐาน bmltZGE6NDMyMQ==', -
FFMpeg::fromDisk('ท้องถิ่น') ->เปิด(['video.mp4', 'video2.mp4']) ->ส่งออก() -> concat ไม่มีการแปลงรหัส () ->บันทึก('concat.mp4');
FFMpeg::fromDisk('ท้องถิ่น') ->เปิด(['video.mp4', 'video2.mp4']) ->ส่งออก() -> ในรูปแบบ (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();
ตามค่าเริ่มต้น รูทของไดเร็กทอรีชั่วคราวจะถูกประเมินโดยเมธอด sys_get_temp_dir()
ของ PHP แต่คุณสามารถแก้ไขได้โดยการตั้งค่าคีย์คอนฟิกูเรชัน temporary_files_root
ให้เป็นพาธที่กำหนดเอง
คุณสามารถสร้างเพลย์ลิสต์ M3U8 เพื่อทำ HLS
$lowBitrate = (X264 ใหม่)->setKiloBitrate(250);$midBitrate = (X264 ใหม่)->setKiloBitrate(500);$highBitrate = (X264 ใหม่)->setKiloBitrate(1000); FFMpeg::fromDisk('วิดีโอ') ->เปิด('steve_howe.mp4') ->ส่งออกForHLS() -> setSegmentLength (10) // ตัวเลือก -> setKeyFrameInterval (48) // ตัวเลือก -> addFormat ($ lowBitrate) ->addFormat($กลางบิตเรต) ->addFormat($บิตเรตสูง) ->บันทึก('adaptive_steve.m3u8');
เมธอด addFormat
ของผู้ส่งออก HLS ใช้พารามิเตอร์ตัวที่สองที่ไม่บังคับซึ่งอาจเป็นวิธีการโทรกลับได้ ซึ่งจะทำให้คุณสามารถเพิ่มตัวกรองต่างๆ ตามรูปแบบได้ ขั้นแรก โปรดดูส่วน อินพุตหลายรายการ เพื่อทำความเข้าใจวิธีจัดการกับตัวกรองที่ซับซ้อน
คุณสามารถใช้เมธอด addFilter
เพื่อเพิ่มตัวกรองที่ซับซ้อนได้ (ดูตัวอย่าง $lowBitrate
) เนื่องจากตัวกรอง scale
ถูกใช้บ่อยครั้ง จึงมีวิธีการช่วยเหลือ (ดูตัวอย่าง $midBitrate
) คุณยังสามารถใช้ callable เพื่อเข้าถึงอินสแตนซ์ ComplexFilters
ได้ แพ็คเกจนี้มีอาร์กิวเมนต์ $in
และ $out
ดังนั้นคุณจึงไม่ต้องกังวลเกี่ยวกับมัน (ดูตัวอย่าง $highBitrate
)
การส่งออก HLS สร้างขึ้นโดยใช้ map
ของ FFMpeg และฟีเจอร์ 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') ->ส่งออกForHLS() ->addFormat($lowBitrate, function($media) {$media->addFilter('scale=640:480'); ->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->กำหนดเอง($in, 'scale=1920:1200', $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') ->ส่งออกForHLS() ->useSegmentFilenameGenerator(ฟังก์ชั่น ($name, $format, $key, $segments ที่เรียกได้, $playlist ที่เรียกได้) {$segments("{$name}-{$format->getKiloBitrate()}-{$key}-%03d .ts");$playlist("{$name}-{$format->getKiloBitrate()}-{$key}.m3u8"); -
คุณสามารถเข้ารหัสแต่ละส่วน HLS ได้โดยใช้การเข้ารหัส AES-128 เมื่อต้องการทำเช่นนี้ ให้เรียกเมธอด withEncryptionKey
บนผู้ส่งออก HLS ด้วยคีย์ เราจัดเตรียมเมธอดตัวช่วย generateEncryptionKey
ในคลาส HLSExporter
เพื่อสร้างคีย์ ตรวจสอบให้แน่ใจว่าคุณเก็บคีย์ไว้อย่างดี เนื่องจากผลลัพธ์ที่ส่งออกจะไม่มีค่าหากไม่มีคีย์ ตามค่าเริ่มต้น ชื่อไฟล์ของคีย์คือ secret.key
แต่คุณสามารถเปลี่ยนได้ด้วยพารามิเตอร์ตัวที่สองที่ไม่บังคับของเมธอด withEncryptionKey
ใช้ ProtoneMediaLaravelFFMpegExportersHLSExporter;$encryptionKey = HLSExporter::generateEncryptionKey(); FFMpeg::open('steve_howe.mp4') ->ส่งออกForHLS() ->withEncryptionKey($การเข้ารหัสคีย์) ->addFormat($บิตเรตต่ำ) ->addFormat($กลางบิตเรต) ->addFormat($บิตเรตสูง) ->บันทึก('adaptive_steve.m3u8');
เพื่อให้การส่งออก HLS ของคุณปลอดภัยยิ่งขึ้น คุณสามารถหมุนเวียนคีย์ในแต่ละส่วนที่ส่งออกได้ การทำเช่นนี้จะสร้างคีย์หลายอันที่คุณต้องจัดเก็บ ใช้เมธอด withRotatingEncryptionKey
เพื่อเปิดใช้งานฟีเจอร์นี้ และจัดให้มีการโทรกลับที่ใช้พื้นที่เก็บข้อมูลของคีย์
FFMpeg::open('steve_howe.mp4') ->ส่งออกForHLS() ->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($บิตเรตต่ำ) ->addFormat($กลางบิตเรต) ->addFormat($บิตเรตสูง) ->บันทึก('adaptive_steve.m3u8');
เมธอด withRotatingEncryptionKey
มีอาร์กิวเมนต์ตัวที่สองที่เป็นทางเลือกเพื่อตั้งค่าจำนวนเซ็กเมนต์ที่ใช้คีย์เดียวกัน ค่าเริ่มต้นนี้เป็น 1
FFMpeg::open('steve_howe.mp4') ->ส่งออกForHLS() ->withRotatingEncryptionKey($เรียกได้, 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
เรียกใช้เมธอด dynamicHLSPlaylist
บนส่วนหน้าของ FFMpeg
และคล้ายกับการเปิดไฟล์มีเดีย คุณสามารถเปิดเพลย์ลิสต์โดยใช้เมธอด fromDisk
และ open
จากนั้นคุณต้องจัดให้มีการโทรกลับสามครั้ง แต่ละเส้นทางจะให้เส้นทางสัมพัทธ์แก่คุณและคาดหวังเส้นทางที่สมบูรณ์เป็นการตอบแทน เนื่องจากคลาส DynamicHLSPlaylist
ใช้อินเทอร์เฟซ IlluminateContractsSupportResponsable
คุณจึงสามารถส่งคืนอินสแตนซ์ได้
การโทรกลับครั้งแรก (KeyUrlResolver) จะให้เส้นทางสัมพันธ์กับคีย์การเข้ารหัส การโทรกลับครั้งที่สอง (MediaUrlResolver) จะให้เส้นทางสัมพันธ์กับเซ็กเมนต์สื่อ (ไฟล์ .ts) การโทรกลับครั้งที่สาม (PlaylistUrlResolver) จะให้เส้นทางสัมพันธ์ไปยังเพลย์ลิสต์
ตอนนี้แทนที่จะใช้ Storage::disk('public')->url('adaptive_steve.m3u8')
เพื่อรับ URL แบบเต็มไปยังเพลย์ลิสต์หลักของคุณ คุณสามารถใช้ route('video.playlist', ['playlist' => 'adaptive_steve.m3u8'])
คลาส DynamicHLSPlaylist
ดูแลเส้นทางและ URL ทั้งหมด
เส้นทาง::get('/video/secret/{key}', function ($key) {return Storage::disk('secrets')->download($key); })->ชื่อ('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(ฟังก์ชั่น ($playlistFilename) {เส้นทางส่งคืน('video.playlist', ['playlist' => $playlistFilename]); - })->ชื่อ('video.playlist');
คุณจะพบเซสชัน Live Coding เกี่ยวกับการเข้ารหัส 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();
วัตถุสื่อที่คุณได้รับเมื่อคุณ 'เปิด' ไฟล์ จริง ๆ แล้วเก็บวัตถุสื่อที่เป็นของไดรเวอร์พื้นฐาน มันจัดการการเรียกใช้เมธอดแบบไดนามิกอย่างที่คุณเห็นที่นี่ วิธีนี้ช่วยให้คุณยังคงใช้วิธีทั้งหมดของไดรเวอร์พื้นฐานได้
// นี่จะทำให้คุณเห็นตัวอย่าง 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
ภายในที่แสดงผ่านปัจจุบันและเวลาปัจจุบัน แม้ว่ากรณีการใช้งานจะมีจำกัด แต่คุณอาจต้องการเข้าถึงอินสแตนซ์ Listener นี้ คุณสามารถทำได้โดยตกแต่งรูปแบบด้วย ProgressListenerDecorator
คุณลักษณะนี้เป็นการทดลองระดับสูง ดังนั้นโปรดทดสอบอย่างละเอียดก่อนที่จะนำไปใช้จริง
ใช้ FFMpegFormatProgressListenerAbstractProgressListener; ใช้ ProtoneMediaLaravelFFMpegFFMpegProgressListenerDecorator;$format = ใหม่ FFMpegFormatVideoX264;$decoratedFormat = ProgressListenerDecorator::ตกแต่ง($format); FFMpeg::open('video.mp4') ->ส่งออก() -> ในรูปแบบ ($ ตกแต่งรูปแบบ) ->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') ->ส่งออก() -> ในรูปแบบ (X264 ใหม่) ->beforeSaving(function ($commands) {$commands[] = '-hello';return $commands; - ->บันทึก('concat.mp4');
หมายเหตุ: สิ่งนี้ใช้ไม่ได้กับการต่อข้อมูลและการส่งออกเฟรม
นี่คือโพสต์บล็อกที่จะช่วยคุณเริ่มต้นใช้งานแพ็คเกจนี้:
https://protone.media/en/blog/how-to-use-ffmpeg-in-your-laravel-projects
ต่อไปนี้เป็นภาพรวม 20 นาทีเกี่ยวกับวิธีเริ่มต้นใช้งาน Video.js โดยครอบคลุมถึงการรวม Video.js จาก CDN การนำเข้าเป็นโมดูล ES6 ด้วย Laravel Mix (Webpack) และการสร้างส่วนประกอบ Vue.js ที่นำมาใช้ซ้ำได้
https://www.youtube.com/watch?v=nA1Jy8BPjys
ตัวกรองแบบกำหนดเอง
FFmpeg ล้มเหลวในการดำเนินการคำสั่ง
รับขนาดของไฟล์วิดีโอ
ติดตามความคืบหน้าการแปลงรหัส
ไม่สามารถโหลด FFProbe
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เปลี่ยนแปลงเมื่อเร็วๆ นี้
การทดสอบผู้แต่ง $
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
Inertia Table
: ตารางขั้นสูงสุดสำหรับ Inertia.js พร้อมตัวสร้างแบบสอบถามในตัว
Laravel Blade On Demand
: แพ็คเกจ Laravel เพื่อรวบรวมเทมเพลต Blade ในหน่วยความจำ
Laravel Cross Eloquent Search
: แพ็คเกจ Laravel เพื่อค้นหาผ่าน Eloquent หลายรุ่น
Laravel Eloquent Scope as Select
: หยุดการทำซ้ำขอบเขตการสืบค้น Eloquent และข้อ จำกัด ของคุณใน PHP แพ็คเกจนี้ช่วยให้คุณนำขอบเขตและข้อจำกัดการสืบค้นของคุณกลับมาใช้ใหม่ได้โดยการเพิ่มเป็นแบบสอบถามย่อย
Laravel MinIO Testing Tools
: รันการทดสอบของคุณกับเซิร์ฟเวอร์ MiniIO S3
Laravel Mixins
: คอลเลกชันสารพัด Laravel
Laravel Paddle
: การรวม Paddle.com API สำหรับ Laravel พร้อมรองรับ webhooks/กิจกรรม
Laravel Task Runner
: เขียนสคริปต์เชลล์เช่น Blade Components และเรียกใช้ในเครื่องหรือบนเซิร์ฟเวอร์ระยะไกล
Laravel Verify New Email
: แพ็คเกจนี้เพิ่มการรองรับสำหรับการตรวจสอบที่อยู่อีเมลใหม่: เมื่อผู้ใช้อัปเดตที่อยู่อีเมลของตน มันจะไม่แทนที่ที่อยู่อีเมลเก่าจนกว่าที่อยู่อีเมลใหม่จะได้รับการตรวจสอบ
Laravel XSS Protection
: Laravel Middleware เพื่อปกป้องแอปของคุณจากการเขียนสคริปต์ข้ามไซต์ (XSS) มันฆ่าเชื้ออินพุตคำขอและสามารถฆ่าเชื้อคำสั่ง Blade echo ได้
หากคุณพบปัญหาที่เกี่ยวข้องกับความปลอดภัย โปรดส่งอีเมลไปที่ [email protected] แทนการใช้ตัวติดตามปัญหา กรุณาอย่าส่งอีเมลคำถามใด ๆ เปิดปัญหาหากคุณมีคำถาม
ปาสคาล บัลเยต์
ผู้ร่วมให้ข้อมูลทั้งหมด
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม