ترميز المحتوى المباشر باستخدام VP9 باستخدام FFmpeg

معلّمات الترميز

يوفّر برنامج VP9 مجموعة من المعلّمات لتحسين الترميز المباشر. وسنناقش بعض هذه المبادئ الشاملة في أوضاع نقل البيانات.

مثال على ترميز FFmpeg VP9

يوضّح الجدول أدناه معلَمات مثال على طلب ffmpeg لترميز VP9.

المعلمة الوصف
-quality realtime تُعدّ السمة realtime ضرورية للبث المباشر وللسرعات التي تزيد عن 5.
-speed 6 يجب استخدام السرعة من 5 إلى 8 للتشفير في البث المباشر/في الوقت الفعلي. الأرقام المنخفضة (5 أو 6) أعلى جودة، ولكنها تتطلب المزيد من طاقة وحدة المعالجة المركزية. وستكون الأرقام الأعلى (7 أو 8) أقل جودة، ولكن يمكن إدارتها بشكل أكبر في حالات استخدام وقت الاستجابة المنخفض، وكذلك على الأجهزة الأقل استخدامًا لوحدة المعالجة المركزية (CPU)، مثل الأجهزة الجوّالة.
-tile-columns 4 يعمل تقسيم المربّع على تقسيم الفيديو إلى مناطق مستطيلة، مما يسمح بالسلاسل المتعددة للترميز وفك التشفير. عدد المربّعات هو دائمًا قوة اثنين. 0 = مربع واحد، 1 = 2، 2 = 4، 3 = 8، 4 = 16، 5 = 32.
-frame-parallel 1 فعِّل ميزات النزاحة الموازية.
-threads 8 الحد الأقصى لعدد سلاسل المحادثات المطلوب استخدامها.
-static-thresh 0 حدّ رصد الحركة
-max-intra-rate 300 الحد الأقصى لمعدل نقل بيانات i-frame (pct)
-deadline realtime إصدار بديل (قديم) من -quality realtime
-lag-in-frames 0 الحد الأقصى لعدد الإطارات المطلوب تأخيرها
-qmin 4 -qmax 48 الحد الأدنى والحد الأقصى للقيم في الكمية. إنّ القيم هنا هي مجرّد اقتراح، ويساعد التعديل في زيادة جودة الفيديو أو خفضها على حساب كفاءة الضغط.
-row-mt 1 تفعيل سلسلة محادثات متعددة. السماح باستخدام ما يصل إلى سلسلة محادثات كأعمدة مربّعة 0 = غير مفعَّل، 1 = مفعَّل.
-error-resilient 1 تفعيل ميزات مرونة الخطأ

اختيار مَعلمات الترميز

وتستخدم المعلومات الواردة أدناه ترميز معدل نقل البيانات (CBR) الثابت للبث المباشر التكيفي (ABR)، حيث يتم تحديد كل معدل استهداف بشكل صريح في ملف البيان الخاص بالحزمة. وسيؤدي ذلك إلى وضوح والتبديل، بين أسعار العملاء. ويتوفّر أيضًا ترميز "معدل نقل البيانات المتغير" (VBR) ووضع CQ أيضًا إذا كان معدّل نقل البيانات أكثر مرونة أو يتم تقسيم التشفير. وضع سيواجه صعوبة في الترميز في الوقت الفعلي اللازم للفيديو المباشر. يمكنك الاطّلاع على أوضاع نقل البيانات للحصول على مزيد من المعلومات.

للحصول على المزيد من التفاصيل حول طريقة معالجة VP9، ننصحك أيضًا بالاطّلاع على المقالة المرفقة حول إعدادات الفيديوهات المسجّلة، ولكن يجب التركيز على CBR.

نصائح

تذكَّر أنّه عند البث المباشر، يتم تقييد كل شيء على سرعة ترميز تبلغ 1x على الأقل في الوقت الفعلي (يتم الإبلاغ عن سرعة ترميز بمرور الوقت على جهاز FFmpeg). وإذا انخفضت سرعة الترميز عن 1x، لن تستمر عملية الترميز في إدخال الفيديو المباشر، كما سيعاني المستخدمون من التخزين المؤقت، وسيعرض البث في عملية النقل البث غير قابل للاستخدام أثناء البث المباشر (على الرغم من أن الأرشيف سيكون قابلاً للاستخدام بشكل عام).

أمثلة على معلمات الترميز أثناء الاستخدام

في ما يلي عرض معدل استخدام وحدة المعالجة المركزية (CPU) بمعدّل 25 إطارًا في الثانية لمختلف أحجام الإطارات على جهاز سطح مكتب رباعي النواة i5 بسرعة 3.6 غيغاهرتز يعمل بنظام التشغيل Linux:

الدقة المستهدفة معلّمات FFmpeg VP9 وحدة المعالجة المركزية (CPU) / السرعة (مثال)
3840 × 2160 (2160p) -r 30 -g 90 -s 3840x2160 -الجودة في الوقت الفعلي -speed 5 -threads 16 -row-mt 1 -tile-columns 3 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 7800k 88% 0.39 ضعفًا
2560 × 1440 (1440p) -r 30 -g 90 -s 2560x1440 -الجودة في الوقت الفعلي -speed 5 -threads 16 -row-mt 1 -tile-columns 3 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 6000k ~86% 0.68x
1920 × 1080 (1080 بكسل) -r 30 -g 90 -s 1920x1080 -الجودة في الوقت الفعلي -السرعة 5 -سلاسل المحادثات 8 -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 4500k 82% تقريبًا 1.04 مرات
1280×720 (720 بكسل) -r 30 -g 90 -s 1280x720 -الجودة في الوقت الفعلي -السرعة 5 -سلاسل المحادثات 8 -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 3000k ~78% 1.77x
854 × 480 (480p) -r 30 -g 90 -s 854x480 -الجودة في الوقت الفعلي -السرعة 6 -سلاسل المحادثات 4 -row-mt 1 -tile-columns 1 -frame-Parallels 1 -qmin 4 -qmax 48 -b:v 1800k 36.31% تقريبًا
640 × 360 (360p) -r 30 -g 90 -s 640x360 -الجودة في الوقت الفعلي -speed 7 -threads 4 -row-mt 1 -tile-columns 1 -frame-Parallels 0 -qmin 4 -qmax 48 -b:v 730k 62% تقريبًا 5.27 مرات
426 × 240 (240p) -r 30 -g 90 -s 426x240 -الجودة في الوقت الفعلي -السرعة 8 -سلاسل المحادثات 2 -row-mt 1 -tile-columns 0 -frame-Parallels 0 -qmin 4 -qmax 48 -b:v 365k 66% 8.27 أضعاف

مثلاً، قد يظهر FFmpeg على النحو التالي:

ffmpeg -stream_loop 100 -i /home/id3as/Videos/120s_tears_of_steel_1080p.webm \
  -r 30 -g 90 -s 3840x2160 -quality realtime -speed 5 -threads 16 -row-mt 1 \
  -tile-columns 3 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 7800k -c:v vp9 \
  -b:a 128k -c:a libopus -f webm pipe1

نصائح

  • لاحظ أننا نخرج هنا من أنبوب FIFO ("pipe1")، والذي يجب إنشاؤه قبل التنفيذ، وقبل تشغيل أمر FFmpeg. ولإجراء ذلك، أرسِل الأمر mkfifo pipe1 في دليل العمل. وعند استخدام Shaka Packager، ستستمع إلى ذلك المصدر كمصدر الإدخال للبث المباشر. وقد تتطلّب نماذج التغليف الأخرى طريقة مختلفة.

  • لضمان التعرف على أوامر -row-mt، استخدم أحدث إصدار ثابت من FFmpeg (الإصدار 3.3.3 حاليًا) من https://www.ffmpeg.org/download.html

مثال على معدّل نقل البيانات التكيُّفي

استنادًا إلى قوة الجهاز الذي يُشغِّل ترميز FFmpeg، قد يكون من غير الممكن تقديم جميع الترميزات التالية في الوقت نفسه أو لا، وبالتالي يجب اختيار مجموعة فرعية متوافقة مع الموارد المتاحة والجماهير المستهدفة من القائمة.

مجموعة ABR كاملة FFmpeg

في سيناريو مثالي، ندمج أمثلة الترميز الموضّحة في القسم السابق لإنشاء أمر واحد ينتج عنه جميعًا في الوقت نفسه:

ffmpeg -stream_loop 100 -i lakes1080p.mp4 \
  -y -r 25 -g 75 -s 3840x2160 -quality realtime -speed 5 -threads 8 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 7800k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe1 \
  -y -r 25 -g 75 -s 2560x1440 -quality realtime -speed 5 -threads 8 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 6000k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe2 \
  -y -r 25 -g 75 -s 1920x1080 -quality realtime -speed 5 -threads 4 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 4500k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe3 \
  -y -r 25 -g 75 -s 1280x720 -quality realtime -speed 5 -threads 4 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 3000k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe4 \
  -y -r 25 -g 75 -s 854x480 -quality realtime -speed 6 -threads 4 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 2000k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe5 \
  -y -r 25 -g 75 -s 640x360 -quality realtime -speed 7 -threads 2 \
  -tile-columns 1 -frame-parallel 0 \
  -b:v 730k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe6 \
  -y -r 25 -g 75 -s 426x240 -quality realtime -speed 8 -threads 2 \
  -tile-columns 1 -frame-parallel 0 \
  -b:v 365k -c:v vp9 -b:a 64k -c:a libopus -f webm pipe7

ومع ذلك، تتطلّب المجموعة الكاملة المذكورة أعلاه وحدة معالجة مركزية قوية جدًا، أو قد تتطلب دعمًا من تفريغ وحدة معالجة الرسومات للأجهزة، على سبيل المثال، تقدّم بعض شرائح الشرائح بشكل متزايد. تحتوي قناة Intel Kabylake (وغيرها) على مسار كامل لترميز الأجهزة. (ملاحظة: يمكن أن تستخدم وحدة معالجة الرسومات في Kabylake ترميز VP9 8 بت، ولكن ليس 10 بت).

مثال عملي لجهاز كمبيوتر سطح المكتب باستخدام Shaka Packager

وقد يكون Shaka Packager مثالاً عمليًا على أجهزة كمبيوتر سطح المكتب الشائعة. هناك طريقة بسيطة لإعداد Shaka، وهي تركيبها في حاوية docker باستخدام صورة dockerHub من Google. ويمكن العثور على التعليمات هنا:

https://github.com/google/shaka-packager#using-docker-for-testing--development

في هذا المثال، استخدمنا جهازًا مع الإعداد التالي:

النظام المضيف: obs Kernel: 4.4.0-91-lowlatency x86_64 (64 بت)
جهاز الكمبيوتر المكتبي Xfce 4.12.3 التوزيع: نظام التشغيل: https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/
وحدة المعالجة المركزية معالج رباعي النواة رباعي النواة i5-6500 (-MCP-)
: 6144 كيلوبايت
سرعات: 3600 ميغاهرتز: 3600 ميغاهرتز 1: 800 ميغاهرتز 2: 800 ميغاهرتز 3: 800 ميغاهرتز 4: 800 ميغاهرتز
بطاقة الرسومات معالج الرسومات المدمج Intel Skylake
الذاكرة ذاكرة وصول عشوائي (RAM) بحجم 8 غيغابايت

من الناحية العملية، بإمكان هذا الجهاز إنتاج النطاق القابل للاستخدام التالي من ترميزات ABR على النحو الأمثل، مع الإبلاغ عن FFmpeg باستمرار بمعدّل 1x سرعة ترميز:

ffmpeg -stream_loop 100 -i 120s_tears_of_steel_1080p.webm \
  -y -r 30 -g 90 -s 1920x1080 -quality realtime -speed 7 -threads 8 \
  -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 \
  -b:v 4500k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe1 \
  -y -r 30 -g 90 -s 1280x720 -quality realtime -speed 8 -threads 6 \
  -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 \
  -b:v 3000k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe2 \
  -y -r 30 -g 90 -s 640x360 -quality realtime -speed 8 -threads 2 \
  -row-mt 1 -tile-columns 1 -frame-parallel 1 -qmin 4 -qmax 48 \
  -b:v 730k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe3

يُرجى العِلم أنّ إعدادات -speed مرتفعة جدًا. تم إنشاء هذه الإعدادات تجريبيًا وستتفاوت من جهاز إلى آخر.

النفقات العامة في Shaka Packager

ولا يتطلب التغليف نشاطًا كبيرًا بشكل كبير في وحدة المعالجة المركزية (CPU). يمكن إعداد Shaka Packager للاستماع إلى كل المُخرجات، حتى لو كان يتم إرسال مجموعة فرعية فقط من تطبيق FFmpeg. في ما يلي إعدادات أداة الحزم التي تم اختبارها على الجهاز الموضحة أعلاه:

packager \
  in=pipe1,stream=audio,init_segment=livehd-audio-1080.webm,segment_template=livehd-audio-1080-\$Number\$.webm \
  in=pipe1,stream=video,init_segment=livehd-video-1080.webm,template=livehd-video-1080-\$Number\$.webm \
  in=pipe2,stream=audio,init_segment=livehd-audio-720.webm,segment_template=livehd-audio-720-\$Number\$.webm \
  in=pipe2,stream=video,init_segment=livehd-video-720.webm,template=livehd-video-720-\$Number\$.webm \
  in=pipe3,stream=audio,init_segment=livehd-audio-360.webm,segment_template=livehd-audio-360-\$Number\$.webm \
  in=pipe3,stream=video,init_segment=livehd-video-360.webm,template=livehd-video-360-\$Number\$.webm \
  --mpd_output livehd.mpd --dump_stream_info --min_buffer_time=10 --time_shift_buffer_depth=300 \
  --segment_duration=3 --io_block_size 65536