FFmpeg kullanarak VP9 ile canlı kodlama
Kodlama parametreleri
VP9, canlı kodlamayı optimize etmek için çeşitli parametreler sunar. Bunlarla ilgili bazı genel ilkeler Bit Hızı Modları bölümünde ele alınmıştır.
FFmpeg VP9 kodlama örneği
Aşağıdaki tabloda, VP9 kodlaması için örnek bir ffmpeg
çağrısının parametreleri açıklanmaktadır.
Parametre | Açıklama |
---|---|
-quality realtime |
realtime , canlı yayın ve 5 üzerindeki hızlar için gereklidir. |
-speed 6 |
Canlı / gerçek zamanlı kodlama için 5 ile 8 arasındaki hız kullanılmalıdır. Daha düşük sayılar (5 veya 6 ) daha yüksek kalitede olsa da daha fazla CPU gücü gerektirir. Daha yüksek sayılar (7 veya 8 ), daha düşük kaliteli ancak daha düşük gecikmeli kullanım alanları ve mobil gibi daha düşük CPU gücüne sahip cihazlar için daha yönetilebilir olacaktır. |
-tile-columns 4 |
Döşeme, videoyu dikdörtgen bölgelere böler. Bu sayede kodlama ve kod çözme için çoklu iş parçacığı kullanılabilir. Parça sayısı her zaman 2'nin kuvvetidir. 0 = 1 döşeme, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32. |
-frame-parallel 1 |
Paralel kod çözme özelliklerini etkinleştirin. |
-threads 8 |
Kullanılacak maksimum iş parçacığı sayısı. |
-static-thresh 0 |
Hareket algılama eşiği. |
-max-intra-rate 300 |
Maksimum i-Frame bit hızı (yüzde) |
-deadline realtime |
-quality realtime 'nın alternatif (eski) sürümü |
-lag-in-frames 0 |
Gecikme için maksimum kare sayısı |
-qmin 4 -qmax 48 |
Kuantalayıcı için minimum ve maksimum değerler. Buradaki değerler yalnızca bir öneridir ve bu değeri ayarlamak, sıkıştırma verimliliği pahasına video kalitesini artırmaya/azaltmaya yardımcı olur. |
-row-mt 1 |
Satır çoklu iş parçacığını etkinleştirin. Kutular için en fazla 2 kat iş parçacığı kullanılmasına izin verir. 0 = kapalı, 1 = açık. |
-error-resilient 1 |
Hata dayanıklılığı özelliklerini etkinleştirin. |
Kodlama parametrelerini seçme
Aşağıdaki bilgilerde, her hedef hızın paketleyicinin manifestinde açıkça ayarlandığı canlı uyarlanabilir bit hızı (ABR) için sabit bit hızı (CBR) kodlaması kullanılır. Bu, müşteriler için fiyatlar arasında daha net bir "geçiş" sağlar. Bit hızının daha esnek olabileceği veya kodlamanın parçalar halinde yapıldığı durumlarda değişken bit hızı (VBR) kodlama ve CQ modu da kullanılabilir. Q modu, canlı video için gereken gerçek zamanlı kodlamada zorlanır. Daha fazla bilgi için Bit Hızı Modları konusuna bakın.
VP9'u nasıl işleyeceğinizle ilgili daha fazla bilgi için VOD ayarları hakkındaki makaleye de göz atabilirsiniz. Ancak bu makalede CBR'ye odaklanıldığını unutmayın.
İpuçları ve püf noktaları
Canlı yayın yaparken her şeyin en az 1 kat gerçek zamanlı kodlama hızıyla (FFmpeg, kodlama hızını ilerledikçe bildirir) sınırlandırıldığını unutmayın. Kodlama hızınız 1 katın altına düşerse kodlama işlemi canlı video girişine yetişemez. Bu durumda kullanıcılar arabelleğe alma sorunu yaşar ve yayındaki kesintiler, canlı yayın sırasında akışı kullanılamaz hâle getirir (ancak arşiv genellikle kullanılabilir).
Kodlama parametrelerinin kullanımına ilişkin örnekler
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) |
---|---|---|
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,39 kat |
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,04 kat |
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,51 kat |
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,27 kat |
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,27 kat |
Bir FFmpeg örneği şu şekilde 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 libvpx-vp9 \
-b:a 128k -c:a libopus -f webm pipe1
İpuçları ve püf noktaları
Burada, FFmpeg komutu çalıştırılmadan önce yürütülmeden önce oluşturulması gereken bir FIFO kanalına ("pipe1") çıkış yaptığımızı unutmayın. Bunu yapmak için çalışma dizininizde
mkfifo pipe1
komutunu verin. Shaka Packager kullanılırken bu kanal, söz konusu akışın giriş kaynağı olarak dinlenir. Diğer paketleme modelleri için farklı bir yöntem gerekebilir.-row-mt
komutlarının tanınması için https://www.ffmpeg.org/download.html adresinden FFmpeg'in en son kararlı sürümünü (şu anda 3.3.3) kullanın.
Uyarlanabilir bit hızı kümesi örneği
FFmpeg kodlamasının çalıştırıldığı makinenin gücüne bağlı olarak, aşağıdaki kodlamaların tümünün aynı anda yayınlanması mümkün olabilir veya olmayabilir. Bu nedenle, listeden kendi kaynaklarınıza ve hedef kitlelerinize uygun bir alt küme seçilmelidir.
FFmpeg tam ABR seti
İdeal bir senaryoda, önceki bölümde özetlenen 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 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
Ancak yukarıdaki tam set için çok güçlü bir CPU veya bazı yonga setlerinin giderek daha fazla sağladığı gibi donanım GPU boşaltma desteği gerekebilir. Intel Kabylake (ve sonrası) tam donanım kodlama işlem hattına sahiptir. (Kabylake GPU'nun 8 bit VP9 kodlaması yapabileceğini ancak 10 bit kodlama yapamayacağını unutmayın.)
Shaka Packager'ı kullanan pratik bir masaüstü örneği
Yaygın masaüstü makineleri için daha pratik bir örnekte Shaka Packager kullanılabilir. Shaka'yı kurmanın basit bir yolu, Google'ın DockerHub görüntüsünü kullanarak 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 Çekirdek: 4.4.0-91-lowlatency x86_64 (64 bit) |
Masaüstü | Xfce 4.12.3 Distro: OS: https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/ |
CPU | Quad core 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 tümleşik grafik kartı |
Bellek | 8 GB RAM |
Bu makine, pratikte aşağıdaki kullanılabilir ABR kodlama aralığını optimum şekilde üretebilir. FFmpeg, kodlama hızını tutarlı bir şekilde 1x olarak bildirir:
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
ayarlarının oldukça yüksek olduğunu unutmayın. Bu ayarlar deneysel olarak belirlenmiştir ve makineden makineye değişiklik gösterir.
Shaka Packager ek yükü
Paketleme, özellikle CPU yoğun bir etkinlik değildir. Shaka Packager, FFmpeg tarafından yalnızca bir alt küme yayınlansa bile tüm çıkışları dinleyecek şekilde ayarlanabilir. Yukarıda belirtilen 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