MediaCapabilities: phương thức decodingInfo()
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.
* Some parts of this feature may have varying levels of support.
Note: This feature is available in Web Workers.
Phương thức decodingInfo() của giao diện MediaCapabilities trả về một promise được thực hiện với thông tin về mức độ tốt mà user agent có thể giải mã/hiển thị phương tiện với một cấu hình nhất định.
Đối tượng được giải quyết chứa ba thuộc tính boolean supported, smooth, và powerefficient, cho biết liệu việc giải mã phương tiện được mô tả có được hỗ trợ hay không, và nếu có, liệu việc giải mã có mượt mà và tiết kiệm điện hay không.
Phương thức cũng có thể được sử dụng để kiểm tra khả năng của user agent để giải mã phương tiện được mã hóa bằng hệ thống khóa, nhưng chỉ khi được gọi trong luồng chính và trong ngữ cảnh bảo mật. Nếu cấu hình được truyền trong thuộc tính configuration.keySystemConfiguration được hỗ trợ để giải mã dữ liệu, promise được giải quyết cũng bao gồm đối tượng MediaKeySystemAccess có thể được sử dụng để tạo đối tượng MediaKeys để thiết lập phát lại được mã hóa.
Note:
Gọi decodingInfo() với thuộc tính này có thể dẫn đến các hiệu ứng hiển thị cho người dùng, chẳng hạn như yêu cầu quyền truy cập vào một hoặc nhiều tài nguyên hệ thống. Do đó, hàm này chỉ nên được gọi khi ứng dụng sẵn sàng tạo và sử dụng đối tượng MediaKeys với cấu hình được cung cấp.
Cú pháp
decodingInfo(configuration)
Tham số
configuration-
Một đối tượng với thuộc tính
type, hoặc thuộc tínhvideohoặcaudiochứa cấu hình của loại phù hợp, và tùy chọnkeySystemConfigurationkhi giải mã phương tiện được mã hóa bằng hệ thống khóa:type-
Loại phương tiện đang được kiểm tra. Nhận một trong ba giá trị:
file-
Đại diện cho cấu hình được dùng cho phát lại tệp thuần.
media-source-
Đại diện cho cấu hình được dùng cho phát lại
MediaSource. webrtc-
Đại diện cho cấu hình được dùng để nhận qua
RTCPeerConnection(không cho phép khikeySystemConfigurationđược đặt).
video-
Đối tượng cấu hình cho nguồn phương tiện video. Có các thuộc tính sau:
audio-
Đối tượng cấu hình cho nguồn phương tiện âm thanh. Có các thuộc tính sau:
contentType-
Chuỗi chứa loại MIME âm thanh hợp lệ, và (tùy chọn) tham số
codecs. channels-
Số kênh được sử dụng bởi track âm thanh.
bitrate-
Số bit được sử dụng để mã hóa một giây của tệp âm thanh.
samplerate-
Số mẫu âm thanh tạo nên một giây của tệp âm thanh.
keySystemConfigurationOptional-
Đối tượng chỉ định cấu hình hệ thống khóa cho phương tiện được mã hóa.
Note:
Navigator.requestMediaKeySystemAccess()nhận mảng một số loại dữ liệu tương tự trong đối sốsupportedConfigurationscủa nó.Nếu được chỉ định,
typephải làmedia-sourcehoặcfile(không phảiwebrtc). Có các thuộc tính sau:keySystem-
Chuỗi xác định hệ thống khóa phương tiện. Ví dụ
org.w3.clearkeyhoặccom.widevine.alpha. initDataTypeOptional-
Chuỗi chỉ định tên loại dữ liệu của định dạng dữ liệu khởi tạo, chẳng hạn như
"cenc","keyids"và"webm". distinctiveIdentifierOptional-
Chuỗi chỉ định liệu việc triển khai có thể sử dụng "định danh đặc biệt" cho bất kỳ hoạt động nào liên quan đến bất kỳ đối tượng nào được tạo từ cấu hình này. Các giá trị được phép:
required: Đối tượng trả về phải hỗ trợ tính năng này.optional: Đối tượng trả về có thể hỗ trợ tính năng này. Đây là giá trị mặc định.not-allowed: Đối tượng trả về không được hỗ trợ hoặc sử dụng tính năng này.
persistentStateOptional-
Chuỗi chỉ định liệu đối tượng trả về có thể duy trì dữ liệu phiên hoặc bất kỳ loại trạng thái nào khác. Các giá trị được phép:
required: Đối tượng trả về phải hỗ trợ tính năng này.optional: Đối tượng trả về có thể hỗ trợ tính năng này. Đây là giá trị mặc định.not-allowed: Đối tượng trả về không được hỗ trợ hoặc sử dụng tính năng này. Chỉ có thể tạo các phiên "temporary" khi trạng thái liên tục không được phép.
sessionTypesOptional-
Mảng các chuỗi chỉ định các loại phiên phải được hỗ trợ. Các giá trị được phép:
temporary: Phiên mà giấy phép, khóa và bản ghi liên quan đến phiên không được duy trì.persistent-license: Phiên mà giấy phép (và có thể dữ liệu liên quan) sẽ được duy trì.
audioOptional-
Cấu hình track hệ thống khóa âm thanh liên quan đến
audioconfiguration ở trên.encryptionScheme: Sơ đồ mã hóa liên quan đến loại nội dung, chẳng hạncenc,cbcs,cbcs-1-9.robustness: Mức độ mạnh mẽ liên quan đến loại nội dung.
videoOptional-
Cấu hình track hệ thống khóa video liên quan đến
videoconfiguration ở trên.encryptionScheme: Sơ đồ mã hóa liên quan đến loại nội dung, chẳng hạncenc,cbcs,cbcs-1-9.robustness: Mức độ mạnh mẽ liên quan đến loại nội dung.
Giá trị trả về
Một Promise được thực hiện với một đối tượng chứa các thuộc tính sau:
supported-
truenếu nội dung phương tiện có thể được giải mã. Nếu không, làfalse. smooth-
truenếu việc phát lại phương tiện có thể được phát ở tốc độ khung hình được chỉ định mà không cần bỏ khung hình. Nếu không làfalse. powerEfficient-
truenếu việc phát lại phương tiện sẽ tiết kiệm điện. Nếu không, làfalse. keySystemAccess-
Một
MediaKeySystemAccesscó thể được sử dụng để tạo đối tượngMediaKeysđể thiết lập phát lại được mã hóa, hoặcnullnếu việc giải mã không được hỗ trợ với cấu hình được cung cấp.
Ngoại lệ
TypeError-
Được ném nếu
configurationtruyền vào phương thứcdecodingInfo()không hợp lệ. InvalidStateErrorDOMException-
Phương thức được gọi trong worker khi
configuration.keySystemConfigurationđược định nghĩa. SecurityErrorDOMException-
Phương thức được gọi ngoài ngữ cảnh bảo mật và
configuration.keySystemConfigurationđược định nghĩa.
Ghi chú sử dụng
>So sánh với Navigator.requestMediaKeySystemAccess()
decodingInfo() và phương thức Navigator.requestMediaKeySystemAccess() của Encrypted Media Extensions API phản ánh các cách tiếp cận khác nhau về cơ bản để chọn cấu hình giải mã phương tiện được mã hóa.
Tham số cấu hình cho Navigator.requestMediaKeySystemAccess() nhận một mảng các cấu hình có thể và cho phép hệ thống chọn cái nó cho là phù hợp.
Ngược lại, decodingInfo() nhận một cấu hình mỗi lần. Kỳ vọng là người gọi sẽ thực thi decodingInfo() nhiều lần, bắt đầu với các cấu hình ưa thích nhất và dừng ngay khi tìm thấy cấu hình đáp ứng yêu cầu ứng dụng về mượt mà, tiết kiệm điện hoặc cả hai. Nói cách khác, quyết định chọn lựa được giao cho người gọi.
Ví dụ
>Lấy thông tin giải mã cho tệp phương tiện không được mã hóa
Ví dụ này cho thấy cách tạo cấu hình phương tiện cho tệp âm thanh và sử dụng nó trong MediaCapabilities.decodingInfo().
// Create media configuration to be tested
const audioConfig = {
type: "file", // or 'media-source' or 'webrtc'
audio: {
contentType: "audio/ogg; codecs=vorbis", // valid content type
channels: 2, // audio channels used by the track
bitrate: 132700, // number of bits used to encode 1s of audio
samplerate: 5200, // number of audio samples making up that 1s.
},
};
// check support and performance
navigator.mediaCapabilities.decodingInfo(audioConfig).then((result) => {
if (result.supported) {
log(
`The audio configuration is supported${result.smooth ? ", smooth" : ", not smooth"}${result.powerEfficient ? ", power efficient" : ", not power efficient"}.`,
);
} else {
log("The audio configuration is not supported");
}
});
Tương tự, đoạn mã dưới đây cho thấy cấu hình cho tệp video.
const videoConfig = {
type: "file",
video: {
contentType: "video/webm;codecs=vp8", // valid content type
width: 800, // width of the video
height: 600, // height of the video
bitrate: 10000, // number of bits used to encode 1s of video
framerate: 30, // number of frames making up that 1s.
},
};
// check support and performance
navigator.mediaCapabilities.decodingInfo(videoConfig).then((result) => {
if (result.supported) {
log(
`The video configuration is supported${result.smooth ? ", smooth" : ", not smooth"}${result.powerEfficient ? ", power efficient" : ", not power efficient"}.`,
);
} else {
log("The video configuration is not supported");
}
});
Lấy thông tin giải mã cho phương tiện được mã hóa
Ví dụ này cho thấy cách bạn có thể sử dụng decodingInfo() để chọn cấu hình phương tiện cho nội dung được mã hóa.
const encryptedMediaConfig = {
type: "media-source", // or 'file'
audio: {
contentType: "audio/webm; codecs=opus",
channels: 2, // audio channels used by the track
bitrate: 132700, // number of bits used to encode 1s of audio
samplerate: 48000, // number of audio samples making up that 1s.
},
video: {
contentType: 'video/webm; codecs="vp09.00.10.08"',
width: 800, // width of the video
height: 600, // height of the video
bitrate: 10000, // number of bits used to encode 1s of video
framerate: 30, // number of frames making up that 1s.
},
keySystemConfiguration: {
keySystem: "org.w3.clearkey",
initDataType: "webm",
distinctiveIdentifier: "required",
},
};
getDecodingInfo(encryptedMediaConfig);
async function getDecodingInfo(mediaConfig) {
const result = await navigator.mediaCapabilities.decodingInfo(mediaConfig);
console.log(result);
if (!result.supported) {
log("This encrypted media configuration is not supported.");
return;
}
// keySystemAccess is returned if decoding encrypted media is supported
// This can be used to decrypt and playback the media
if (!result.keySystemAccess) {
log("Encrypted media support is not available.");
return;
}
log(
`The encrypted media configuration is supported${result.smooth ? ", smooth" : ", not smooth"}${result.powerEfficient ? ", power efficient" : ", not power efficient"}.`,
);
}
Lặp qua thông tin giải mã cho phương tiện được mã hóa
Ví dụ trước cho thấy cách bạn có thể sử dụng decodingInfo() để lấy thông tin cho một cấu hình. Trong thực tế, phương thức thường được gọi lặp đi lặp lại với nhiều cấu hình, chọn cấu hình được hỗ trợ đầu tiên đáp ứng tiêu chí của ứng dụng cho việc phát mượt mà hoặc tiết kiệm điện.
const capabilitiesPromises = orderedMediaConfigs.map((mediaConfig) =>
navigator.mediaCapabilities.decodingInfo(mediaConfig),
);
// Assume this app wants a supported && smooth config.
let bestConfig = null;
let nonSmoothConfig = null;
for await (const mediaCapabilityInfo of capabilitiesPromises) {
if (!mediaCapabilityInfo.supported) continue;
if (!mediaCapabilityInfo.smooth) {
nonSmoothConfig = mediaCapabilityInfo;
continue;
}
bestConfig = mediaCapabilityInfo;
break;
}
let keys = null;
if (bestConfig) {
keys = await bestConfig.keySystemAccess.createMediaKeys();
// … use keys to decode media using best config
} else if (nonSmoothConfig) {
console.log(
"No smooth configs found. Using lowest resolution configuration!",
);
keys = await nonSmoothConfig.keySystemAccess.createMediaKeys();
// … use keys to decode media using lowest framerate config
} else {
console.log("No supported configs!");
// Fail!
}
Thông số kỹ thuật
| Specification |
|---|
| Media Capabilities> # dom-mediacapabilities-decodinginfo> |