Hai năm trước, Chrome đã bật tính năng hỗ trợ bộ mã hoá và giải mã VP9. Kể từ Chrome 48 trên máy tính và Android, VP9 sẽ là bộ mã hoá và giải mã video không bắt buộc cho các cuộc gọi video sử dụng WebRTC.
Mặc dù VP9 sử dụng cùng một bản thiết kế cơ bản như các bộ mã hoá và giải mã trước đó, nhưng nhóm WebM đã tích hợp các điểm cải tiến vào VP9 để tăng chất lượng cho từng byte video. Ví dụ: bộ mã hoá ưu tiên các đặc điểm hình ảnh sắc nét nhất và bộ mã hoá và giải mã hiện sử dụng các phép biến đổi không đối xứng để giúp ngay cả những cảnh khó khăn nhất cũng trông sắc nét và không bị chặn.
Với VP9, các kết nối Internet hiện có thể phân phát 720p mà không bị mất gói hoặc bị trễ sẽ có thể hỗ trợ cuộc gọi video 1080p ở cùng băng thông. VP9 cũng có thể giảm mức sử dụng dữ liệu cho những người dùng có kết nối kém hoặc gói dữ liệu đắt đỏ, trong trường hợp tốt nhất chỉ yêu cầu 40% tốc độ bit của VP8.
Bạn có thể xem các lệnh gọi VP8 so với VP9 trong ảnh chụp màn hình bên dưới về bản ghi chúng tôi đã tạo bằng chế độ cài đặt bộ mã hoá WebRTC, cho thấy mức tiết kiệm tốc độ bit là 30%:
Bộ mã hoá và giải mã cho lệnh gọi WebRTC, cùng với các chế độ cài đặt nội dung nghe nhìn khác như tốc độ bit, được thương lượng giữa phương thức gọi và phương thức được gọi bằng cách trao đổi thông điệp siêu dữ liệu Giao thức mô tả phiên (SDP) mô tả các chức năng nội dung nghe nhìn của ứng dụng.
Quá trình bắt tay này (trao đổi chức năng đa phương tiện) được gọi là đề nghị/trả lời. Ví dụ: phương thức gọi có thể gửi một ưu đãi (thông báo SDP) cho biết lựa chọn ưu tiên là VP9, với VP8 làm phương thức dự phòng. Nếu câu trả lời xác nhận rằng phương thức được gọi có thể xử lý VP9, thì cuộc gọi video có thể tiếp tục bằng VP9. Nếu phương thức được gọi phản hồi bằng câu trả lời rằng phương thức đó chỉ có thể sử dụng VP8, thì lệnh gọi sẽ tiếp tục bằng VP8.
Để xem cách thực hiện, hãy xem mã cho ứng dụng trò chuyện video WebRTC chuẩn appr.tc.
Trong appcontroller.js, VP9 được đặt làm bộ mã hoá và giải mã ưu tiên trừ phi tham số vsc hoặc vrc được chỉ định trong URL:
AppController.prototype.loadUrlParams_ = function() {
// ...
var DEFAULT_VIDEO_CODEC = 'VP9';
// …
this.loadingParams_.videoSendCodec = urlParams['vsc'];
// ...
this.loadingParams_.videoRecvCodec = urlParams['vrc'] || DEFAULT_VIDEO_CODEC;
}
Trong sdputils.js, giá trị bộ mã hoá và giải mã tuỳ chỉnh (nếu được chỉ định) sẽ được dùng cho siêu dữ liệu SDP:
function maybePreferVideoSendCodec(sdp, params) {
return maybePreferCodec(sdp, 'video', 'send', params.videoSendCodec);
}
function maybePreferVideoReceiveCodec(sdp, params) {
return maybePreferCodec(sdp, 'video', 'receive', params.videoRecvCodec);
}
Hàm maybePreferCodec() được sử dụng ở đây đặt giá trị cho bộ mã hoá và giải mã được yêu cầu trong văn bản của siêu dữ liệu SDP. SDP có nhiều thông tin và không được thiết kế để con người đọc được, nhưng bạn có thể xem SDP mà appr.tc sử dụng từ bảng điều khiển DevTools sau khi thực hiện một lệnh gọi. Phần quan trọng liên quan đến bộ mã hoá và giải mã là dòng m:
{
"sdp": "v=0\r\no=- 9188830394109743399 2 IN IP4 127.0.0.1\r\ns … m=video ...",
"type": "offer"
}
Khi sử dụng appr.tc với chế độ cài đặt mặc định trong một phiên bản Chrome gần đây, bạn sẽ thấy VP9 là bộ mã hoá và giải mã đầu tiên được liệt kê trong dòng m của SDP, theo sau là VP8 mà Chrome cũng có thể sử dụng. Nếu bạn đặt VP8 làm bộ mã hoá và giải mã ưu tiên (ví dụ: thông qua các tham số URL trong appr.tc), thì VP8 sẽ được liệt kê trước tiên.
Tìm hiểu thêm
- Dự án WebM: Tài nguyên VP9
- webrtc.org: trang chủ của dự án WebRTC
- g.co/webrtc: đường liên kết đến các tài nguyên WebRTC khác
- webrtc.github.io/samples: Mẫu WebRTC trực tiếp
- test.webrtc.org: công cụ kiểm thử mạng và thiết bị nguồn mở cũng như khung báo cáo lỗi