Mã hóa trực tiếp với VP9 bằng FFmpeg

Thông số mã hóa

VP9 cung cấp nhiều thông số để tối ưu hóa quá trình mã hóa trực tiếp. Một số nguyên tắc rộng của những nguyên tắc này được thảo luận trong Chế độ bit.

Ví dụ về mã hóa FFmpeg VP9

Bảng bên dưới mô tả các thông số của lệnh gọi ffmpeg ví dụ để mã hoá VP9.

Thông số Mô tả
-quality realtime realtime là nền tảng cần thiết để phát trực tiếp và có tốc độ trên 5.
-speed 6 Bạn nên sử dụng tốc độ từ 5 đến 8 để mã hóa trực tiếp / thời gian thực. Số thấp hơn (5 hoặc 6) có chất lượng cao hơn nhưng cần nhiều CPU hơn. Số điện thoại cao hơn (7 hoặc 8) sẽ có chất lượng thấp hơn nhưng có thể quản lý tốt hơn đối với các trường hợp sử dụng có độ trễ thấp hơn, đồng thời cũng áp dụng cho các thiết bị có CPU thấp hơn như thiết bị di động.
-tile-columns 4 Tiling chia video thành các vùng hình chữ nhật, cho phép nhiều luồng mã hoá và giải mã. Số ô luôn bằng 2 ô. 0 = 1 ô, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32.
-frame-parallel 1 Bật tính năng song song có thể giải mã.
-threads 8 Số lượng chuỗi tối đa cần sử dụng.
-static-thresh 0 Ngưỡng phát hiện chuyển động.
-max-intra-rate 300 Tốc độ bit i-Frame tối đa (pct)
-deadline realtime Phiên bản thay thế (cũ) của -quality realtime
-lag-in-frames 0 Số khung hình tối đa cần trễ
-qmin 4 -qmax 48 Các giá trị tối thiểu và tối đa cho bộ định lượng. Các giá trị ở đây chỉ là đề xuất và điều chỉnh điều này sẽ giúp tăng/giảm chất lượng video ở mức độ hiệu quả nén.
-row-mt 1 Bật tính năng đa luồng hàng. Cho phép sử dụng tối đa 2 lần chuỗi làm cột ô. 0 = tắt, 1 = bật.
-error-resilient 1 Bật các tính năng phục hồi lỗi.

Chọn thông số mã hóa

Thông tin dưới đây sử dụng phương thức mã hóa tốc độ bit (CBR) không đổi để truyền trực tuyến tốc độ bit thích ứng (ABR), trong đó mỗi tốc độ mục tiêu được đặt rõ ràng trong tệp kê khai của trình đóng gói. Điều này sẽ giúp bạn dọn dẹp hiện tượng chuyển đổi và chia sẻ dữ liệu cho khách hàng. Mã hóa tốc độ bit biến thiên (VBR) và chế độ CQ cũng là các tùy chọn nếu tốc độ bit có thể linh hoạt hơn hoặc mã hóa đang bị cắt bớt. Chế độ Q sẽ gặp khó khăn với chế độ mã hóa theo thời gian thực cần thiết cho video trực tiếp. Hãy xem Chế độ bit để biết thêm thông tin.

Để biết thêm thông tin chi tiết về cách thao túng VP9, bạn cũng nên tham khảo bài viết đi kèm về các tùy chọn cài đặt VOD, nhưng hãy xem xét việc tập trung vào CBR.

Mẹo và thủ thuật

Xin lưu ý rằng khi phát trực tiếp, mọi thứ đều bị hạn chế ở tốc độ mã hóa tối thiểu theo thời gian thực là 1 lần (FFmpeg báo cáo tốc độ mã hóa khi tiến trình). Nếu tốc độ mã hóa của bạn giảm xuống dưới 1x, thì quá trình mã hóa sẽ không cập nhật nội dung đầu vào của video trực tiếp và người dùng sẽ gặp phải hiện tượng tải chậm và bị ngắt luồng. Việc truyền trực tuyến sẽ hiển thị không thể sử dụng luồng trong quá trình phát trực tiếp (mặc dù lưu trữ thường có thể sử dụng được).

Ví dụ về thông số mã hóa trong thực tế

Phần sau đây cho thấy việc sử dụng CPU ở tốc độ 25 khung hình/giây cho nhiều kích thước khung hình trên máy tính để bàn quad-core i5 3.6Ghz chạy Linux:

Độ phân giải mục tiêu Tham số FFmpeg VP9 CPU / Tốc độ (ví dụ)
3840x2160 (2160p) -r 30 -g 90 -s 3840x2160 -chất lượng thời gian thực -tốc độ 5 -thread 16 -row-mt 1 -tile-cột 3 -frame-Parallel 1 -qmin 4 -qmax 48 -b:v 7800k ~88% 0,39x
2560x1440 (1440p) -r 30 -g 90 -s 2560x1440 -chất lượng thời gian thực -tốc độ 5 -chuỗi 16 -row-mt 1 -tile-cột 3 -frame-Parallel 1 -qmin 4 -qmax 48 -b:v 6000k ~86% 0,68x
1920x1080 (1080p) -r 30 -g 90 -s 1920x1080 -chất lượng theo thời gian thực -tốc độ 5 -chuỗi 8 -row-mt 1 -cột-ô 2 -khung- song song 1 -qmin 4 -qmax 48 -b:v 4500k ~82% 1,04x
1280x720 (720p) -r 30 -g 90 -s 1280x720 -chất lượng thời gian thực -tốc độ 5 -chuỗi 8 -hàng-mt 1 -cột-ô 2 -khung song song 1 -qmin 4 -qmax 48 -b:v 3000k ~78% 1,77x
854x480 (480p) -r 30 -g 90 -s 854x480 -chất lượng thời gian thực - 6 -thread 4 -row-mt 1 -tile- cột 1 -frame-Parallel 1 -qmin 4 -qmax 48 -b:v 1800k ~64% 3,51x
640x360 (360p) -r 30 -g 90 -s 640x360 -chất lượng thời gian thực - 7 -thread 4 -row-mt 1 -tile-cột 1 -Frame-Parallel 0 -qmin 4 -qmax 48 -b:v 730k ~ 62% 5,27x
426x240 (240p) -r 30 -g 90 -s 426x240 -chất lượng thời gian thực - 8 -thread 2 -row-mt 1 -tile-cột 0 -Frame-Parallel 0 -qmin 4 -qmax 48 -b:v 365k ~66% 8,27x

Ví dụ về FFmpeg có thể có dạng như sau:

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

Mẹo và thủ thuật

  • Lưu ý rằng ở đây chúng ta đang triển khai một đường ống FIFO (" Pipe1"), cần được tạo trước khi thực thi, trước khi chạy lệnh FFmpeg. Để làm điều này, hãy đặt lệnh mkfifo pipe1 vào thư mục đang hoạt động của bạn. Khi sử dụng Shaka Packager, trình thu thập dữ liệu sẽ nghe kênh đó làm nguồn đầu vào cho luồng đã cho. Các mô hình đóng gói khác có thể yêu cầu một phương pháp khác.

  • Để đảm bảo các lệnh -row-mt được nhận dạng, hãy sử dụng bản phát hành chính thức mới nhất của FFmpeg (hiện tại là 3.3.3) từ https://www.ffmpeg.org/download.html

Ví dụ về tốc độ bit thích ứng

Tùy thuộc vào sức mạnh của máy chạy mã hóa FFmpeg, hệ thống mã hóa đồng thời có thể hoặc không thể phân phối tất cả các mã hóa sau đây, vì vậy, một tập hợp con phù hợp với tài nguyên có sẵn và đối tượng mục tiêu cần được chọn từ danh sách.

Bộ ABR đầy đủ của FFmpeg

Trong trường hợp lý tưởng, chúng tôi kết hợp các ví dụ về mã hóa được nêu trong phần trước để tạo một lệnh duy nhất cho tất cả các lệnh đó cùng một lúc:

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

Tuy nhiên, bộ đầy đủ ở trên sẽ yêu cầu CPU rất mạnh hoặc có thể hỗ trợ từ việc tải GPU phần cứng, chẳng hạn như một số chipset ngày càng cung cấp. Intel Kabylake (và hơn thế nữa) có một quy trình mã hóa phần cứng đầy đủ. (Xin lưu ý rằng GPU Kabylake có thể mã hóa VP9 8 bit, nhưng không thể mã hóa 10 bit).

Một ví dụ thực tế về máy tính bằng Shaka Packager

Một ví dụ thực tế hơn dành cho các máy tính để bàn phổ biến có thể sử dụng Shaka Packager. Một cách đơn giản để thiết lập Shaka là cài đặt tiện ích này trong một vùng chứa Docker, sử dụng hình ảnh DockerHub của Google. Bạn có thể tìm thấy hướng dẫn tại đây:

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

Trong ví dụ này, chúng tôi sử dụng một máy có cấu hình như sau:

Hệ thống Máy chủ: obs Kernel: 4.4.0-91-lowlatency x86_64 (64 bit)
Máy tính Xfce 4.12.3 Distro: OS: https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/
CPU Bộ nhớ đệm lõi tứ Intel Core i5-6500 (-MCP-)
bộ nhớ đệm: 6144 KB
tốc độ xung nhịp: tối đa: 3600 MHz 1: 800 MHz 2: 800 MHz 3: 800 MHz 4: 800 MHz
Thẻ đồ họa Đồ họa tích hợp Intel Skylake
Bộ nhớ RAM 8 GB

Trong thực tế, máy này có thể tạo ra phạm vi mã hóa ABR có thể sử dụng sau đây một cách tối ưu, với tốc độ mã hóa FFmpeg nhất quán báo cáo tốc độ mã hóa 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

Xin lưu ý rằng chế độ cài đặt -speed là khá cao. Các chế độ cài đặt này được thiết lập thử nghiệm và sẽ khác nhau giữa các máy.

Phí vận chuyển Shaka Packager

Đóng gói không phải là một hoạt động chỉ sử dụng nhiều CPU. Bạn có thể thiết lập Shaka Packager để nghe tất cả các kết quả, ngay cả khi chỉ có một phần nhỏ đang được phân phối do FFmpeg. Đây là những chế độ cài đặt đóng gói được thử nghiệm trên máy nêu trên:

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