VP9 hiện đã có trong WebRTC

Hai năm trước, Chrome đã kích hoạt hỗ trợ cho bộ mã hoá và giải mã VP9. Từ Chrome 48 trên máy tính và Android, VP9 sẽ là bộ mã hoá và giải mã video tuỳ chọn cho các cuộc gọi video sử dụng WebRTC.

Mặc dù VP9 sử dụng cùng 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 đã đưa các cải tiến vào VP9 để có được chất lượng cao hơn cho mỗi byte video. Ví dụ: bộ mã hoá ưu tiên các tính năng 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 bất đối xứng để giúp giữ lại những cảnh sắc nét ngay cả với những cảnh khó khăn nhất.

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 hoặc chậm trễ gói sẽ có thể hỗ trợ cuộc gọi video 1080p với cùng băng thông. VP9 cũng có thể giảm mức sử dụng dữ liệu cho người dùng có kết nối kém hoặc gói dữ liệu đắt tiền, trong các trường hợp tốt nhất chỉ yêu cầu 40% tốc độ bit của VP8.

Bạn có thể so sánh các cuộc gọi VP8 với VP9 trong ảnh chụp màn hình bên dưới về các bản ghi mà chúng tôi tạo bằng phần cài đặt bộ mã hoá WebRTC, trong đó cho thấy mức tiết kiệm tốc độ bit 30%:

Ảnh chụp màn hình video minh hoạ các cuộc gọi WebRTC VP8 và VP9 cạnh nhau

Bộ mã hoá và giải mã cho cuộc gọi WebRTC, cùng với các chế độ cài đặt nội dung đa phương tiện khác (chẳng hạn như tốc độ bit) được thương lượng giữa phương thức gọi và người nhận bằng cách trao đổi các thông báo siêu dữ liệu về Giao thức mô tả phiên (SDP) để mô tả các tính năng đa phương tiện của ứng dụng.

Quá trình bắt tay này (trao đổi các chức năng đa phương tiện) này được gọi là đề nghị/trả lời. Ví dụ: người gọi có thể gửi lời đề nghị (tin nhắn SDP) nêu rõ lựa chọn ưu tiên đối với VP9, với VP8 làm phương án dự phòng. Nếu câu trả lời xác nhận rằng bên được gọi có thể xử lý VP9, thì cuộc gọi video có thể tiếp tục sử dụng VP9. Nếu bên được gọi trả lời bằng câu trả lời rằng chỉ có thể sử dụng VP8 thì cuộc gọi sẽ thực hiện với VP8.

Để xem ứng dụng này trong thực tế, hãy xem mã của ứng dụng trò chuyện video WebRTC appr.tc chuẩn.

Trong appcontroller.js, VP9 được đặt làm bộ mã hoá và giải mã ưu tiên, trừ phi bạn chỉ định tham số vsc hoặc vrc 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, sau đó 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 dùng trong trường hợp này sẽ đặ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 là chi tiết và không được thiết kế để con người có thể đọc được, nhưng bạn có thể xem SDP mà appr.tc sử dụng từ bảng điều khiển Công cụ cho nhà phát triển sau khi thực hiện lệnh gọi. Phần quan trọng đối với Codec 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 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 SDP — tiếp theo 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.

Tìm hiểu thêm