Mã hoá trực tiếp bằng VP9 thông qua FFmpeg
Thông số mã hoá
VP9 cung cấp một loạt các thông số để tối ưu hoá quá trình mã hoá trực tiếp. Một số nguyên tắc chung của các chế độ này được thảo luận trong phần Chế độ tốc độ bit.
Ví dụ về mã hoá VP9 bằng FFmpeg
Bảng dưới đây mô tả các tham số của một lệnh gọi ffmpeg
mẫu để mã hoá VP9.
Thông số | Mô tả |
---|---|
-quality realtime |
realtime là điều kiện bắt buộc để phát trực tiếp và để có tốc độ trên 5 . |
-speed 6 |
Bạn nên sử dụng tốc độ 5 đến 8 để mã hoá trực tiếp / theo thời gian thực. Số càng thấp (5 hoặc 6 ) thì chất lượng càng cao nhưng cần nhiều sức mạnh CPU hơn. Số càng cao (7 hoặc 8 ) thì chất lượng càng thấp nhưng dễ quản lý hơn đối với các trường hợp sử dụng có độ trễ thấp và cả đối với các thiết bị có công suất CPU thấp như thiết bị di động. |
-tile-columns 4 |
Phân chia thành ô sẽ chia video thành các vùng hình chữ nhật, cho phép xử lý đa luồng để mã hoá và giải mã. Số lượng ô luôn là luỹ thừa của 2. 0 = 1 ô, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32. |
-frame-parallel 1 |
Bật các tính năng giải mã song song. |
-threads 8 |
Số lượng luồng 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 tối đa của khung hình I (pct) |
-deadline realtime |
Phiên bản thay thế (cũ) của -quality realtime |
-lag-in-frames 0 |
Số lượng khung tối đa cần trễ |
-qmin 4 -qmax 48 |
Giá trị tối thiểu và tối đa cho bộ lượng tử hoá. Các giá trị ở đây chỉ là đề xuất và việc điều chỉnh giá trị này sẽ giúp tăng/giảm chất lượng video nhưng làm giảm hiệu quả nén. |
-row-mt 1 |
Bật tính năng đa luồng theo hàng. Cho phép sử dụng tối đa 2 luồng làm cột ô. 0 = tắt, 1 = bật. |
-error-resilient 1 |
Bật các tính năng chống lỗi. |
Chọn thông số mã hoá
Thông tin dưới đây sử dụng phương thức mã hoá tốc độ bit không đổi (CBR) cho tính năng phát trực tiếp có tốc độ bit thích ứng (ABR), trong đó mỗi tốc độ mục tiêu được thiết lập rõ ràng trong tệp kê khai của trình đóng gói. Điều này sẽ giúp khách hàng "chuyển đổi" giữa các mức giá một cách rõ ràng hơn. Mã hoá tốc độ bit biến đổi (VBR) và chế độ CQ cũng là những lựa chọn nếu tốc độ bit có thể linh hoạt hơn hoặc quá trình mã hoá đang được chia thành các đoạn. Chế độ Q sẽ gặp khó khăn với quá trình mã hoá theo thời gian thực cần thiết cho video phát trực tiếp. Hãy xem phần Chế độ tốc độ bit để biết thêm thông tin.
Để biết thêm thông tin chi tiết về cách xử lý VP9, bạn cũng nên tham khảo bài viết đi kèm về chế độ cài đặt VOD, nhưng hãy cân nhắc việc tập trung vào CBR.
Mẹo và thủ thuật
Hãy nhớ rằng khi phát trực tiếp, mọi thứ đều bị giới hạn ở tốc độ mã hoá tối thiểu theo thời gian thực là 1x (FFmpeg báo cáo tốc độ mã hoá khi tiến hành). Nếu tốc độ mã hoá giảm xuống dưới 1x, thì quá trình mã hoá sẽ không theo kịp đầu vào của video trực tiếp, người dùng sẽ gặp phải tình trạng giật và các đoạn ngắt trong quá trình truyền sẽ khiến luồng phát không sử dụng được trong sự kiện phát sóng trực tiếp (mặc dù bản lưu trữ thường sẽ sử dụng được).
Ví dụ về cách hoạt động của thông số mã hoá
Sau đây là mứ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 có bộ xử lý i5 3,6 GHz 4 nhân chạy Linux:
Độ phân giải mục tiêu | Tham số VP9 của FFmpeg | CPU / Tốc độ (ví dụ) |
---|---|---|
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,39x |
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,04x |
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,51x |
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,27x |
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,27x |
Ví dụ về FFmpeg có thể trô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 libvpx-vp9 \
-b:a 128k -c:a libopus -f webm pipe1
Mẹo và thủ thuật
Xin lưu ý rằng ở đây, chúng ta đang xuất ra một ống FIFO ("pipe1"). Ống này phải được tạo trước khi thực thi, trước khi chạy lệnh FFmpeg. Để thực hiện việc này, hãy đưa ra lệnh
mkfifo pipe1
trong thư mục đang hoạt động. Khi sử dụng Shaka Packager, công cụ này sẽ lắng nghe đường ống đó 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 thức 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 ổn định mới nhất của FFmpeg (hiện là 3.3.3) trên https://www.ffmpeg.org/download.html
Ví dụ về bộ tốc độ bit thích ứng
Tuỳ thuộc vào hiệu suất của máy chạy mã hoá FFmpeg, bạn có thể cung cấp hoặc không thể cung cấp tất cả các mã hoá sau cùng một lúc. Vì vậy, bạn nên chọn một nhóm nhỏ phù hợp với tài nguyên hiện có và đối tượng mục tiêu của riêng mình trong danh sách.
Bộ ABR đầy đủ của FFmpeg
Trong trường hợp lý tưởng, chúng ta kết hợp các ví dụ về mã hoá được nêu trong phần trước để tạo một lệnh duy nhất tạo ra tất cả các ví dụ đó 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 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
Tuy nhiên, toàn bộ tập hợp trên sẽ yêu cầu một CPU rất mạnh hoặc có thể hỗ trợ tính năng giảm 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à các phiên bản sau) có một quy trình mã hoá phần cứng hoàn chỉnh. (Xin lưu ý rằng GPU Kabylake có thể mã hoá VP9 8 bit nhưng không thể mã hoá VP9 10 bit).
Ví dụ thực tế về máy tính sử dụng Shaka Packager
Một ví dụ thực tế hơn cho các máy tính thông thường có thể sử dụng Shaka Packager. Một cách đơn giản để thiết lập Shaka là cài đặt trong một vùng chứa Docker, bằng cách sử dụng hình ảnh DockerHub của Google. Bạn có thể xem hướng dẫn tại đây:
https://github.com/google/shaka-packager#using-docker-for-testing--development
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: Hệ điều hành: https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/ |
CPU | Bộ xử lý 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ẻ đồ hoạ | Đồ hoạ tích hợp Intel Skylake |
Bộ nhớ | RAM 8 GB |
Trên thực tế, máy này có thể tạo ra dải mã hoá ABR có thể sử dụng sau đây một cách tối ưu, với FFmpeg liên tục báo cáo tốc độ mã hoá là 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 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
Xin lưu ý rằng chế độ cài đặt -speed
khá cao. Các chế độ cài đặt này được thiết lập theo cách thử nghiệm và sẽ khác nhau tuỳ theo từng máy.
Chi phí chung của Shaka Packager
Đóng gói không phải là hoạt động đặc biệt tốn nhiều CPU. Bạn có thể đặt Shaka Packager để theo dõi tất cả các đầu ra, ngay cả khi FFmpeg chỉ phân phối một số đầu ra. Sau đây là các chế độ cài đặt của trình đóng gói đã được kiểm thử trên máy được 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