FFmpeg kullanarak VP9 ile canlı kodlama

Kodlama parametreleri

VP9, canlı kodlamayı optimize etmek için çeşitli parametreler sağlar. Bunlarla ilgili bazı genel ilkeler Bit Hızı Modları'nda açıklanmıştır.

FFmpeg VP9 kodlama örneği

Aşağıdaki tabloda, VP9 kodlama için örnek ffmpeg çağrısının parametreleri açıklanmaktadır.

Parametre Açıklama
-quality realtime realtime, canlı yayın ve 5 dışındaki hızlar için çok önemlidir.
-speed 6 Canlı/gerçek zamanlı kodlama için 5-8 hızı kullanılmalıdır. Düşük sayılar (5 veya 6) daha yüksek kalitededir, ancak daha fazla CPU gücü gerektirir. Yüksek sayılar (7 veya 8) daha düşük kalitede olur, ancak daha düşük gecikmeli kullanım alanları ile mobil gibi daha düşük CPU güç cihazları için daha yönetilebilirdir.
-tile-columns 4 Karo, videoyu dikdörtgen bölgelere böler. Böylece kodlama ve kod çözme için birden çok mesaj dizisine olanak tanır. Karo sayısı her zaman ikinin kuvvetidir. 0 = 1 karo, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32.
-frame-parallel 1 Paralel kod çözme özelliklerini etkinleştirin.
-threads 8 Kullanılacak maksimum ileti dizisi sayısı.
-static-thresh 0 Hareket algılama eşiği.
-max-intra-rate 300 Maksimum i-Frame bit hızı (pct)
-deadline realtime -quality realtime ürününün alternatif (eski) sürümü
-lag-in-frames 0 Gecikme için maksimum kare sayısı
-qmin 4 -qmax 48 Niteleyici için minimum ve maksimum değerler. Buradaki değerler yalnızca öneri niteliğindedir. Bu değerleri düzenlemek, sıkıştırma verimliliğinden ödün vererek video kalitesinin artırılmasına/azaltılmasına yardımcı olur.
-row-mt 1 Satır çoklu ileti dizisini etkinleştir. Parça sütunu olarak en fazla 2x ileti dizisi kullanılmasına izin verir. 0 = kapalı, 1 = açık.
-error-resilient 1 Hataya dayanıklı özellikleri etkinleştir.

Kodlama parametrelerini seçme

Aşağıdaki bilgilerde, uyarlanabilir uyarlanabilir bit hızı akışı (ABR) için sabit bit hızı (CBR) kodlaması kullanılmaktadır. Burada her hedef hızı, paketin manifest dosyasında açıkça ayarlanmıştır. Bu, müşterilerin ücretleri arasında daha sorunsuz bir geçiş yapılmasını sağlar. Değişken bit hızı (VBR) kodlaması ve CQ modu, bit hızı daha esnek olabiliyorsa veya kodlama yıkılıyorsa da kullanılabilir. Q modu, canlı video için gereken gerçek zamanlı kodlama konusunda zorlanır. Daha fazla bilgi için Bit Hızı Modları bölümüne bakın.

VP9'un nasıl işleneceği hakkında daha ayrıntılı bilgi için VOD ayarları ile ilgili makaleyi de inceleyebilirsiniz, ancak CBR'ye odaklanmayı da göz önünde bulundurmanız önerilir.

İpuçları ve püf noktaları

Canlı yayın sırasında her şeyin minimum 1 kat gerçek zamanlı kodlama hızıyla kısıtlandığını unutmayın (FFmpeg ilerledikçe kodlama hızı rapor edilir). Kodlama hızınız 1 katın altına düşerse kodlama videosu canlı video girişine ayak uyduramaz ve kullanıcılar arabelleğe alma sorunu yaşarlar ve iletim sırasında aralar, canlı yayın sırasında akışı kullanılamaz hale getirir (arşiv genellikle kullanılabilir olsa da).

Kodlama parametresi kullanım örnekleri

Aşağıda, Linux çalıştıran dört çekirdekli i5 3,6 Ghz masaüstü bilgisayarda çeşitli kare boyutları için 25 fps'de CPU kullanımı gösterilmektedir:

Hedef Çözünürlük FFmpeg VP9 Parametreleri CPU / Hız (örnek)
3.840x2.160 (2.160p) -r 30 -g 90 -s 3840x2160 -kaliteli gerçek zamanlı -hızlı 5 -mesaj dizileri 16 -row-mt 1 -tile-sütunlar 3 -frame-paralel 1 -qmin 4 -qmax 48 -b:v 7800k ~% 88 0,39x
2.560x1.440 (1.440p) -r 30 -g 90 -s 2560x1440 -kaliteli gerçek zamanlı -hızlı 5 -mesaj dizileri 16 -row-mt 1 -tile-sütunlar 3 -frame-paralel 1 -qmin 4 -qmax 48 -b:v 6000k ~% 86 0,68x
1.920x1.080 (1.080p) -r 30 -g 90 -s 1920x1080 -kaliteli gerçek zamanlı -hız 5 -mesaj dizileri 8 -row-mt 1 -tile-sütunlar 2 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 4500k ~% 82 1,04x
1.280x720 (720p) -r 30 -g 90 -s 1280x720 -kaliteli gerçek zamanlı -hızlı 5 -mesaj dizileri 8 -satır-mt 1 -tile-sütunları 2 -frame-paralel 1 -qmin 4 -qmax 48 -b:v 3000k ~% 78 1,77x
854x480 (480p) -r 30 -g 90 -s 854x480 -kaliteli gerçek zamanlı -hız 6 -mesaj dizileri 4 -satır-mt 1 -karo-sütunlar 1 -çerçeve-paralel 1 -qmin 4 -qmax 48 -b:v 1800k ~% 64 3,51x
640x360 (360p) -r 30 -g 90 -s 640x360 -kaliteli gerçek zamanlı -hız 7 -mesaj dizileri 4 -satır-mt 1 -karo-sütunlar 1 -çerçeve-paralel 0 -qmin 4 -qmax 48 -b:v 730k ~% 62 5,27x
426x240 (240p) -r 30 -g 90 -s 426x240 -kaliteli gerçek zamanlı -hız 8 -mesaj dizileri 2 -satır-mt 1 -tile-sütunlar 0 -frame-paralel 0 -qmin 4 -qmax 48 -b:v 365k ~% 66 8,27x

Örnek bir FFmpeg ile ilgili bilgiler aşağıdaki gibi görünebilir:

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

İpuçları ve püf noktaları

  • Burada, FFmpeg komutu çalıştırılmadan önce, çalıştırılmadan önce oluşturulması gereken bir FIFO borusu (" Ankastre" çıkışı) verildiğini unutmayın. Bunu yapmak için çalışma dizininizde mkfifo pipe1 komutunu verin. Shaka Paketleyici kullanılırken belirtilen akış için giriş kaynağı olarak bu kanalı dinler. Diğer paketleme modelleri için farklı bir yöntem gerekebilir.

  • -row-mt komutlarının tanındığından emin olmak için https://www.ffmpeg.org/download.html adresinden FFmpeg'in mevcut kararlı sürümünü (şu anda 3.3.3) kullanın

Uyarlanabilir bit hızı grubu örneği

FFmpeg kodlamasını çalıştıran makinenin gücüne bağlı olarak, aşağıdaki kodlamaların hepsinin aynı anda gönderilmesi mümkün olabilir veya olmayabilir. Bu nedenle, kullanılabilir kaynaklarınız ve hedef kitlelerinize uygun bir alt grup listeden seçilmelidir.

FFmpeg tam ABR ayarı

İdeal bir senaryoda, önceki bölümde belirtilen kodlama örneklerini birleştirerek hepsini aynı anda üreten tek bir komut oluştururuz:

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

Ancak yukarıdaki tam set çok güçlü bir CPU gerektirir veya bazı yonga setleri giderek daha fazla sağlamakta olduğu için donanım GPU yükünden desteklenebilir. Intel Kabylake'in (ve ötesinde) tam donanım kodlama hattına sahiptir. (Kabylake GPU'nun 8 bit VP9 kodlama yapabildiğini, ancak 10 bit yapamayacağını unutmayın).

Shaka Packager'ın kullanıldığı pratik bir masaüstü örneği

Yaygın masaüstü makinelere yönelik daha pratik bir örnek, Shaka Packager'ı kullanabilir. Shaka'yı ayarlamanın kolay bir yolu, Google'ın DockerHub görüntüsünü kullanarak bunu bir Docker container'ına yüklemektir. Talimatları burada bulabilirsiniz.

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

Bu örnekte, aşağıdaki yapılandırmaya sahip bir makine kullandık:

Sistem Ana makine: obs Çekirdeği: 4.4.0-91-düşük gecikme x86_64 (64 bit)
Masaüstü Xfce 4.12.3 Distro: OS: https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/
CPU Dört çekirdekli Intel Core i5-6500 (-MCP-)
önbellek: 6144 KB
saat hızları: maks: 3600 MHz 1: 800 MHz 2: 800 MHz 3: 800 MHz 4: 800 MHz
Grafik Kartı Intel Skylake entegre grafikleri
Bellek 8GB RAM

Pratikte bu makine, aşağıdaki kullanılabilir ABR kodlama aralığını optimum şekilde üretebilir. FFmpeg ile sürekli olarak 1 kat kodlama hızı raporlanır:

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 ayarlarının oldukça yüksek olduğunu unutmayın. Bu ayarlar deneysel olarak oluşturulmuştur ve makineden makineye değişecektir.

Shaka Paketleyici yük yükü

Paketleme özellikle CPU'yu yoğun kullanan bir etkinlik değildir. Shaka Paketleyici, FFmpeg tarafından yalnızca bir alt küme teslim ediliyor olsa bile tüm çıkışları dinlemek için ayarlanabilir. Yukarıda özetlenen makinede test edilen paketleyici ayarları şunlardır:

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