안드로이드용 네이티브 SDK 용 캐스트 플러그인

이 항목에서는 Android용 브라이트코브 네이티브 SDK용 캐스트 플러그인을 사용하여 비디오를 크롬캐스트에 연결된 TV로 캐스팅하는 방법에 대해 알아봅니다.

개요

Google Cast기술을 사용하면 모바일 디바이스에서 고화질 TV 및 홈 오디오 시스템까지 스트리밍된 동영상 콘텐츠를 시작하고 제어할 수 있습니다. 앱에서 전송 버튼을 탭하여 콘텐츠를 큰 화면으로 스트리밍하세요.

Cast 응용 프로그램을 빌드하려면 다음 구성 요소가 필요합니다.

  • 발신자 신청서 -이것은 모바일 장치에 상주하며 수신기 장치를 감지하고 보안 연결을 설정하고 콘텐츠를 미러링합니다. 발신자 앱은 콘텐츠를 Chromecast 기기의 수신기 앱으로 전송하는 데 사용되는 로컬 플레이어입니다. 수신기 앱으로 캐스팅 한 후에는 Chromecast의 리모콘으로 생각할 수 있습니다.

    발신자 앱은 Android 용 Brightcove Native SDK 용 Cast 플러그인에서 제공합니다. 이 주제에서 그것에 대해 배우게됩니다.

  • 수신기 신청 -이 애플리케이션은 Chromecast 기기에서 실행됩니다. CSS 및 JavaScript 자산이있는 단일 페이지 HTML 앱으로 생각할 수 있습니다.

    테스트를 위해 다음과 같이 하십시오.

    1. Google의 샘플 캐스트 수신기로시작
    2. 리뷰 Google Cast 앱선적 서류 비치

    프로덕션 용도로이 문서는 Brightcove Receiver v2.0.0을 사용하는 방법을 설명합니다.

지원되는 SDK 버전

새로운 Brightcove Receiver v2.0에서 Cast 플러그인을 사용하려면 Android 버전 6.16.0 이상용 Brightcove Native SDK를 사용해야합니다.

Cast 플러그인 이해

캐스트 플러그인은새로운 ExopLayer 캐스트 확장 기능과 Google Play 서비스 캐스트프레임 워크 위에 구축됩니다. 캐스트 플러그인 종속성을 추가 한 후, gradle은 다른 필요한 종속성과 함께 Play 서비스 캐스트 프레임 워크 종속성, ExopLayer 캐스트 확장 종속성을 가져옵니다.

Cast 플러그인은 Video Cloud와 통합 할 때의 노력을 최소화하기 위해 재 설계되었습니다. Video Cloud를 사용할 때BrightcoveCastMediaManager클래스는 Brightcove와 같은 Video Cloud 응답에서 정보를 수집합니다. VideoSource개체, 매번EventType.SET_SOURCE이벤트가 발생합니다. 이 정보는 캐시되어 사용자가 비디오를 대기열에 넣기 위해 재생을 선택할 때 사용할 수 있습니다.

Cast 플러그인 통합

앱을 Android Cast 플러그인 용 Native SDK와 통합 할 수있는 두 가지 방법이 있습니다. Brightcove Cast Receiver v2.0 또는 Google Cast 데모 수신기와 통합 할 수 있습니다.

두 통합 모두 앱 프로젝트에이 종속성을 추가해야합니다.

implementation "com.brightcove.player:android-cast-plugin:6.16.0"

Brightcove Cast Receiver v2.0 사용

이 통합은 콘텐츠를 제공하기 위해 Brightcove API를 사용하는 Brightcove 고객을위한 것입니다.

전체 코드 샘플은 BasicCastBrightcoveReceiverSampleApp .

Google Cast 데모 수신기 사용

이 통합은 캐스팅을 처음 사용하는 Brightcove 고객을위한 것입니다.

전체 코드 샘플은 BasicCastGoogleReceiverSampleApp .

자신의 Cast 수신기 앱 ID 지정

그만큼 BasicCastGoogleReceiverSampleApp시작 및 테스트에는 도움이 될 수 있지만 프로덕션에는 도움이되지 않는 Google 데모 수신기 앱 ID를 설정합니다.

Cast Receiver 애플리케이션으로이 값을 재정의하려면 샘플 앱의 다음 문자열 값을 정의하십시오. strings.xml파일:

<string name="cast_receiver_app_id">4F8B3483</string>

브라이트코브 Google캐스트 컴퍼넌트

그만큼GoogleCastComponent class는 Brightcove Cast 플러그인의 기본 클래스입니다. ExopLayer CastPlayer를 인스턴스화하고 리스너를 설정합니다. 비디오를로드하거나 대기열에 추가하는 몇 가지 필수 방법을 노출합니다. 또한 이GoogleCastComponent클래스는 활동 및 프래그먼트 라이프사이클 이벤트를 처리할 수 있는 여러 브라이트코브 이벤트 리스너와 미디어 정보를 내보내는 데 사용할 수 있는 다른 이벤트 리스너를 추가하여 Chromecast 디바이스에 비디오를 로드합니다.

그만큼GoogleCastComponent이제 빌더 패턴을 사용합니다. v6.16.0 이전의 Android 용 Native SDK 버전에서는 구성 요소를 인스턴스화하고ContextEventEmitter ~로GoogleCastComponent건설자. 그런 다음 일련의 개별 메서드 호출에서 구성 요소의 옵션을 설정합니다.

Android v6.16.0 용 네이티브 SDK부터 빌더 패턴을 사용하여GoogleCastComponent빌더 메소드 호출의 단일 체인 내에서 옵션을 설정합니다.

CustomData

와 마찬가지로GoogleCastComponent , CustomData클래스는 Builder 패턴을 사용하여 객체를 인스턴스화하고 속성을 추가합니다. Brightcove 수신기는CustomData Brightcove 카탈로그에서 비디오를 검색하기 위해 완전한CustomData원격 자산 캐스팅과 같은 개체. Google Demo Receiver를 사용할 때CustomData지원되지 않습니다. 이 논의의 목적을 위해 우리는CustomData Brightcove 카탈로그에서 비디오 데이터를 검색하는 데 사용되는 수신기로 전송됩니다.

CustomData 란 무엇입니까?

CustomData에 포함 된 JSON 개체입니다. MediaInfo목적. 의도 된 용도는 Brightcove Cast Receiver App v2.0입니다.

Brightcove 수신기 및 카탈로그 데이터를 사용한 CustomData

Brightcove 수신기와 통합 할 때CustomData JSON 객체는 다음 형식을 취합니다.

"customData": {
	"accountId": "1234567890",
	"analyticsParams": {
		"application": "com.brightcove.player.test",
		"user": "abcde1c44b951234"
	},
	"catalogParams": {
		"adConfigId": null,
		"type": "video",
		"bcovAuthToken": null,
		"id": "2345678901",
		"policyKey": "BCpkPolicyKeyObject"
	}
}

그만큼CustomData위의 개체 예제에는 Brightcove 수신기에서 비디오를 캐스팅하는 데 필요한 모든 데이터 요소가 포함되어 있습니다. 이 데이터는 암호화에 관계없이 동일합니다. 즉, DRM 동영상의 경우 라이선스 URL에 추가 구조가 필요하지 않습니다.

당신은 또한의 예를 찾을 수 있습니다CustomData의 개체 BrightcoveCastBrightcoveReceiverSampleApp .

Google 데모 수신기를 사용한 CustomData

상술 한 바와 같이, CustomData Google 데모 수신기에서는 지원되지 않습니다.

BrightcoveCastMediaManager

연장이 가능합니다BrightcoveCastMediaManager , 위에 표시된대로 메서드를 재정의하거나 직접 구현합니다. BrightcoveCastMediaManager 클래스 확장의 예는 다음을 참조하십시오.

  • BrightcoveCastMediaManager 섹션 확장
  • BasicCastCustomRemoteVideoSampleApp

OptionsProvider

그런 다음 Google 캐스트 프레임 워크에 대한옵션공급자구현을 지정해야합니다. OptionsProvider인터페이스는CastContext클래스를 초기화하는 데 필요한 몇 가지 옵션을 설정하는 데 도움이됩니다. 여기서 캐스트 수신기 앱 ID를 설정합니다. 통합에 대해 자세히 알아 보려면OptionsProvider , Google의캐스트 컨텍스트 초기화문서.

Brightcove Cast 플러그인에는DefaultOptionsProvider여기에서 Cast Receiver 앱 ID는 strings.xml리소스 파일. 자세한 내용과 앱에서 재정의하는 방법을 알아 보려면자신의 Cast 수신기 앱 ID 사용위 섹션.

사용 여부DefaultOptionsProvider수업 또는 자신의OptionsProvider구현하려면OptionsProvider앱의 구현 클래스 이름 AndroidManifest.xml다음과 같이 파일을 키-값 쌍 메타 데이터로 저장합니다.

<meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:value="com.brightcove.cast.DefaultOptionsProvider" />

사용하는 경우DefaultOptionsProvider클래스, 당신은 설정할 수 있습니다ExpandedControllerActivity유사한 메타 데이터 정보를 설정하여 전송 알림을 켜거나 끄려면 AndroidManifest .

확장된 컨트롤러 작업

ExpandedControllerActivity는 Google 캐스트 라이브러리와 함께 제공되며 크롬캐스트 기기에서 전송되는 동영상을 제어할 수 있습니다. 이 클래스는 몇 가지 사용자 정의 유연성을 제공합니다. 예를 들어 버튼을 표시하는 데 사용할 수 있는 슬롯이 다섯 개 있으며 세 번째 슬롯은 구성할 수 없는 재생 버튼용으로 예약되어 있습니다. 나머지 단추는 미리 정의된 다른 단추 또는 사용자 정의 단추로 설정할 수 있습니다.

브라이트코브 캐스트 플러그인은 하위 클래스를 제공합니다DefaultExpandedControllerActivity . 다음과 같은 순서로 다음 버튼을 활성화했습니다.

  • 폐쇄 자막
  • 이전 건너뛰기
  • 플레이
  • 다음 건너뛰기
  • 음소거 토글

또한 Seek Bar는 표준에 사용된 드로어 블과 동일한 기본 드로어 블을 설정합니다BrightcoveMediaController .

  • 진행 드로어 블:
    R.drawable.default_scrubber_progress_horizontal
  • 엄지 손가락 드로어 블:
    R.drawable.default_scrubber_thumb

탐색 모음을 사용자 지정하는 방법에 대한 자세한 내용은 찾기 도구모음색상샘플앱을 참조하십시오 .

DefaultExpandedControllerActivity또는 직접ExpandedControllerActivity설정하려면AndroidManifest.xml파일에서 다음 메타데이터를 설정합니다.

<meta-data  android:name="com.brightcove.cast.DefaultOptionsProvider.EXPANDED_CONTROLLER_ACTIVITY_CLASS_NAME"
android:value="com.brightcove.cast.DefaultExpandedControllerActivity" />

캐스트 알림

전송 알림을 사용하도록 설정하면 동영상을 전송하고 앱을 백그라운드에 넣을 때 (예: 홈 키를 누른 후) 알림이 표시됩니다.

<p 전송 알림을 사용하려면 다음 메타 데이터를 AndroidManifest.xml파일을 저장하고 알림을 클릭 할 때 실행할 활동의 이름을 제공합니다.

<meta-data android:name="com.brightcove.cast.DefaultOptionsProvider.NOTIFICATION_TARGET_ACTIVITY_CLASS_NAME"
android:value="com.brightcove.cast.BrightcoveControllerActivity" />

알림_대상_활동_클래스 이름을 제공하지 않거나 값에 잘못된 활동 이름이 있는 경우 전송 알림이 해제됩니다.

캐스트 버튼

전송 버튼을 사용하면 디바이스와 동일한 네트워크에서 Chromecast 디바이스를 선택할 수 있으며 세션을 연결하고 생성할 수 있습니다. 애플리케이션에 전송 버튼을 추가하려면 Google의 Cast 통합 : 전송 버튼 추가문서.

브라이트코브 캐스트 플러그인은 캐스트 버튼을 쉽게 설정할 수 있는 유틸리티 방법을 제공합니다. 이 기능은 [활동/조각] 메뉴에 [캐스트] 버튼을 추가하려는 경우에 유용합니다. 자세한 내용은 다음 코드를 참조하십시오.

//Activity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
   super.onCreateOptionsMenu(menu);
   GoogleCastComponent.setUpMediaRouteButton(MainActivity.this, menu);
   return true;
}

미니 컨트롤러

미니 컨트롤러는 일반적으로 레이아웃의 하단에 위치한 활동에 첨부되는 조각입니다. 미니 컨트롤러를 사용하면 비디오를 재생하거나 일시 정지할 수 있으며 Chromecast 장치에서 비디오가 재생되는 시기를 알려줍니다. 미니 컨트롤러를 클릭하면 확장된 컨트롤러가 실행됩니다.

미니 컨트롤러를 활성화하려면 활동 레이아웃에 다음 코드를 추가하십시오.

<fragment
   android:id="@+id/castMiniController"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_alignParentBottom="true"
   android:visibility="gone"
   class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment" />

미니 컨트롤러로 모범 사례를 알아보려면설계 체크리스트를 참조하십시오. 발신자 미니 컨트롤러문서입니다. 구현에 대한 자세한 내용은통합 캐스트: 미니 컨트롤러 문서를 추가합니다 .

고급 주제

캐스트 세션 듣기

캐스트 연결이 시작되거나 끝날 때 앱이 반응하도록 하려면 다음과 같이GoogleCastEventType.CAST_SESSION_STARTED또는GoogleCastEventType.CAST_SESSION_ENDED이벤트 리스너를 추가할 수 있습니다.

eventEmitter.on(GoogleCastEventType.CAST_SESSION_STARTED, new EventListener() {
   @Override
   public void processEvent(Event event) {
       // Session Started
   }
});
eventEmitter.on(GoogleCastEventType.CAST_SESSION_ENDED, new EventListener() {
   @Override
   public void processEvent(Event event) {
       // Session Ended
   }
});

또는 를GoogleCastComponent.isSessionAvailable()호출하여 사용 가능한 세션을 확인할 수 있습니다.

비디오 캐스팅

성공적인 연결 후 비디오를 크롬캐스트로 전송하려면 EventEmitter를 사용하여 미디어 정보 정보를 내보내거나 직접GoogleCastComponent메서드를 사용할 수 있습니다.

미디어 정보를 내보내려면 다음 이벤트를 사용할 수 있습니다.

  • GoogleCastEventType.LOAD_MEDIA_INFO
  • GoogleCastEventType.LOAD_MEDIA_QUEUE_ITEM
  • GoogleCastEventType.ADD_MEDIA_INFO
  • GoogleCastEventType.ADD_MEDIA_QUEUE_ITEM

다음 표에서는 각 이벤트에 대해 예상되는 속성을 보여 줍니다.

이벤트 이름 등록 정보
값 분류 유형
LOAD_MEDIA_INFO GoogleCastComponent.CAST_MEDIA_INFO
GoogleCastComponent.CAST_MEDIA_PLAY_POSITION
MediaInfo정수
LOAD_MEDIA_QUEUE_ITEM GoogleCastComponent.CAST_MEDIA_QUEUE_ITEM MediaQueueItem
ADD_MEDIA_INFO GoogleCastComponent.CAST_MEDIA_INFO
GoogleCastComponent.CAST_MEDIA_PLAY_POSITION
MediaInfo정수
ADD_MEDIA_QUEUE_ITEM GoogleCastComponent.CAST_MEDIA_QUEUE_ITEM MediaQueueItem

또는 다음을 사용할 수 있습니다. GoogleCastComponent행동 양식:

  • public void loadMediaInfo(MediaInfo mediaInfo, long positionMs)
  • public void loadMediaInfo(MediaInfo mediaInfo)
  • public PendingResult<RemoteMediaClient.MediaChannelResult> loadItem(MediaQueueItem mediaQueue, int playheadPosition)
  • public PendingResult<RemoteMediaClient.MediaChannelResult> addItems(MediaQueueItem... mediaQueue )

기본 미디어 정보 데이터 변경

기본적으로 캐스트 플러그인은 에서 방출하는 현재 Video 및 Source 객체에 대한 정보를 수집합니다EventType.SET_SOURCE event . 사용자 지정 JSON 개체를 추가하는 등 추가 정보를 변경하거나 추가하려는 경우MediaInfo앱 수신기가 이해하는 경우loadMediaInfo()addMediaInfo()방법에서BrightcoveCastMediaManager . 그런 다음BrightcoveCastMediaManager하위 클래스가 생성자 매개 변수로GoogleCastComponent클래스에 전달됩니다.

이러한 메서드 내에서MediaInfo개체를 만들고 이전에 표시된대로 적절한 이벤트를 내보낼 수 있습니다. 확인하십시오com.brightcove.cast.util.CastMediaUtil , 생성하는 몇 가지 유틸리티 메서드를 제공하므로MediaInfo비디오 및 소스 개체에서.

캐스트 미디어 컨트롤러 구성하기

캐스트 세션이 시작될 때 브라이트코브 비디오 뷰에 표시되는 컨트롤러 레이아웃을 변경하려면 다음 단계를 따르십시오.

  1. 브라이트코브캐스트 미디어 관리자 확장
  2. 미디어 컨트롤러 구성 설정
  3. 컨트롤 바 설정 덮어쓰기

브라이트코브캐스트 미디어 관리자 확장

의 기본 동작을 변경하려면 하위 클래스를 만들고 몇 가지 주요 메서드를 덮어씁니다. BrightcoveCastMediaManager

  • public void updateBrightcoveMediaController(boolean isRemote)

    이 메서드는 세션이 변경될GoogleCastComponent때 (즉, 세션이 시작되거나 종료된 경우) 에 의해 호출됩니다. 세션이 시작되면isRemote매개 변수가true되고setupRemoteController메서드가 호출됩니다. 그렇지isRemote않으면 가false되고resetToLocalController가 호출됩니다.

  • protected void setupRemoteController()

    이 메서드는 이벤트를 내 보냅니다. EventType.SET_MEDIA_CONTROLLER_CONFIG와 더불어MediaControllerConfig목적. 우리는이 섹션의MediaControllerConfig후반부에 대해 더 이야기 할 것입니다. 또한 이 메서드는BrightcoveMediaController.CONTROL_BAR_CREATED이벤트를 수신하고setupBrightcoveControlBar메서드를 호출하여 반응합니다.

  • protected void resetToLocalController()

    이 메소드는BrightcoveMediaController을 (를) 방출하여 원래 컨트롤러 레이아웃으로 재설정합니다EventType.RESTORE_DEFAULT_MEDIA_CONTROLLER .

  • protected void setupBrightcoveControlBar(BrightcoveControlBar controlBar)

    일단BrightcoveMediaController제공되는 레이아웃으로 재현되었습니다. MediaControllerConfig에 액세스 할 수 있습니다. BrightcoveControlBar전망. 여기에서 버튼과 같은 UI 보기에 액세스할 수 있습니다. 여기에서 를 추가할OnClickListener수 있습니다.

미디어 컨트롤러 구성 설정

MediaControllerConfig는 클래스의 기본 제어 레이아웃을 변경하는 데 사용할 수 있는 구성BrightcoveMediaController클래스입니다. 이 클래스에서는 레이아웃 및 을 설정할 수OnTouchListener있습니다. 생성 및 구성되면 아래 그림과 같이이 객체를 방출 할 수 있습니다:

Map<String, Object> properties = new HashMap<>();
properties.put(Event.MEDIA_CONTROLLER_CONFIG, myMediaControllerConfig);
eventEmitter.emit(EventType.SET_MEDIA_CONTROLLER_CONFIG,properties);

기본MediaControllerConfig대상체는 을R.layout.cast_media_controller단일재생버튼으로 레이아웃으로 설정합니다. 클릭하면 두 가지 옵션이 있는 대화 상자가 열립니다.

  • 지금 재생 - 이 옵션을 선택하면loadMediaInfo()메서드가 호출되고 비디오가 크롬캐스트에서 로드되고 재생됩니다.
  • 대기열에 추가 - 이 옵션을 선택하면addMediaInfo()메서드가 호출되고 비디오가 대기열 끝에 추가됩니다.

컨트롤 바 설정 덮어쓰기

미디어 컨트롤러 레이아웃이MediaControllerConfig , BrightcoveControlBar보기가 생성되고BrightcoveCastMediaManager.setupBrightcoveControlBar()메서드가 호출됩니다. Id로 UI 구성 요소를 가져 와서 적절한 리스너를 추가 할 수 있습니다.

@Override
protected void setupBrightcoveControlBar(BrightcoveControlBar controlBar) {
   Button playButton = controlBar.findViewById(R.id.cast_play);
   if (playButton != null) {
       playButton.setOnClickListener(new View.OnClickListener() {...});
   }
}

알려진 문제

안드로이드 9

Android 9 이상에서 Chromecast를 사용하는 경우 다음을 포함해야합니다. FOREGROUND_SERVICE허가. 이를 통해 앱이 백그라운드로 전환되고 포그라운드로 다시 가져올 때 앱이 알림을 사용하여 캐스팅 세션을 제어할 수 있습니다.

uses-permission태그는 다음과 같이 앱의AndroidManifest.xml파일에 추가되어야 합니다.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

구글 플레이 서비스

발신자의 Google Play 서비스 버전이 최신 버전이 아닌 경우 캐스팅 연결이 생성되지 않을 수 있습니다. 발신자의 Google Play 서비스, 특히 캐스트 서비스 프레임 워크가 오래된 경우 캐스트 연결을 생성하지 못할 수 있습니다. 이는 Google Play 스토어를 통해 발신자의 Google Play 서비스를 업데이트하면 해결됩니다.