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