Einleitung
High-bandwidth Digital Content Protection (HDCP) ist eine Form des digitalen Kopierschutzes, die dazu dient, hochauflösende Video- und Audiosignale vor dem Kopieren auf nicht autorisierte Geräte zu schützen. Das sendende Gerät prüft zunächst, ob der Empfänger berechtigt ist, Daten zu empfangen. Wenn ja, dann sendet der Sender verschlüsselte Daten, um ein Abhören zu verhindern.
Die Empfangseinrichtung muss HDCP-konform sein, einschließlich der Geräte, Kabel, Adapter und Softwaretreiber. Wenn der Receiver nicht HDCP-kompatibel ist, wird das Video nur in Standardauflösung (SD) wiedergegeben. Im Allgemeinen sollten neuere HDTV-Geräte und HDMI- oder DVI-Kabel HDCP-kompatibel sein.
Einzelheiten finden Sie im Dokument Fallback HDCP .
Voraussetzungen
Die folgenden Anforderungen sind erforderlich, um diese Funktion zu unterstützen:
Brightcove SDK-Version
- Natives SDK für Android 6.17.1 und neuere Versionen
- Natives SDK für iOS 6.10.1 und neuere Versionen
Android-Implementierung
Wenn Sie ein Video mit einer Mischung aus SD- und HD-Wiedergaben abspielen, sollten Sie Folgendes tun:
-
Bei Geräten, die sowohl die HD- als auch die SD-Wiedergabe unterstützen, sollten Sie sicherstellen, dass der Player bei Bedarf auf die entsprechende Wiedergabeart umschalten kann, z. B. wenn sich die Netzwerkbandbreite ändert. Dieser Wechsel der Wiedergabeart kann dazu führen, dass der Player eine SD-Wiedergabe auswählt, während er vorher HD wiedergegeben hat.
-
Bei Geräten ohne HDCP-Unterstützung, z. B. älteren Android-Mobilgeräten mit älteren Betriebssystemen, müssen Sie dafür sorgen, dass innerhalb von SD-Wiedergaben ein angemessener Wechsel der Wiedergabeversion erfolgt und dass der Player nicht versucht, eine HDCP-geschützte Wiedergabeversion zu laden, da in diesem Fall die Lizenzanforderung mit einer Fehlermeldung wie dieser fehlschlägt:
Fehlermeldung</>
2021-11-01 19:01:36.943 30131-30131/com.brightcove.player.samples.exoplayer.basic E/VideoDisplayComponent: onPlayerError com.google.android.exoplayer2.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(bf310894-59b5-4f1b-9a37-e110a3d6121d, null, null, video/avc, avc1.4D401F, 1712000, null, [1280, 720, 30.0], [-1, -1]), format_supported=YES at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:555) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:148) at android.os.HandlerThread.run(HandlerThread.java:61) Caused by: android.media.MediaCodec$CryptoException: Unknown Error at android.media.MediaCodec.native_queueSecureInputBuffer(Native Method) at android.media.MediaCodec.queueSecureInputBuffer(MediaCodec.java:2292) at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter.queueSecureInputBuffer(SynchronousMediaCodecAdapter.java:143) at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:1380) at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:845) at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:945) at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:478) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:148) at android.os.HandlerThread.run(HandlerThread.java:61)
Eine Lösung für dieses Problem besteht darin, Code hinzuzufügen, um das Umschalten der Wiedergabeformate AdaptationSets
in DASH zu ermöglichen und Wiedergabeversionen herauszufiltern, von denen nicht erwartet wird, dass sie auf dem aktuellen Gerät abgespielt werden.
Im folgenden Beispiel werden HD-Wiedergaben durch strengere HDCP-Anforderungen geschützt, die das aktuelle Gerät nicht unterstützt. Um dies zu erreichen, können Sie ein EventListener
SET_SOURCE
On-the Event verwenden, da Sie diese Unterstützungen hinzufügen müssen, bevor Sie die ExoPlayer
Instanz erstellen.
Ein Beispiel wie dieses würde der Activity
Klasse Ihres Spielers in der folgenden onCreate
Methode hinzugefügt werden:
eventEmitter.on(EventType.SET_SOURCE, event -> {
try {
// Get an instance of the MediaDrm from the device
MediaDrm mediaDrm = new MediaDrm(Constants.WIDEVINE_UUID);
// Create a new DefaultTrackSelector.ParamsBuilder object
DefaultTrackSelector.ParametersBuilder builder = new DefaultTrackSelector.ParametersBuilder(this);
// Call this method to enable rendition switching across DASH AdaptationSets
builder.setAllowMultipleAdaptiveSelections(true);
// Get the values for hdcpLevel and maxHdcpLevel
String connectedHdcpLevel = mediaDrm.getPropertyString("hdcpLevel");
String maxHdcpLevel = mediaDrm.getPropertyString("maxHdcpLevel");
Log.v(TAG, "HDCP Level: " + connectedHdcpLevel + " Max HDCP Level: " + maxHdcpLevel);
// If either level is null or an empty String or reads "Unprotected"
if ((TextUtils.isEmpty(connectedHdcpLevel) || TextUtils.isEmpty(maxHdcpLevel)) ||
("Unprotected".equals(connectedHdcpLevel) || "Unprotected".equals(maxHdcpLevel))) {
Log.v(TAG, "Restricting rendition selection to SD");
// Set the max video size to SD
builder.setMaxVideoSizeSd();
}
// Create a new DefaultTrackSelector object, and set the Parameters object created above
DefaultTrackSelector defaultTrackSelector = new DefaultTrackSelector(this);
defaultTrackSelector.setParameters(builder.build());
// Set this DefaultTrackSelector object on the ExoPlayerVideoDisplayComponent
videoDisplayComponent.setTrackSelector(defaultTrackSelector);
}
catch (Exception exception) {
if (exception instanceof UnsupportedSchemeException) {
Log.e(TAG, "UnsupportedSchemeException: " + exception.getLocalizedMessage());
}
else {
Log.e(TAG, "An unexpected error occurred: " + exception.getLocalizedMessage());
}
}
});
iOS-Implementierung
Fallback HDCP wird vom Native SDK für iOS/tvOS unterstützt, wird aber nur für Inhalte durchgesetzt, die mit FairPlay geschützt sind.
Sie können die Nichtkonformität des Geräts erkennen, indem Sie KVC
es verwenden, um Änderungen des Werts isOutputObscuredDueToInsufficientExternalProtection
auf dem AVPlayer zu erkennen.
AVPlayer.isOutputObscuredDueToInsufficientExternalProtection == true
Der Wert der oben genannten Immobilie ändert sich true
aus den folgenden Gründen:
- Die aktuelle Position erfordert externen Schutz
- Das Gerät entspricht nicht dem Schutzniveau
- Der Benutzer beobachtet einen Videoverlust
Da nicht alle Benutzer über eine HDCP-kompatible Einrichtung verfügen, empfiehlt Apple, eine Variante (Wiedergabe) in das Videomanifest aufzunehmen, die keinen HDCP-Schutz erfordert. Brightcove übernimmt dies für Sie, wenn Ihr Konto für Fallback-HDCP aktiviert ist.