Encoding langsung dengan VP9 menggunakan FFmpeg
Parameter encoding
VP9 menyediakan berbagai parameter untuk mengoptimalkan encoding live. Beberapa prinsip lengkap ini dibahas dalam Mode Bitrate.
Contoh encoding FFmpeg VP9
Tabel di bawah ini menjelaskan parameter dari contoh panggilan ffmpeg
untuk encoding VP9.
Parameter | Deskripsi |
---|---|
-quality realtime |
realtime sangat penting untuk live streaming dan untuk kecepatan di atas 5 . |
-speed 6 |
Kecepatan 5 ke 8 harus digunakan untuk encoding live/real-time. Angka yang lebih rendah (5 atau 6 ) berkualitas lebih tinggi, tetapi memerlukan lebih banyak daya CPU. Angka yang lebih tinggi (7 atau 8 ) akan berkualitas lebih rendah, tetapi lebih mudah dikelola untuk kasus penggunaan latensi yang lebih rendah dan juga untuk perangkat berdaya CPU lebih rendah seperti seluler. |
-tile-columns 4 |
Ubin membagi video menjadi area persegi panjang, yang memungkinkan multi-threading untuk encoding dan decoding. Jumlah kotak selalu pangkat dua. 0 = 1 ubin, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32. |
-frame-parallel 1 |
Aktifkan fitur dekodebilitas paralel. |
-threads 8 |
Jumlah maksimum rangkaian pesan yang akan digunakan. |
-static-thresh 0 |
Nilai minimum deteksi gerakan. |
-max-intra-rate 300 |
Kecepatan bit i-Frame maksimum (pct) |
-deadline realtime |
Versi alternatif (lama) -quality realtime |
-lag-in-frames 0 |
Jumlah maksimum frame yang akan diberi jeda |
-qmin 4 -qmax 48 |
Nilai minimum dan maksimum untuk kuantisasi. Nilai yang dimaksud di sini hanyalah saran dan penyesuaian nilai tersebut akan membantu meningkatkan/mengurangi kualitas video dengan mengorbankan efisiensi kompresi. |
-row-mt 1 |
Mengaktifkan multi-threading. Memungkinkan penggunaan hingga 2x thread sebagai kolom ubin. 0 = nonaktif, 1 = aktif. |
-error-resilient 1 |
Mengaktifkan fitur ketahanan error. |
Memilih parameter encoding
Informasi di bawah menggunakan encoding kecepatan bit konstan (CBR) untuk streaming kecepatan bit adaptif (ABR) secara langsung, di mana setiap kecepatan target disetel secara eksplisit dalam manifes packager. Ini akan menghasilkan "peralihan" yang lebih bersih antara tarif untuk klien. Encoding kecepatan bit variabel (VBR) dan mode CQ juga merupakan opsi jika kecepatan bit dapat lebih fleksibel atau encoding sedang dipotong. Mode Q akan kesulitan menemukan encoding realtime yang diperlukan untuk video live. Lihat Mode Bitrate untuk mengetahui informasi selengkapnya.
Untuk detail lebih lanjut tentang cara memanipulasi VP9, sebaiknya Anda juga membaca artikel yang menyertainya tentang setelan VOD, tetapi dengan mempertimbangkan fokus pada CBR.
Tips dan trik
Ingat bahwa saat live streaming, semuanya dibatasi pada kecepatan encoding realtime minimum 1x (FFmpeg melaporkan kecepatan encoding saat sedang berlangsung). Jika kecepatan encoding turun di bawah 1x, proses encoding tidak akan mengikuti input video live, dan pengguna akan mengalami buffering, dan gangguan dalam transmisi akan membuat streaming tidak dapat digunakan selama live streaming (meskipun arsip secara umum tidak dapat digunakan).
Contoh penerapan parameter encoding
Berikut ini menunjukkan pemakaian CPU pada 25 fps untuk berbagai ukuran frame di desktop i5 3.6Ghz empat inti yang menjalankan Linux:
Resolusi Target | Parameter FFmpeg VP9 | CPU / Kecepatan (contoh) |
---|---|---|
3840x2160 (2160p) | -r 30 -g 90 -s 3840x2160 -kualitas realtime -speed 5 -threads 16 -row-mt 1 -tile-columns 3 -frame-paralel 1 -qmin 4 -qmax 48 -b:v 7800k | ~88% 0,39x |
2560x1440 (1440p) | -r 30 -g 90 -s 2560x1440 -kualitas realtime -speed 5 -threads 16 -row-mt 1 -tile-columns 3 -frame-paralel 1 -qmin 4 -qmax 48 -b:v 6000k | ~86% 0,68x |
1920x1080 (1080p) | -r 30 -g 90 -s 1920x1080 -kualitas realtime -speed 5 -threads 8 -row-mt 1 -tile-columns 2 -frame-paralel 1 -qmin 4 -qmax 48 -b:v 4500k | ~82% 1,04x |
1280x720 (720p) | -r 30 -g 90 -s 1280x720 -kualitas realtime -speed 5 -threads 8 -row-mt 1 -tile-columns 2 -frame-paralel 1 -qmin 4 -qmax 48 -b:v 3000k | ~78% 1,77x |
854x480 (480p) | -r 30 -g 90 -s 854x480 -kualitas realtime -speed 6 -threads 4 -row-mt 1 -tile-columns 1 -frame-paralel 1 -qmin 4 -qmax 48 -b:v 1800k | ~64% 3,51x |
640x360 (360p) | -r 30 -g 90 -s 640x360 -kualitas realtime -speed 7 -threads 4 -row-mt 1 -tile-columns 1 -frame-paralel 0 -qmin 4 -qmax 48 -b:v 730k | ~62% 5,27x |
426x240 (240p) | -r 30 -g 90 -s 426x240 -kualitas realtime -speed 8 -threads 2 -row-mt 1 -tile-columns 0 -frame-paralel 0 -qmin 4 -qmax 48 -b:v 365k | ~66% 8,27x |
Contoh FFmpeg mungkin terlihat seperti ini:
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
Tips dan trik
Perlu diketahui bahwa di sini kita menghasilkan output ke pipeline FIFO ("pipe1"), yang harus dibuat sebelum eksekusi, sebelum menjalankan perintah FFmpeg. Untuk melakukannya, berikan perintah
mkfifo pipe1
di direktori kerja Anda. Saat menggunakan Shaka Packager, fungsi ini akan memproses pipe tersebut sebagai sumber input untuk streaming tertentu. Model pengemasan lainnya mungkin memerlukan metode lain.Untuk memastikan perintah
-row-mt
dikenali, gunakan rilis stabil FFmpeg terbaru (3.3.3 saat ini) dari https://www.ffmpeg.org/download.html
Contoh kecepatan bit adaptif yang disetel
Bergantung pada kemampuan mesin yang menjalankan encoding FFmpeg, mungkin atau mungkin tidak mungkin untuk mengirimkan semua encoding berikut secara bersamaan sehingga subset yang sesuai dengan resource dan audience target Anda yang tersedia harus dipilih dari daftar.
Kumpulan ABR FFmpeg lengkap
Dalam skenario yang ideal, kami menggabungkan contoh encoding yang diuraikan di bagian sebelumnya untuk membuat satu perintah yang menghasilkan semuanya secara bersamaan:
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
Namun, set lengkap di atas memerlukan CPU yang sangat kuat, atau mungkin dukungan dari offload GPU hardware seperti beberapa chipset yang semakin banyak disediakan. Intel Kabylake (dan seterusnya) memiliki pipeline encoding hardware lengkap. (Perlu diperhatikan bahwa GPU Kabylake dapat melakukan encoding VP9 8-bit, tetapi tidak dapat melakukan 10-bit).
Contoh desktop praktis menggunakan Shaka Packager
Contoh yang lebih praktis untuk mesin desktop umum mungkin menggunakan Shaka Packager. Cara sederhana untuk menyiapkan Shaka adalah dengan menginstalnya dalam container Docker, menggunakan image DockerHub Google. Petunjuk dapat ditemukan di sini:
https://github.com/google/shaka-packager#using-docker-for-testing--pengembangan
Untuk contoh ini, kami menggunakan mesin dengan konfigurasi berikut:
Sistem | Host: obs Kernel: 4.4.0-91-lowlatency x86_64 (64 bit) |
Desktop | Dif Xfce 4.12.3: OS: https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/ |
CPU | Intel Core i5-6500 Quad core (-MCP-) cache: 6144 KB kecepatan clock: maks: 3600 MHz 1: 800 MHz 2: 800 MHz 3: 800 MHz 4: 800 MHz |
Kartu Grafis | Grafis terintegrasi Intel Skylake |
Memori | RAM 8 GB |
Dalam praktiknya, mesin ini dapat secara optimal menghasilkan rentang encoding ABR yang dapat digunakan berikut, dengan FFmpeg secara konsisten melaporkan kecepatan encoding 1x:
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
Perlu diperhatikan bahwa setelan -speed
cukup tinggi. Setelan ini ditentukan secara eksperimental dan akan berbeda-beda di setiap komputer.
Overhead Shaka Packager
Kemasan bukan aktivitas yang intensif CPU secara khusus. Shaka Packager dapat disetel untuk memproses semua output, meskipun hanya subset yang dikirim oleh FFmpeg. Berikut adalah setelan packager yang diuji pada mesin yang diuraikan di atas:
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