MediaCapabilities: `decodingInfo()`-Methode
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.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die decodingInfo()
-Methode des MediaCapabilities
-Interfaces gibt ein Promise zurück, das mit Informationen darüber erfüllt wird, wie gut der Benutzeragent Medien mit einer bestimmten Konfiguration dekodieren/anzeigen kann.
Das aufgelöste Objekt enthält die drei booleschen Eigenschaften supported
, smooth
und powerefficient
, die anzeigen, ob das Dekodieren der beschriebenen Medien unterstützt wird und, falls ja, ob das Dekodieren reibungslos und energieeffizient wäre.
Die Methode kann auch verwendet werden, um die Fähigkeiten des Benutzeragenten beim Dekodieren von Medien, die mit einem Schlüsselmanagementsystem kodiert sind, zu testen, jedoch nur, wenn sie im Hauptthread und in einem sicheren Kontext aufgerufen wird. Wenn die Konfiguration im configuration.keySystemConfiguration
-Eigenschaft für das Dekodieren der Daten unterstützt wird, enthält das aufgelöste Promise auch ein MediaKeySystemAccess
-Objekt, das verwendet werden kann, um ein MediaKeys
-Objekt zur Einrichtung der verschlüsselten Wiedergabe zu erstellen.
Hinweis:
Das Aufrufen von decodingInfo()
mit dieser Eigenschaft kann zu für den Benutzer sichtbaren Effekten führen, wie z.B. das Anfragen von Berechtigungen zum Zugriff auf ein oder mehrere Systemressourcen.
Aus diesem Grund sollte diese Funktion nur aufgerufen werden, wenn die Anwendung bereit ist, ein MediaKeys
-Objekt mit der bereitgestellten Konfiguration zu erstellen und zu verwenden.
Syntax
decodingInfo(configuration)
Parameter
configuration
-
Ein Objekt mit einer Eigenschaft
type
, entweder einervideo
- oderaudio
-Eigenschaft, die eine Konfiguration des entsprechenden Typs enthält, und optional einerkeySystemConfiguration
, wenn Medien mit einem Schlüsselmanagementsystem dekodiert werden:type
-
Der Typ des zu testenden Mediums. Dies nimmt einen von drei Werten an:
file
-
Repräsentiert eine Konfiguration, die für die Wiedergabe einer einfachen Datei verwendet werden soll.
media-source
-
Repräsentiert eine Konfiguration, die für die Wiedergabe einer
MediaSource
verwendet werden soll. webrtc
-
Repräsentiert eine Konfiguration, die mit
RTCPeerConnection
empfangen werden soll (nicht erlaubt, wennkeySystemConfiguration
festgelegt ist).
video
-
Konfigurationsobjekt für eine Video-Medienquelle. Dieses hat die folgenden Eigenschaften:
contentType
-
String, der einen gültigen Video-MIME-Typ und (optional) einen
codecs
parameter enthält. width
-
Die Breite des Videos.
height
-
Die Höhe des Videos.
bitrate
-
Die Anzahl der Bits, die verwendet werden, um eine Sekunde der Videodatei zu kodieren.
framerate
-
Die Anzahl der Frames, die eine Sekunde der Videowiedergabe bilden.
audio
-
Konfigurationsobjekt für eine Audio-Medienquelle. Dieses hat die folgenden Eigenschaften:
contentType
-
String, der einen gültigen Audio-MIME-Typ und (optional) einen
codecs
parameter enthält. channels
-
Die Anzahl der Kanäle, die von der Audiospur verwendet werden.
bitrate
-
Die Anzahl der Bits, die verwendet werden, um eine Sekunde der Audiodatei zu kodieren.
samplerate
-
Die Anzahl der Audio-Samples, die eine Sekunde der Audiodatei bilden.
keySystemConfiguration
Optional-
Objekt, das die Key-System-Konfiguration für verschlüsselte Medien spezifiziert.
Hinweis:
Navigator.requestMediaKeySystemAccess()
nimmt Arrays einiger der gleichen Datentypen in seinemsupportedConfigurations
-Parameter.Falls angegeben, muss der
type
media-source
oderfile
sein (nichtwebrtc
). Dieses hat die folgenden Eigenschaften:keySystem
-
Ein String, der das Media-Key-System identifiziert. Zum Beispiel
org.w3.clearkey
odercom.widevine.alpha
. initDataType
Optional-
Ein String, der den Datentypnamen des Format der Initialisierungsdaten angibt, wie zum Beispiel
"cenc"
,"keyids"
und"webm"
. Erlaubte Namen sind im Encrypted Media Extensions Initialization Data Format Registry definiert. distinctiveIdentifier
Optional-
Ein String, der angibt, ob die Implementierung "unterscheidbare Kennungen" (oder unterscheidbare permanente Kennungen) für jegliche Operationen verwenden darf, die mit einem beliebigen Objekt verbunden sind, das aus dieser Konfiguration erstellt wurde. Die erlaubten Werte sind:
required
-
Das zurückgegebene Objekt muss diese Funktion unterstützen.
optional
-
Das zurückgegebene Objekt kann diese Funktion unterstützen. Dies ist die Standardeinstellung.
not-allowed
-
Das zurückgegebene Objekt darf diese Funktion nicht unterstützen oder verwenden.
persistentState
Optional-
Ein String, der angibt, ob das zurückgegebene Objekt in der Lage sein muss, Sitzungsdaten oder einen anderen Typ von Zustand zu speichern. Die erlaubten Werte sind:
required
-
Das zurückgegebene Objekt muss diese Funktion unterstützen.
optional
-
Das zurückgegebene Objekt kann diese Funktion unterstützen. Dies ist die Standardeinstellung.
not-allowed
-
Das zurückgegebene Objekt darf diese Funktion nicht unterstützen oder verwenden. Nur "temporäre" Sitzungen dürfen erstellt werden, wenn dauerhafter Zustand nicht erlaubt ist.
sessionTypes
Optional-
Ein Array von Strings, das die Sitzungstypen angibt, die unterstützt werden müssen. Erlaubte Werte sind:
temporary
-
Eine Sitzung, für die die Lizenz, die Schlüssel und die Aufzeichnung oder die mit der Sitzung verbundenen Daten nicht gespeichert werden. Die Anwendung muss eine solche Speicherung nicht verwalten. Implementierungen müssen diese Option unterstützen, und sie ist die Standardeinstellung.
persistent-license
-
Eine Sitzung, für die die Lizenz (und möglicherweise andere mit der Sitzung verbundene Daten) gespeichert werden. Ein Eintrag der Lizenz und der zugehörigen Schlüssel wird auch dann gespeichert, wenn die Lizenz zerstört wird, was eine Bestätigung liefert, dass die Lizenz und die Schlüssel, die sie enthält, vom Client nicht mehr verwendet werden können.
audio
Optional-
Die Audio-Key-System-Spurkonfiguration, die der obigen
audio
Konfiguration zugeordnet ist. Wenn sie gesetzt ist, muss auch dieaudio
-Konfiguration gesetzt sein.encryptionScheme
-
Das Verschlüsselungsschema, das mit dem Inhaltstyp verbunden ist, wie
cenc
,cbcs
,cbcs-1-9
. Dieser Wert sollte von einer Anwendung gesetzt werden (es ist standardmäßignull
, was anzeigt, dass jedes Verschlüsselungssystem verwendet werden darf). robustness
-
Das Robustheitsniveau, das mit dem Inhaltstyp verbunden ist. Der leere String zeigt an, dass jede Fähigkeit zur Entschlüsselung und Dekodierung des Inhaltstyps akzeptabel ist.
video
Optional-
Die Video-Key-System-Spurkonfiguration, die der oben genannten
video
Konfiguration zugeordnet ist. Wenn sie gesetzt ist, muss auch dievideo
-Konfiguration gesetzt sein.encryptionScheme
-
Das Verschlüsselungsschema, das mit dem Inhaltstyp verbunden ist, wie
cenc
,cbcs
,cbcs-1-9
. Dieser Wert sollte von einer Anwendung gesetzt werden (es ist standardmäßignull
, was anzeigt, dass jedes Verschlüsselungsschema verwendet werden kann). robustness
-
Das Robustheitsniveau, das mit dem Inhaltstyp verbunden ist. Der leere String zeigt an, dass jede Fähigkeit zur Entschlüsselung und Dekodierung des Inhaltstyps akzeptabel ist.
Rückgabewert
Ein Promise
erfüllt mit einem Objekt, das die folgenden Attribute enthält:
supported
-
true
, wenn der Medieninhalt überhaupt dekodiert werden kann. Andernfalls ist esfalse
. smooth
-
true
, wenn die Wiedergabe des Mediums mit der in der Konfiguration angegebenen Bildrate ohne das Auslassen von Bildern erfolgen kann. Andernfalls ist esfalse
. powerEfficient
-
true
, wenn die Wiedergabe des Mediums energieeffizient sein wird. Andernfalls ist esfalse
. keySystemAccess
-
Ein
MediaKeySystemAccess
, das verwendet werden kann, um einMediaKeys
-Objekt zur Einrichtung der verschlüsselten Wiedergabe zu erstellen, odernull
, wenn die Dekodierung mit der angegebenen Konfiguration nicht unterstützt wird.
Browser melden eine unterstützte Medienkonfiguration als smooth
und powerEfficient
, bis Statistiken zu diesem Gerät aufgezeichnet wurden.
Alle unterstützten Audio-Codecs melden powerEfficient
als wahr.
Ausnahmen
TypeError
-
Wird ausgelöst, wenn die an die
decodingInfo()
-Methode übergebeneconfiguration
ungültig ist, entweder weil der Typ nicht Video oder Audio ist, dercontentType
kein gültiger Codec-MIME-Typ ist, die Medien-Dekodierungskonfiguration kein gültiger Wert für dentype
(file, media-source oder webrtc) ist, oder ein anderer Fehler in der an die Methode übergebenen Medienkonfiguration vorliegt, einschließlich des Auslassens von Werten. InvalidStateError
DOMException
-
Die Methode wird in einem Worker aufgerufen, wenn
configuration.keySystemConfiguration
definiert ist. SecurityError
DOMException
-
Die Methode wird außerhalb eines sicheren Kontexts aufgerufen und
configuration.keySystemConfiguration
ist definiert.
Verwendungsnotizen
Vergleich mit Navigator.requestMediaKeySystemAccess()
decodingInfo()
und die Navigator.requestMediaKeySystemAccess()
-Methode der Encrypted Media Extensions API spiegeln grundsätzlich unterschiedliche Ansätze zur Auswahl einer Konfiguration für die Dekodierung verschlüsselter Medien wider.
Der Konfigurationsparameter für Navigator.requestMediaKeySystemAccess()
nimmt ein Array möglicher Konfigurationen und erlaubt es dem System, eine als geeignet betrachtete auszuwählen.
Im Gegensatz dazu nimmt decodingInfo()
jeweils eine Konfiguration an.
Erwartet wird, dass der Aufrufer decodingInfo()
mehrmals ausführt, beginnend mit den am meisten bevorzugten Konfigurationen und stoppt, sobald er eine Konfiguration findet, die die Anforderungen der Anwendung erfüllt, glatt und energieeffizient zu sein oder beides.
Mit anderen Worten, die Auswahlentscheidung wird an den Aufrufer übergeben.
Beispiele
Abrufen von Dekodierungsinformationen für unverschlüsselte Mediendateien
Dieses Beispiel zeigt, wie eine Medienkonfiguration für eine Audiodatei erstellt und dann in MediaCapabilities.decodingInfo()
verwendet wird.
// 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");
}
});
Ähnlich zeigt der unten stehende Code die Konfiguration für eine Videodatei.
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");
}
});
Abrufen von Dekodierungsinformationen für verschlüsselte Medien
Dieses Beispiel zeigt, wie Sie decodingInfo()
verwenden könnten, um eine Medienkonfiguration für verschlüsselte Inhalte auszuwählen.
Wie im vorherigen Beispiel definieren wir eine Medienkonfiguration, aber diesmal verwenden wir den type
von media-source
(anstelle von file
) und spezifizieren sowohl Audio- als auch Videoinhalte.
Wir spezifizieren auch eine einfache keySystemConfiguration
.
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",
},
};
Im vorherigen Beispiel haben wir Promise-Verkettung verwendet, um auf das Ergebnis zu warten.
Hier haben wir uns entschlossen, async
und await
zu verwenden, um auf das Ergebnis zu warten und es dann zu protokollieren.
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"}.`,
);
}
Die Protokollausgabe wird unten gezeigt.
Iteration durch Dekodierungsinformationen für verschlüsselte Medien
Das vorherige Beispiel zeigte, wie Sie decodingInfo()
verwenden können, um Informationen für nur eine Konfiguration zu erhalten.
In der Praxis würde die Methode normalerweise iterativ mit einer Reihe von Konfigurationen aufgerufen, wobei die erste unterstützte Konfiguration ausgewählt wird, die die Kriterien der Anwendung für eine flüssige Wiedergabe oder Energieeffizienz erfüllt.
Wie dies funktioniert, wird unten beschrieben.
Angenommen, wir haben bereits ein Array
von Medienkonfigurationen namens orderedMediaConfigs
, das wir von am meisten bis am wenigsten gewünscht geordnet haben, können wir die Array.prototype.map()
verwenden, um decodingInfo()
für jede Konfiguration aufzurufen und ein Array zu erhalten, das alle zurückgegebenen Promise
-Objekte enthält.
const capabilitiesPromises = orderedMediaConfigs.map((mediaConfig) =>
navigator.mediaCapabilities.decodingInfo(mediaConfig),
);
Dann verwenden wir eine for await...of
-Schleife, um die Promises zu iterieren, während sie aufgelöst werden.
In der Schleife speichern wir die letzte unterstützte Konfiguration in nonSmoothConfig
, und wir verlassen die Schleife, sobald wir eine glatte Konfiguration finden, die wir als bestConfig
festlegen.
// 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;
}
Wenn wir beim Schleifen eine glatte und unterstützte Konfiguration gefunden haben (bestConfig
), verwenden wir sie, um unsere Medienkeys zu erstellen und die Medien zu dekodieren.
Wenn wir keine glatten Konfigurationen entdeckt haben, könnten wir stattdessen nonSmoothConfig
verwenden, um die Medien zu dekodieren.
Dies wird die zuletzt gefundene unterstützte Konfiguration sein, die wegen der Art und Weise, wie wir die ursprünglichen orderedMediaConfigs
geordnet haben, diejenige mit der niedrigsten Framerate sein sollte.
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!
}
Wenn es keine unterstützte Konfiguration gibt, haben wir keine andere Wahl, als zu scheitern und den Benutzer zu benachrichtigen.
Spezifikationen
Specification |
---|
Media Capabilities # ref-for-dom-mediacapabilities-decodinginfo |