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