توفر هذه الحزمة تكاملاً مع FFmpeg لـ Laravel 10. يتولى نظام ملفات Laravel تخزين الملفات.
نحن ندعم المجتمع بكل فخر من خلال تطوير حزم Laravel ومنحها مجانًا. إذا كانت هذه الحزمة توفر لك الوقت أو إذا كنت تعتمد عليها بشكل احترافي، فيرجى التفكير في رعاية الصيانة والتطوير والاطلاع على أحدث باقة متميزة لدينا: Inertia Table. يستغرق تتبع المشكلات وطلبات السحب وقتًا، ولكن يسعدنا تقديم المساعدة!
غلاف سهل للغاية حول PHP-FFMpeg، بما في ذلك دعم المرشحات والميزات المتقدمة الأخرى.
التكامل مع نظام ملفات Laravel ونظام التكوين ومعالجة التسجيل.
متوافق مع Laravel 10، ودعم اكتشاف الحزم.
دعم مدمج لـ HLS.
دعم مدمج لـ HLS المشفرة (AES-128) والمفاتيح الدوارة (اختياري).
دعم مدمج للتسلسل، والمدخلات/المخرجات المتعددة، وتسلسلات الصور (الفاصل الزمني)، والمرشحات المعقدة (ورسم الخرائط)، وتصدير الإطارات/الصور المصغرة.
دعم مدمج للعلامات المائية (تحديد المواقع والمعالجة).
دعم مدمج لإنشاء فسيفساء/كائن/بلاط من مقطع فيديو.
دعم مدمج لإنشاء ملفات VTT Preview Thumbnail .
يتطلب PHP 8.1 أو أعلى.
تم اختباره باستخدام FFmpeg 4.4 و5.0.
تأكد من تثبيت أحدث إصدار من FFmpeg:
ffmpeg -النسخة
يمكنك تثبيت الحزمة عبر الملحن:
يتطلب الملحن pbmedia/laravel-ffmpeg
أضف موفر الخدمة والواجهة إلى ملف التكوين app.php
الخاص بك إذا كنت لا تستخدم Package Discovery.
// التكوين/app.php'providers' => [ ...ProtoneMediaLaravelFFMpegSupportServiceProvider::class, ... ];'الأسماء المستعارة' => [ ...'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
FFMpeg وميزات 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}% transcoded"; });
قد يكشف رد الاتصال أيضًا $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
سجل إخراج كامل.
في الإصدارات السابقة من هذه الحزمة، كانت رسالة الاستثناء هي فشل الترميز دائمًا. يمكنك الرجوع إلى هذه الرسالة عن طريق تحديث مفتاح التكوين set_command_and_error_output_on_exception
إلى false
.
يحاول { FFMpeg::open('yesterday.mp3') ->تصدير () ->التنسيق (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 FFMpegCoerateDimension(640, 480)); }) ->تصدير () ->toDisk('converted_videos') ->inFormat(FFMpegFormatVideoX264 الجديد) ->save('small_steve.mkv');// أو$start = FFMpegCoerateTimeCode::fromSeconds(5)$clipFilter = new 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(function (VideoFilters $filters) {$filters->resize(new FFMpegCoerateDimension(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('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') ->فتح('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') ->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'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()' غير مطلوبة، سيتم الآن فتح الملف من "القرص" الافتراضي، كما هو محدد في // ملف التكوين.FFMpeg::open('my_movie.mov')// التصدير إلى FTP، وتحويله إلى WMV->export() ->إلى القرص('ftp') ->inFormat(FFMpegFormatVideoWMV الجديد) ->حفظ ('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 الجديد) ->مع الرؤية('عام') ->حفظ ('my_movie.webm')
FFMpeg::fromDisk('فيديو') ->فتح('steve_howe.mp4') ->جيت فريم فروم ثانية (10) ->تصدير () ->toDisk('الصور المصغرة') ->save('FrameAt10sec.png');// بدلاً من أسلوب 'getFrameFromSeconds()'، يمكنك// أيضًا استخدام أسلوب 'getFrameFromString()' أو أسلوب // 'getFrameFromTimecode()':$media = FFMpeg ::open('steve_howe.mp4');$frame = $media->getFrameFromString('00:00:13.37');// أو $timecode = new FFMpegCoerateTimeCode(...);$frame = $media->getFrameFromTimecode($timecode);
يمكنك أيضًا الحصول على المحتويات الأولية للإطار بدلاً من حفظه في نظام الملفات:
محتويات $ = FFMpeg::open('video.mp4') ->جيت فريم فروم ثانية (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(function (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. يمكنك استدعاء التابع generateVTT
في TileFactory
باستخدام اسم الملف المطلوب:
FFMpeg::open('steve_howe.mp4') ->exportTile(function (TileFactory $factory) {$factory->interval(10) ->المقياس (320، 180) ->الشبكة (5، 5) ->generateVTT('thumbnails.vtt'); }) ->حفظ('tile_%05d.jpg');
يعمل تسلسل التحويلات المتعددة لأن طريقة save
الخاصة بـ MediaExporter
ترجع نسخة جديدة من MediaOpener
. يمكنك استخدام هذا للتنقل عبر العناصر، على سبيل المثال، لتصدير إطارات متعددة من فيديو واحد:
$mediaOpener = FFMpeg::open('video.mp4');foreach ([5, 15, 25] كـ $key => $thans) {$mediaOpener = $mediaOpener->getFrameFromSeconds($thans) ->تصدير () ->حفظ("thumb_{$key}.png"); }
يأتي MediaOpener
مع each
طريقة أيضًا. يمكن إعادة صياغة المثال أعلاه على النحو التالي:
FFMpeg::open('video.mp4')->each([5, 15, 25], وظيفة ($ffmpeg, $sec, $key) {$ffmpeg->getFrameFromSeconds($thans)->export()- >حفظ("thumb_{$key}.png"); });
يمكنك إنشاء فاصل زمني من سلسلة من الصور باستخدام الأسلوب asTimelapseWithFramerate
على المُصدِّر
FFMpeg::open('feature_%04d.png') ->تصدير () ->asTimelapseWithFramerate(1) ->التنسيق (X264 الجديد) ->حفظ('timelapse.mp4');
يمكنك فتح مدخلات متعددة، حتى من أقراص مختلفة. يستخدم هذا map
FFMpeg وميزات filter_complex
. يمكنك فتح ملفات متعددة عن طريق ربط طريقة open
باستخدام مصفوفة. يمكنك مزج المدخلات من أقراص مختلفة.
FFMpeg::open('video1.mp4')->open('video2.mp4'); FFMpeg::open(['video1.mp4', 'video2.mp4']); FFMpeg::fromDisk('التحميلات') ->فتح('video1.mp4') ->من القرص('الأرشيف') ->open('video2.mp4');
عند فتح مدخلات متعددة، يتعين عليك إضافة تعيينات حتى يعرف FFMpeg كيفية توجيهها. توفر هذه الحزمة طريقة addFormatOutputMapping
، والتي تأخذ ثلاث معلمات: التنسيق والإخراج وتسميات الإخراج للجزء -filter_complex
.
يجب أن يكون الإخراج (الوسيطة الثانية) مثيلاً لـ ProtoneMediaLaravelFFMpegFilesystemMedia
. يمكنك إنشاء مثيل باستخدام طريقة make
، واستدعائها باسم القرص والمسار (انظر المثال).
تحقق من هذا المثال، الذي يقوم بتعيين مدخلات الفيديو والصوت المنفصلة في مخرج واحد.
FFMpeg::fromDisk('محلي') ->فتح(['video.mp4', 'audio.m4a']) ->تصدير () ->addFormatOutputMapping(new X264, Media::make('local', 'new_video.mp4'), ['0:v', '1:a']) ->حفظ();
هذا مثال من المكتبة الأساسية:
// يأخذ هذا الكود مقطعي فيديو إدخال، ويجمعهما أفقيًا في فيديو إخراج واحد و// يضيف إلى هذا الفيديو الجديد الصوت من الفيديو الأول. (هذا مستحيل // باستخدام رسم بياني مرشح بسيط يحتوي على إدخال واحد فقط وإخراج واحد فقط).FFMpeg::fromDisk('local') ->فتح(['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(...);});
يعمل فتح الملفات من الويب بالمثل. يمكنك تمرير مجموعة من عناوين 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']) ->تصدير () ->concatWithoutTranscoding() ->حفظ('concat.mp4');
FFMpeg::fromDisk('محلي') ->فتح(['video.mp4', 'video2.mp4']) ->تصدير () ->التنسيق (X264 الجديد) ->concatWithTranscoding($hasVideo = صحيح، $hasAudio = صحيح) ->حفظ('concat.mp4');
باستخدام فئة Media
يمكنك تحديد مدة الملف:
$media = FFMpeg::open('wwdc_2006.mp4');$durationInSeconds = $media->getDurationInSeconds(); // يُرجع int$durationInMilithans = $media->getDurationInMilithans(); // إرجاع تعويم
عند فتح الملفات أو حفظها من أو إلى قرص بعيد، سيتم إنشاء ملفات مؤقتة على الخادم الخاص بك. بعد الانتهاء من تصدير هذه الملفات أو معالجتها، يمكنك تنظيفها عن طريق استدعاء التابع cleanupTemporaryFiles()
:
FFMpeg::cleanupTemporaryFiles();
بشكل افتراضي، يتم تقييم جذر الدلائل المؤقتة بواسطة طريقة sys_get_temp_dir()
الخاصة بـ PHP، ولكن يمكنك تعديله عن طريق تعيين مفتاح التكوين temporary_files_root
إلى مسار مخصص.
يمكنك إنشاء قائمة تشغيل M3U8 للقيام بـ HLS.
$lowBitrate = (new X264)->setKiloBitrate(250);$midBitrate = (جديد X264)->setKiloBitrate(500);$highBitrate = (جديد X264)->setKiloBitrate(1000); FFMpeg::fromDisk('فيديو') ->فتح('steve_howe.mp4') ->تصديرForHLS() ->setSegmentLength(10) // اختياري->setKeyFrameInterval(48) // اختياري->addFormat($lowBitrate) ->addFormat($midBitrate) ->addFormat($highBitrate) ->حفظ('adaptive_steve.m3u8');
تأخذ طريقة addFormat
لمصدر HLS معلمة ثانية اختيارية والتي يمكن أن تكون طريقة رد اتصال. يتيح لك هذا إضافة مرشحات مختلفة لكل تنسيق. أولاً، قم بمراجعة قسم المدخلات المتعددة لفهم كيفية التعامل مع المرشحات المعقدة.
يمكنك استخدام طريقة addFilter
لإضافة مرشح معقد (انظر مثال $lowBitrate
). نظرًا لاستخدام مرشح scale
كثيرًا، فهناك طريقة مساعدة (راجع مثال $midBitrate
). يمكنك أيضًا استخدام أداة قابلة للاستدعاء للوصول إلى مثيل 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($midBitrate, function($media) {$media->scale(960, 720); }) ->addFormat($highBitrate, function ($media) {$media->addFilter(function ($filters, $in, $out) {$filters->custom($in, 'scale=1920:1200', $out ); // $in، $parameters، $out}); }) ->addFormat($superBitrate, function($media) {$media->addLegacyFilter(function ($filters) {$filters->resize(new FFMpegCostrateDimension(2560, 1920)); }); }) ->حفظ('adaptive_steve.m3u8');
يمكنك استخدام نمط مخصص لتسمية المقاطع وقوائم التشغيل. يمنحك useSegmentFilenameGenerator
5 وسائط. توفر الوسيطة الأولى والثانية والثالثة معلومات حول الاسم الأساسي للتصدير وتنسيق التكرار الحالي ومفتاح التكرار الحالي. الوسيطة الرابعة هي رد اتصال يجب عليك الاتصال به باستخدام نمط المقاطع الخاص بك. الوسيطة الخامسة هي رد اتصال يجب عليك الاتصال به باستخدام نمط قائمة التشغيل الخاصة بك. لاحظ أن هذا ليس اسم قائمة التشغيل الأساسية، بل اسم قائمة التشغيل لكل تنسيق.
FFMpeg::fromDisk('فيديو') ->فتح('steve_howe.mp4') ->تصديرForHLS() ->useSegmentFilenameGenerator(function ($name, $format, $key, $segments callable $playlist, callable $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() ->مع مفتاح التشفير($encryptionKey) ->addFormat($lowBitrate) ->addFormat($midBitrate) ->addFormat($highBitrate) ->حفظ('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($lowBitrate) ->addFormat($midBitrate) ->addFormat($highBitrate) ->حفظ('adaptive_steve.m3u8');
يحتوي الأسلوب withRotatingEncryptionKey
على وسيطة ثانية اختيارية لتعيين عدد المقاطع التي تستخدم نفس المفتاح. هذا الافتراضي هو 1
.
FFMpeg::open('steve_howe.mp4') ->تصديرForHLS() ->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
. قم باستدعاء الأسلوب 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); })->name('video.key'); الطريق::get('/video/{playlist}'، الوظيفة ($playlist) {return FFMpeg::dynamicHLSPlaylist() ->من القرص('عام') ->فتح(قائمة التشغيل $) ->setKeyUrlResolver(function ($key) {return road('video.key', ['key' => $key]); }) ->setMediaUrlResolver(function ($mediaFilename) {return Storage::disk('public')->url($mediaFilename); }) ->setPlaylistUrlResolver(function ($playlistFilename) {return road('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();
كائن الوسائط الذي تحصل عليه عند "فتح" ملف، يحمل في الواقع كائن الوسائط الذي ينتمي إلى برنامج التشغيل الأساسي. إنه يتعامل مع استدعاءات الطريقة الديناميكية كما ترون هنا. بهذه الطريقة، ستظل كافة أساليب برنامج التشغيل الأساسي متاحة لك.
// يمنحك هذا مثيلًا لـ ProtoneMediaLaravelFFMpegMediaOpener$media = FFMpeg::fromDisk('videos')->open('video.mp4');// سيتم استدعاء أسلوب "getStreams" على كائن الوسائط الأساسي منذ ذلك الحين// إنه غير موجود في هذا الكائن.$codec = $media->getStreams()->first()->get('codec_name');
إذا كنت تريد الوصول المباشر إلى الكائن الأساسي، فاستدعي الكائن كدالة (استدعاء):
// يمنحك هذا مثيلًا لـ ProtoneMediaLaravelFFMpegMediaOpener$media = FFMpeg::fromDisk('videos')->open('video.mp4');// يمنحك هذا مثيل FFMpegMediaMediaTypeInterface$baseMedia = $media();
يعرض مستمع التقدم النسبة المئوية التي تم تحويلها، ولكن الحزمة الأساسية تحتوي أيضًا على AbstractProgressListener
داخلي يكشف المرور الحالي والوقت الحالي. على الرغم من أن حالة الاستخدام محدودة، فقد ترغب في الوصول إلى مثيل المستمع هذا. يمكنك القيام بذلك عن طريق تزيين التنسيق باستخدام ProgressListenerDecorator
. هذه الميزة تجريبية للغاية، لذا تأكد من اختبارها بدقة قبل استخدامها في الإنتاج.
use FFMpegFormatProgressListenerAbstractProgressListener;use ProtoneMediaLaravelFFMpegFFMpegProgressListenerDecorator;$format = new FFMpegFormatVideoX264;$decoratedFormat = ProgressListenerDecorator::decorate($format); FFMpeg::open('video.mp4') ->تصدير () ->التنسيق($decoratedFormat) ->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
الرجاء مراجعة سجل التغيير للحصول على مزيد من المعلومات حول ما تغير مؤخرًا.
اختبار الملحن $
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
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
: قم بإجراء اختباراتك على خادم MinIO S3.
Laravel Mixins
: مجموعة من الأشياء الجيدة Laravel.
Laravel Paddle
: تكامل Paddle.com API لـ Laravel مع دعم خطافات الويب/الأحداث.
Laravel Task Runner
: اكتب نصوص Shell مثل Blade Components وقم بتشغيلها محليًا أو على خادم بعيد.
Laravel Verify New Email
: تضيف هذه الحزمة دعمًا للتحقق من عناوين البريد الإلكتروني الجديدة: عندما يقوم المستخدم بتحديث عنوان بريده الإلكتروني، فلن يحل محل العنوان القديم حتى يتم التحقق من العنوان الجديد.
Laravel XSS Protection
: برنامج Laravel الوسيط لحماية تطبيقك من البرمجة النصية عبر المواقع (XSS). إنه يعقم مدخلات الطلب، ويمكنه أن يصحح بيانات صدى Blade.
إذا اكتشفت أي مشكلات متعلقة بالأمان، فيرجى إرسال بريد إلكتروني إلى [email protected] بدلاً من استخدام أداة تعقب المشكلات. من فضلك لا ترسل أي أسئلة عبر البريد الإلكتروني، افتح مشكلة إذا كان لديك سؤال.
باسكال بالجيت
جميع المساهمين
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.