기본 SDK를 사용하는 폴백 HDCP

이 항목에서는 Brightcove Native SDK와 함께 HDCP 보호 콘텐츠를 사용하여 승인되지 않은 장치에서 스트리밍을 차단하고 HDCP를 지원하지 않는 장치에 대한 표준 해상도 대체를 제공하는 방법에 대해 알아봅니다.

서문

HDCP(High-bandwidth Digital Content Protection)는 고화질(HD) 비디오 및 오디오 신호가 승인되지 않은 장치에 복사되지 않도록 보호하는 데 사용되는 디지털 복사 방지의 한 형태입니다. 전송 장치는 먼저 수신자가 데이터를 수신할 권한이 있는지 확인합니다. 그렇다면 송신기는 도청을 방지하기 위해 암호화된 데이터를 보냅니다.

수신 설정은 장치, 케이블, 어댑터 및 소프트웨어 드라이버를 포함하여 HDCP와 호환되어야 합니다. 수신기가 HDCP와 호환되지 않는 경우 비디오는 SD(표준 화질)로만 재생됩니다. 일반적으로 최신 HDTV와 HDMI 또는 DVI 케이블은 HDCP와 호환되어야 합니다.

자세한 내용은 폴백 HDCP 문서를 참조하십시오.

요구 사항

이 기능을 지원하려면 다음 요구 사항이 필요합니다.

브라이트코브 SDK 버전

  • Android 6.17.1 이상용 기본 SDK
  • iOS 6.10.1 이상용 네이티브 SDK

안드로이드 구현

SD 및 HD 변환이 혼합된 비디오를 재생할 때 다음을 수행할 수 있습니다.

  • HD 및 SD 재생을 모두 지원할 수 있는 장치에서 필요한 경우(예: 네트워크 대역폭이 변경되는 경우) 플레이어가 적절한 변환으로 전환할 수 있는지 확인하려고 합니다. 이 렌디션 스위치는 이전에 HD를 재생하던 플레이어가 SD 렌디션을 선택하도록 요구할 수 있습니다.

  • HDCP를 지원하지 않는 장치(예: 이전 OS 수준의 이전 Android 모바일 장치)에서는 SD 변환 내에서 적절한 변환 전환을 보장하고 플레이어가 HDCP 보호 변환을 로드하려고 시도하지 않도록 보호해야 합니다. 다음과 같은 오류 메시지와 함께 라이센스 요청이 실패합니다.

    오류 메시지 < />

    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) 
    

이 문제를 해결하려면AdaptationSets DASH에서 렌디션 전환을 허용하고 현재 장치에서 재생될 것으로 예상되지 않는 렌디션을 필터링하는 코드를 추가하는 것이 포함됩니다.

다음 예에서 HD 렌디션은 현재 장치가 지원하지 않는 더 엄격한 HDCP 요구 사항으로 보호됩니다. 이렇게 하려면EventListener on SET_SOURCE Event를 사용하면 됩니다. ExoPlayer인스턴스를 생성하기 전에 이러한 서포트를 추가해야 하기 때문입니다.

다음과 같은 예제를 플레이어Activity클래스에onCreate메서드에 추가할 수 있습니다.

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 구현

폴백 HDCP는 iOS/tvOS용 네이티브 SDK에서 지원되지만 FairPlay를 사용하여 보호되는 콘텐츠에만 적용됩니다.

다음을 사용하여 장치의 비준수를 감지할 수 있습니다. KVC값의 변화를 감지하기 위해isOutputObscuredDueToInsufficientExternalProtection AVPlayer에서.

AVPlayer.isOutputObscuredDueToInsufficientExternalProtection == true

위 속성의 값은 다음과 같은true이유로 로 변경됩니다.

  • 현재 항목은 외부 보호가 필요합니다.
  • 장치가 보호 수준을 충족하지 않습니다
  • 사용자가 비디오 손실을 관찰합니다.

모든 사용자가 HDCP 호환 설정을 가지고 있는 것은 아니므로 Apple은 비디오 매니페스트에 HDCP 보호가 필요하지 않은 변형(렌디션)을 포함할 것을 권장합니다. 계정이 Fallback HDCP에 대해 활성화되면 Brightcove가 이를 처리합니다.