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