แพ็คเกจนี้ให้การทำงานร่วมกับ 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) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม