الترميز المباشر باستخدام VP9 من خلال FFmpeg
مَعلمات الترميز
توفّر VP9 مجموعة من المَعلمات لتحسين عملية الترميز المباشر. تتم مناقشة بعض المبادئ العامة لهذه الأوضاع في مقالة أوضاع معدل نقل البيانات.
مثال على ترميز VP9 باستخدام FFmpeg
يوضّح الجدول أدناه مَعلمات مثال على طلب ffmpeg
لترميز VP9.
المَعلمة | الوصف |
---|---|
-quality realtime |
realtime ضروري للبث المباشر وللسرعات التي تتجاوز 5 . |
-speed 6 |
يجب استخدام السرعة 5 إلى 8 لتشفير البث المباشر / في الوقت الفعلي. تشير الأرقام المنخفضة (5 أو 6 ) إلى جودة أعلى، ولكنّها تتطلّب المزيد من طاقة وحدة المعالجة المركزية. ستكون الأرقام الأعلى (7 أو 8 ) بجودة أقل ولكنها أكثر قابلية للإدارة لحالات الاستخدام التي تتطلّب وقت استجابة أقل، وكذلك للأجهزة التي تتطلّب طاقة أقل لوحدة المعالجة المركزية (CPU)، مثل الأجهزة الجوّالة. |
-tile-columns 4 |
تقسّم التجانب الفيديو إلى مناطق مستطيلة، ما يتيح استخدام عدة سلاسل محادثات للترميز وفك الترميز. يكون عدد المربّعات دائمًا مضاعفًا للرقم 2. 0 = مربّع واحد، 1 = مربّعان، 2 = 4 مربّعات، 3 = 8 مربّعات، 4 = 16 مربّعًا، 5 = 32 مربّعًا. |
-frame-parallel 1 |
تفعيل ميزات إمكانية فك الترميز المتوازي |
-threads 8 |
الحد الأقصى لعدد سلاسل المحادثات التي سيتم استخدامها |
-static-thresh 0 |
الحدّ الأدنى لرصد الحركة |
-max-intra-rate 300 |
الحد الأقصى لمعدّل نقل بيانات إطار i-Frame (بالنسبة المئوية) |
-deadline realtime |
الإصدار البديل (القديم) من -quality realtime |
-lag-in-frames 0 |
الحدّ الأقصى لعدد اللقطات التي يمكن أن تتأخر |
-qmin 4 -qmax 48 |
الحدّ الأدنى والأقصى لقيم أداة تحديد الكمية القيم الواردة هنا هي مجرد اقتراح، وسيساعد تعديلها في زيادة/خفض جودة الفيديو على حساب كفاءة الضغط. |
-row-mt 1 |
فعِّل ميزة "تعدد مؤشرات الترابط للصفوف". يسمح باستخدام ما يصل إلى ضعف عدد سلاسل المحادثات كأعمدة للمربّعات. 0 = غير مفعَّل، 1 = مفعَّل |
-error-resilient 1 |
تفعيل ميزات مقاومة الأخطاء |
اختيار مَعلمات الترميز
تستخدِم المعلومات أدناه ترميزًا بمعدل نقل بيانات ثابت (CBR) للبث المباشر بمعدل نقل بيانات متكيّف (ABR)، حيث يتم ضبط كل معدل مستهدف بشكل صريح في ملف بيان برنامج التجميع. سيؤدي ذلك إلى "التبديل" بشكل أكثر سلاسة بين الأسعار للعملاء. تتوفّر أيضًا خيارات معدّل نقل البيانات المتغيّر (VBR) ووضع CQ إذا كان معدّل نقل البيانات أكثر مرونة أو إذا تم تقسيم الترميز إلى أجزاء. لن يكون وضع Q مناسبًا لتشفير الفيديو في الوقت الفعلي، وهو أمر ضروري لبث الفيديو المباشر. يمكنك الاطّلاع على أوضاع معدّل نقل البيانات لمزيد من المعلومات.
للحصول على مزيد من التفاصيل حول كيفية معالجة VP9، ننصحك أيضًا بالرجوع إلى المقالة المصاحبة حول إعدادات الفيديو عند الطلب، مع مراعاة التركيز على معدّل البت الثابت.
نصائح
يُرجى العِلم أنّه عند البث المباشر، يجب أن تكون سرعة الترميز في الوقت الفعلي 1x على الأقل (يُبلغ FFmpeg عن سرعة الترميز أثناء تقدّمه). إذا انخفضت سرعة الترميز إلى أقل من مرة واحدة، لن تتمكّن عملية الترميز من مواكبة إدخال الفيديو المباشر، وسيواجه المستخدمون مشاكل في التخزين المؤقت، وستؤدي الانقطاعات في الإرسال إلى جعل البث غير قابل للاستخدام أثناء البث المباشر (مع أنّ الأرشيف سيكون قابلاً للاستخدام بشكل عام).
أمثلة على ترميز المَعلمات أثناء التنفيذ
يوضّح ما يلي استخدام وحدة المعالجة المركزية بمعدل 25 لقطة في الثانية لأحجام مختلفة من اللقطات على جهاز كمبيوتر مكتبي رباعي النواة i5 بسرعة 3.6 غيغاهرتز يعمل بنظام التشغيل Linux:
الدقة المستهدَفة | مَعلمات VP9 في FFmpeg | وحدة المعالجة المركزية / السرعة (مثال) |
---|---|---|
3840x2160 (2160p) | -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 | ~88% 0.39x |
2560x1440 (1440p) | -r 30 -g 90 -s 2560x1440 -quality realtime -speed 5 -threads 16 -row-mt 1 -tile-columns 3 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 6000k | ~86% 0.68x |
1920x1080 (1080p) | -r 30 -g 90 -s 1920x1080 -quality realtime -speed 5 -threads 8 -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 4500k | ~82% 1.04x |
1280x720 (720p) | -r 30 -g 90 -s 1280x720 -quality realtime -speed 5 -threads 8 -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 3000k | ~78% 1.77x |
854x480 (480p) | -r 30 -g 90 -s 854x480 -quality realtime -speed 6 -threads 4 -row-mt 1 -tile-columns 1 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 1800k | ~64% 3.51x |
640x360 (360p) | -r 30 -g 90 -s 640x360 -quality realtime -speed 7 -threads 4 -row-mt 1 -tile-columns 1 -frame-parallel 0 -qmin 4 -qmax 48 -b:v 730k | 62% تقريبًا 5.27x |
426x240 (240p) | -r 30 -g 90 -s 426x240 -quality realtime -speed 8 -threads 2 -row-mt 1 -tile-columns 0 -frame-parallel 0 -qmin 4 -qmax 48 -b:v 365k | 66% تقريبًا 8.27x |
قد يبدو مثال 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 libvpx-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 libvpx-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 libvpx-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 libvpx-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 libvpx-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 libvpx-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 libvpx-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 libvpx-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 Distro: OS: https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/ |
وحدة المعالجة المركزية | معالج رباعي النواة من فئة Intel Core i5-6500 (-MCP-) ذاكرة التخزين المؤقت: 6144 كيلوبايت سرعات المعالجة: الحد الأقصى: 3600 ميغاهرتز 1: 800 ميغاهرتز 2: 800 ميغاهرتز 3: 800 ميغاهرتز 4: 800 ميغاهرتز |
بطاقة الرسومات | معالج الرسومات المدمج Intel Skylake |
الذاكرة | ذاكرة وصول عشوائي بسعة 8 غيغابايت |
في الواقع، يمكن لهذا الجهاز أن ينتج على النحو الأمثل النطاق التالي القابل للاستخدام من عمليات ترميز ABR، مع تسجيل FFmpeg باستمرار لسرعة ترميز تبلغ مرة واحدة:
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 libvpx-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 libvpx-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 libvpx-vp9 -b:a 128k -c:a libopus -f webm pipe3
يُرجى العِلم أنّ إعدادات -speed
مرتفعة جدًا. تم تحديد هذه الإعدادات بشكل تجريبي، وستختلف من جهاز إلى آخر.
النفقات العامة لبرنامج Shaka Packager
لا يشكّل التغليف نشاطًا مكثفًا بشكل خاص لوحدة المعالجة المركزية. يمكن ضبط 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