رمزگذاری زنده با VP9 با استفاده از FFmpeg

پارامترهای رمزگذاری

VP9 طیف وسیعی از پارامترها را برای بهینه سازی رمزگذاری زنده ارائه می دهد. برخی از اصول گسترده این موارد در حالت بیت ریت مورد بحث قرار گرفته است.

نمونه رمزگذاری FFmpeg VP9

جدول زیر پارامترهای یک فراخوانی ffmpeg مثال برای رمزگذاری VP9 را توضیح می دهد.

پارامتر شرح
-quality realtime realtime برای پخش زنده و برای سرعت های بالاتر از 5 ضروری است.
-speed 6 سرعت 5 تا 8 باید برای رمزگذاری زنده / بلادرنگ استفاده شود. اعداد پایین تر ( 5 یا 6 ) کیفیت بالاتری دارند اما به قدرت CPU بیشتری نیاز دارند. اعداد بالاتر ( 7 یا 8 ) کیفیت پایین‌تری دارند، اما برای موارد استفاده با تأخیر کمتر و همچنین برای دستگاه‌های کم‌توان CPU مانند موبایل، قابل کنترل‌تر خواهند بود.
-tile-columns 4 کاشی کاری ویدیو را به مناطق مستطیلی تقسیم می کند که امکان چند رشته را برای رمزگذاری و رمزگشایی فراهم می کند. تعداد کاشی ها همیشه توان دو است. 0 = 1 کاشی، 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 ردیف چند رشته ای را فعال کنید. اجازه می دهد تا از 2x نخ به عنوان ستون کاشی استفاده کنید. 0 = خاموش، 1 = روشن.
-error-resilient 1 ویژگی های انعطاف پذیری خطا را فعال کنید.

انتخاب پارامترهای رمزگذاری

اطلاعات زیر از رمزگذاری نرخ بیت ثابت (CBR) برای پخش زنده نرخ بیت تطبیقی ​​(ABR) استفاده می‌کند، که در آن هر نرخ هدف به صراحت در مانیفست بسته‌کننده تنظیم شده است. این منجر به "تغییر" تمیزتر بین نرخ ها برای مشتریان می شود. اگر نرخ بیت می تواند انعطاف پذیرتر باشد یا رمزگذاری در حال تکه تکه شدن باشد، رمزگذاری نرخ بیت متغیر (VBR) و حالت CQ نیز گزینه هایی هستند. حالت Q با رمزگذاری بیدرنگ مورد نیاز برای ویدیوی زنده مشکل دارد. برای اطلاعات بیشتر به حالت بیت ریت مراجعه کنید.

برای جزئیات بیشتر در مورد نحوه دستکاری VP9 نیز ارزش دارد به مقاله همراه در مورد تنظیمات VOD مراجعه کنید، اما با توجه به تمرکز بر CBR.

نکات و ترفندها

به یاد داشته باشید که هنگام پخش زنده، همه چیز به حداقل سرعت رمزگذاری بلادرنگ 1x محدود می شود (FFmpeg سرعت رمزگذاری را در حین پیشرفت گزارش می دهد). اگر سرعت رمزگذاری شما کمتر از 1 برابر شود، فرآیند رمزگذاری با ورودی ویدیوی زنده مطابقت نمی‌کند و کاربران بافر را تجربه می‌کنند، و وقفه‌هایی در انتقال باعث می‌شود جریان در طول پخش زنده غیرقابل استفاده باشد (اگرچه آرشیو عموماً قابل استفاده خواهد بود. ).

نمونه هایی از پارامترهای رمزگذاری در عمل

موارد زیر استفاده از CPU را با سرعت 25 فریم در ثانیه برای اندازه های مختلف فریم در دسکتاپ چهار هسته ای i5 3.6 گیگاهرتزی با لینوکس نشان می دهد:

وضوح هدف پارامترهای FFmpeg VP9 CPU / سرعت (مثال)
3840x2160 (2160p) -r 30 -g 90 -s 3840x2160 -کیفیت بیدرنگ -سرعت 5 -رشته ها 16 -ردیف-mt 1 -کاشی-ستون ها 3 -قاب-موازی 1 -qmin 4 -qmax 48 -b:v 7800k ~88٪ 0.39x
2560x1440 (1440p) -r 30 -g 90 -s 2560x1440 -کیفیت بیدرنگ -سرعت 5 -رشته ها 16 -ردیف-mt 1 -کاشی-ستون ها 3 -قاب-موازی 1 -qmin 4 -qmax 48 -b:v 6000k ~86٪ 0.68x
1920x1080 (1080p) -r 30 -g 90 -s 1920x1080 -کیفیت بلادرنگ -سرعت 5 -رشته ها 8 -ردیف-mt 1 -کاشی-ستون ها 2 -قاب-موازی 1 -qmin 4 -qmax 48 -b:v 4500k ~82٪ 1.04x
1280x720 (720p) -r 30 -g 90 -s 1280x720 -کیفیت بیدرنگ -سرعت 5 -رشته ها 8 -ردیف-mt 1 -کاشی-ستون ها 2 -قاب-موازی 1 -qmin 4 -qmax 48 -b:v 3000k ~ 78٪ 1.77x
854x480 (480p) -r 30 -g 90 -s 854x480 -کیفیت بلادرنگ -سرعت 6 -رشته های 4 -ردیف-mt 1 -کاشی-ستون ها 1 -قاب-موازی 1 -qmin 4 -qmax 48 -b:v 1800k ~ 64٪ 3.51x
640x360 (360p) -r 30 -g 90 -s 640x360 -کیفیت بیدرنگ -سرعت 7 -رشته ها 4 -ردیف-mt 1 -کاشی-ستون ها 1 -قاب-موازی 0 -qmin 4 -qmax 48 -b:v 730k ~ 62٪ 5.27x
426x240 (240p) -r 30 -g 90 -s 426x240 -کیفیت بلادرنگ -سرعت 8 -رشته ها 2 -ردیف-mt 1 -کاشی-ستون ها 0 -قاب-موازی 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 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

با این حال، مجموعه کامل فوق به یک CPU بسیار قدرتمند یا احتمالاً پشتیبانی از بارگیری سخت‌افزار GPU مانند برخی از چیپ‌ست‌ها نیاز دارد. اینتل Kabylake (و فراتر از آن) یک خط لوله رمزگذاری سخت افزاری کامل دارد. (توجه داشته باشید که GPU Kabylake می تواند VP9 8 بیتی رمزگذاری کند، اما نه 10 بیتی).

یک مثال کاربردی دسکتاپ با استفاده از Shaka Packager

یک مثال کاربردی تر برای ماشین های رومیزی معمولی ممکن است از Shaka Packager استفاده کند. یک راه ساده برای راه اندازی Shaka این است که آن را در یک ظرف Docker با استفاده از تصویر DockerHub Google نصب کنید. دستورالعمل ها را می توان در اینجا یافت:

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

برای این مثال از ماشینی با پیکربندی زیر استفاده کردیم:

سیستم میزبان: هسته obs: 4.4.0-91-lowlatency x86_64 (64 بیت)
دسکتاپ Xfce 4.12.3 توزیع: سیستم عامل: https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/
CPU چهار هسته ای Intel Core i5-6500 (-MCP-)
کش: 6144 کیلوبایت
سرعت کلاک: حداکثر: 3600 مگاهرتز 1: 800 مگاهرتز 2: 800 مگاهرتز 3: 800 مگاهرتز 4: 800 مگاهرتز
کارت گرافیک گرافیک یکپارچه Skylake اینتل
حافظه 8 گیگابایت رم

در عمل، این دستگاه می تواند به طور بهینه محدوده قابل استفاده زیر از کدهای ABR را تولید کند، با FFmpeg که به طور مداوم سرعت کدگذاری 1 برابر را گزارش می کند:

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 بسیار بالاست. این تنظیمات به صورت تجربی ایجاد شده اند و از ماشینی به ماشین دیگر متفاوت خواهند بود.

سربار بسته بندی شاکا

بسته بندی فعالیتی به خصوص فشرده سازی 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