안드로이드용 네이티브 SDK를 사용하는 코드 스 니펫

이 항목에서는 SDK로 개발하는 동안 참조로 유용 할 수 있습니다 코드 조각의 컬렉션을 찾을 수 있습니다. 자세한 솔루션은 Android 플레이어 샘플 .

목차

광고

분석 도구

자막

개념

DRM (콘텐츠 보안)

라이브 스트림

재생

플레이어 컨트롤

재생목록

비디오 콘텐츠

Android TV 용 컨트롤 사용자 지정

장치 또는 Android TV의 컨트롤 막대에 버튼을 추가 할 수 있습니다. 아래 단계는 Android TV의 컨트롤 막대에 전체 화면 버튼을 추가하는 과정을 안내합니다.

  1. 열기맞춤형 컨트롤샘플 앱. 이것을 시작점으로 사용하겠습니다. 샘플 앱 검토읽어보기플레이어 컨트롤 사용자 지정에 대한 자세한 내용은 파일을 참조하십시오.
  2. 열기 res / layout / land / my_media_controller.xml Android Studio의 파일.
  3. 복사Button요소full_screen단추. 코드는 다음과 유사해야합니다.
    <Button
    style="@style/BorderlessButton"
    android:id="@id/full_screen"
    android:padding="4dp"
    android:layout_gravity="center_vertical"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:visibility="visible"
    android:text="@string/brightcove_controls_enter_full_screen"/>
  4. 열기 res / layout / my_tv_media_controller.xml Android Studio의 파일.
  5. 복사 한 붙여 넣기Button요소를이 레이아웃 파일에 추가합니다. 요소의 위치에 따라 컨트롤 막대에서의 위치가 결정됩니다.
  6. 맨 위로 스크롤 res / layout / my_tv_media_controller.xml파일. 스타일 속성이 다음으로 설정되어 있는지 확인하십시오. @style/BrightcoveControlBar.TV.Custom . 코드는 다음과 같아야합니다.
    <?xml version="1.0" encoding="utf-8"?>
    <com.brightcove.player.mediacontroller.BrightcoveControlBar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bmc="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="Overdraw, InconsistentLayout"
    android:id="@+id/brightcove_control_bar"
    android:background="@color/bmc_background"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="8dp"
    
    android:orientation="horizontal"
    android:layout_gravity="bottom"
        style="@style/BrightcoveControlBar.TV.Custom">
  7. 열기 res / values / styles.xml Android Studio의 파일.
  8. style요소가있는name가치BrightcoveControlBar.TV.Custom , 추가item전체 화면 버튼에 대한 요소를 설정하고true그것을 표시합니다.
    <style name="BrightcoveControlBar.TV.Custom">
    <item name="brightcove_vr_mode">false</item>
      <item name="brightcove_full_screen">true</item>
    </style>
  9. 그게 다야 Android TV 실제 또는 가상 장치에서 샘플 앱을 실행합니다. 컨트롤 막대에 전체 화면 버튼이 표시되어야합니다.
    전체 화면 단추
    전체 화면 단추

전체 화면으로보기

코드를 사용하여 전체 화면 모드를 관리 할 수 있습니다.

실시간 스트림 기간 가져 오기

실시간 스트림의 길이를 확인하려면MAX_POSITION . 이것은 당신에게 라이브 스트림을위한 가장 큰 검색 가능한 위치를 제공합니다 (즉, 스크롤바를 드래그 할 수있는 가장 먼 위치). 코드는 다음과 비슷해야합니다.

brightcoveVideoView.getEventEmitter().on(EventType.PROGRESS, new EventListener() {
  @Override
  public void processEvent(Event event) {
  int duration = (int) event.properties.get(Event.MAX_POSITION);
  }
});

네트워크 대역폭 감지

다운로드 작업과 같이 앱 내에서 네트워크 대역폭을 감지해야 하는 사용 사례가 있을 수 있습니다.

Android용 네이티브 SDK는 대역폭을 감지하기 위해 ExoPlayer에서 제공하는BandwidthMeter클래스를 사용합니다. 우리PlayerBandwidthMeter클래스는BandwidthMeter클래스를 사용하며 예상 비트레이트를 반환하는getBitrateEstimate메서드를 제공합니다.

자세한 내용은 다음을 참조하십시오.

예를 들면 다음과 같습니다.

ExoPlayerVideoDisplayComponent exoPlayer = (ExoPlayerVideoDisplayComponent) brightcoveVideoView.getVideoDisplay();
exoPlayer.getBandwidthMeter().addEventListener(myHandler, new BandwidthMeter.EventListener() {@
	Override public void onBandwidthSample(int elapsedMs, long bytesTransferred, long bitrateEstimate) {}
});

ExoPlayer 인스턴스 가져 오기

Brightcove Native SDK를 통해 노출되지 않는 속성을 수정하기 위해 ExoPlayer 개체를 가져와야하는 경우가있을 수 있습니다. 이 개체의 인스턴스는 비디오가 설정된 후에 생성됩니다. 그래서, 당신은 기다려야합니다DID_SET_VIDEO행사.

다음을 수행하여 ExoPlayer 인스턴스를 가져올 수 있습니다.

// Get the ExoPlayer instance
eventEmitter.on(EventType.DID_SET_VIDEO, new EventListener() {
  @Override
  public void processEvent(Event event) {
    VideoDisplayComponent videoDisplayComponent = brightcoveVideoView.getVideoDisplay();
    if (videoDisplayComponent instanceof ExoPlayerVideoDisplayComponent) {
      // Get ExoPlayer
      ExoPlayer exoPlayer = ((ExoPlayerVideoDisplayComponent) videoDisplayComponent).getExoPlayer();
      if (exoPlayer instanceof SimpleExoPlayer) {
        // Get SimpleExoPlayer
        SimpleExoPlayer simpleExoPlayer = (SimpleExoPlayer) exoPlayer;
        Log.v(TAG, "onDID_SET_VIDEO: ExoPlayer = " + simpleExoPlayer);
      }
    }
  }
});

수정의 예는AudioAttribute ExoPlayer에 대한 속성은 Exoplayer 인스턴스에서 AudioAttributes 설정포럼 게시물.

썸네일 이미지의 URL 가져 오기

Brightcove 라이브러리의 썸네일 또는 비디오 스틸 이미지를 사용할 수 있습니다. 다음 코드를 사용하여 이미지의 URL을 가져옵니다.

Edge Catalog (com.brightcove.player.edge.Catalog)를 사용하는 Video Cloud 고객의 경우 다음과 같은 썸네일 URL을 얻을 수 있습니다.

String thumbnailUrl = video.getProperties().get("thumbnail").toString();

썸네일 이미지가 너무 작다면 대신 비디오 스틸 이미지를 얻을 수 있습니다.

String videoStillUrl = video.getProperties().get("stillImageUri").toString();

Google 분석

브라이트코브 플레이어와 카탈로그 클래스를 사용하는 경우 비디오 분석이 자동으로 수집되어 Video Cloud Analytics 모듈에 표시됩니다. 추가 측정항목을 보려면 앱에 Google 애널리틱스를 추가할 수 있습니다.

Google 애널리틱스를 앱과 통합하려면 다음 단계를 따르세요.

  1. 프로젝트에 Google 서비스 플러그인을 추가합니다.
  2. Google 구성 파일을 가져 와서 프로젝트에 추가하십시오.
  3. 응용 프로그램을 확장하고 응용 프로그램 추적기를 반환하는 도우미 메서드를 제공합니다. 다음과 유사해야합니다. google-services AnalyticsApplication .
  4. BrightcovePlayer를 확장하는 별도의 클래스에서 공유 추적기 인스턴스를 가져옵니다.
    // Obtain the shared Tracker instance
    AnalyticsApplication application = (AnalyticsApplication) getApplication();
    tracker = application.getDefaultTracker();
  5. 적절한 방법을 재정 의하여 화면 변경 사항을 기록하거나 추적을 위해 사용자 지정 이벤트를 보냅니다.

자세한 단계는 Google 문서를 참조하십시오. Android 앱에 분석 추가 .

원격 비디오 및 포스터 이미지로드

Brightcove Player 고객 만 원격 서버의 비디오 자산을 사용합니다. 다음 단계에 따라 원격 서버에있는 비디오 및 포스터 이미지를로드하십시오.

  1. 에서onCreate()방법은 비디오보기를 정의한 후 원격 서버에서 호스팅되는 비디오에서 비디오 개체를 만듭니다. 가지고 있는 비디오 유형과DeliveryType일치하도록 를 설정합니다.

    Video video = Video.createVideo("https://sdks.support.brightcove.com/assets/videos/hls/greatblueheron/greatblueheron.m3u8",
      DeliveryType.HLS);
  2. 비디오 재생이 시작되기 전에 포스터 이미지로 사용할 원격 이미지를 로드합니다.

    try {
      java.net.URI myposterImage = new java.net.URI("https://solutions.brightcove.com/bcls/assets/images/Great-Blue-Heron.png");
      video.getProperties().put(Video.Fields.STILL_IMAGE_URI, myposterImage);
    } catch (URISyntaxException e) {
      e.printStackTrace();
    }
  3. 보기에 비디오를 추가하고 비디오 재생을 시작합니다.

    brightcoveVideoView.add(video);
    brightcoveVideoView.start();
  4. onCreate()방법이 다음과 같이 나타나는지 확인하십시오.

    @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        brightcoveVideoView = (BrightcoveExoPlayerVideoView) findViewById(R.id.brightcove_video_view);
    
        // Optional: For Brightcove Player customers to register their apps
        Analytics analytics = brightcoveVideoView.getAnalytics();
        analytics.setAccount("your account Id");
    
        // Define a video from a remote server
        Video video = Video.createVideo("https://sdks.support.brightcove.com/assets/videos/hls/greatblueheron/greatblueheron.m3u8", DeliveryType.HLS);
    
        // Load a remote poster image
        try {
            java.net.URI myposterImage = new java.net.URI("https://solutions.brightcove.com/bcls/assets/images/Great-Blue-Heron.png");
            video.getProperties().put(Video.Fields.STILL_IMAGE_URI, myposterImage);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    
        // Add video to the view
        brightcoveVideoView.add(video);
        // Start video playback
        brightcoveVideoView.start();
      }

수동으로 DRM 콘텐츠 추가

Brightcove Player 고객은 자신의 서버에서 DRM으로 보호 된 콘텐츠를 사용할 수 있습니다. 다음과 같이 DRM 콘텐츠를 수동으로로드 할 수 있습니다.

import com.brightcove.player.display.WidevineMediaDrmCallback;

Video video = Video.createVideo("https://storage.googleapis.com/wvmedia/cenc/h264/tears/tears.mpd");
video.getProperties().put(WidevineMediaDrmCallback.DEFAULT_URL, "https://proxy.uat.widevine.com/proxy?video_id=&provider=widevine_test");
brightcoveVideoView.add(video);
brightcoveVideoView.start();

방법 : 동기 또는 비동기?

다음은 Android 용 Native Player SDK에있는 몇 가지 비동기 메서드입니다.

  • 그만큼start() , seekTo()stopPlayback()메서드는 시스템의 다른 구성 요소가 처리 할 이벤트를 생성하기 때문에 비동기식입니다.
  • 그만큼clear()메소드는 목록 업데이트와 관련하여 동 기적이지만 현재 동영상 언로드와 관련하여 비동기 적입니다.

플레이어 음소거 / 음소거 해제

프로그래밍 방식으로 플레이어를 음소거하거나 음소거 해제 할 수 있습니다. Brightcove는 가능할 때마다 BrightcoveExoPlayerVideoView를 사용할 것을 권장합니다.

브라이트코브엑스포레이어비디오보기

사용할 때 BrightcoveExoPlayerVideoView , 다음을 수행하여 프로그래밍 방식으로 플레이어를 음소거하거나 음소거 해제 할 수 있습니다.

float volume = 100F;
...
brightcoveVideoView.getEventEmitter().on(EventType.DID_SET_VIDEO, new EventListener() {
  @Override
  public void processEvent(Event event) {
    setMute(true);
    brightcoveVideoView.start();
  }
});
...
private void setMute(boolean mute) {
  volume = mute ? 0F : 100F;
  Map<string, Object> properties = new HashMap<>();
  properties.put(Event.VOLUME, volume);
  brightcoveVideoView.getEventEmitter().emit(EventType.SET_VOLUME, properties);
}

BrightcoveVideoView

사용할 필요가있는 경우 BrightcoveVideoView , Android의미디어 플레이어 , 다음 코드를 사용하여 프로그래밍 방식으로 플레이어를 음소거하거나 음소거 해제 할 수 있습니다.

float volume = 1F;
...
brightcoveVideoView.getEventEmitter().on(EventType.DID_SET_VIDEO, new EventListener() {
  @Override
  public void processEvent(Event event) {
    setMute(true);
    brightcoveVideoView.start();
  }
});
...
private void setMute(boolean mute) {
  volume = mute ? 0F : 1F;
  Map<String, Object> properties = new HashMap<>();
  properties.put(Event.LEFT_VOLUME, volume);
  properties.put(Event.RIGHT_VOLUME, volume);
  brightcoveVideoView.getEventEmitter().emit(EventType.SET_VOLUME, properties);
}

DRM으로 오프라인 재생

오프라인 재생을 위해 다운로드 한 비디오의 경우 다운로드 상태도 알림 영역에 표시 될 수 있습니다. 알림 제목이 비디오 제목으로 설정됩니다. 다운로드가 일시 중지되거나 취소되면 알림이 제거됩니다.

알림 상태 다운로드
다운로드 상태 알림 내용 텍스트 알림 아이콘
다운로드 중 R.string.odrm_download_running -기본적으로 "다운로드 중…"입니다.

완료율을 보여주는 진행률 표시 줄이 있습니다.
플랫폼 기본 애니메이션 "다운로드"아이콘- android.R.drawable.stat_sys_download
다시 시도 R.string.odrm_download_waiting_retry -기본적으로 "Waiting retry ..."입니다.  
실패 R.string.odrm_download_failed -이것은 기본적으로 "실패!" "입니다.  
완료됨 R.string.odrm_download_complete -기본적으로 "저장 됨"입니다. 플랫폼 기본 정적 "다운로드 됨"아이콘- android.R.drawable.stat_sys_download_done

재시도 또는 실패 상태의 경우 알림 하위 텍스트는 오류 유형에 따라 적절한 리소스로 설정됩니다. 다음은 전체 목록입니다.

  • R.string.odrm_error_none
  • R.string.odrm_error_cannot_resume
  • R.string.odrm_error_device_not_found
  • R.string.odrm_error_file_already_exists
  • R.string.odrm_error_file_error
  • R.string.odrm_error_http_data_error
  • R.string.odrm_error_insufficient_space
  • R.string.odrm_error_too_many_redirects
  • R.string.odrm_error_unhandled_http_code
  • R.string.odrm_error_unknown

재생 API를 사용한 페이징

재생 API에서 Video Cloud 콘텐츠를 검색할 때 재생 목록에 대한 페이징을 구현할 수 있습니다.

재생 목록의 비디오 집합을 페이지 처리하려면 다음 요청 URL 매개 변수를 사용합니다.

  • limit -Playback API에서 반환 할 동영상 수를 정의합니다.
  • offset -Playback API의 재생 목록에서 건너 뛸 동영상 수를 설정합니다.

쿼리 매개 변수는 다음과 같이 Catalog 메서드에 전달됩니다. Map객체, 키-값 쌍으로. 이 예에서는 재생 목록의 10번째 동영상으로 시작하는 6개의 동영상을 반환합니다.

Map<String, String> queryParameters = new HashMap<>();
queryParameters.put("limit", "6");
queryParameters.put("offset", "9");

Catalog catalog = new Catalog(eventEmitter, "myAccount", "myPolicy");
catalog.findPlaylistByID("myPlaylistId", null, queryParameters, myListener);

로컬 비디오 재생

로컬에 저장된 MP4 비디오를 재생하려면 응용 프로그램 자산 폴더에 저장해야합니다.

Uri video = Uri.parse("file:///android_asset/path/to/video.mp4");
brightcoveVideoView.add(Video.createVideo(video.toString()));
brightcoveVideoView.start();

하단에 플레이어 컨트롤 배치

기본적으로 플레이어 컨트롤 막대는 다음과 같이 동영상 바로 아래에 있습니다.

비디오 아래의 플레이어 컨트롤
비디오 아래의 플레이어 컨트롤

플레이어 컨트롤 막대를 동영상보기 하단에 배치 할 수도 있습니다. 컨트롤은BrightcoveVideoView , 높이를match_parent ,보기가 전체 화면을 덮을 것입니다. 컨트롤이보기 하단에 나타나면 비디오는보기 중간에 유지됩니다.

플레이어 컨트롤 하단
플레이어는 비디오보기 하단을 제어합니다.

이를 수행 할 수있는 두 가지 방법이 있습니다. 첫 번째 접근 방식은 다음과 같습니다.

  1. 열기 main / res / values / style.xml프로젝트 파일.
  2. 다음 XML 코드를 추가하십시오.

    <style name="BrightcoveControlBar" parent="BrightcoveControlBarDefault">
      <item name="brightcove_align">false</item>
    </style>

또는 내에서 코드를 사용할 수 있습니다. MainActivity.java다음과 같이 파일 :

  1. 열기 MainActivity.java프로젝트 파일.
  2. 다음과 같이 이벤트 이미 터를 가져온 후 :

    EventEmitter eventEmitter = brightcoveVideoView.getEventEmitter();

    다음 이벤트 리스너 및 코드를 추가합니다. 우리는 이후까지 기다리고 있습니다DID_SET_VIDEO컨트롤 막대가 생성되었는지 확인하는 이벤트입니다.

    eventEmitter.on(EventType.DID_SET_VIDEO, new EventListener() {
      @Override
      public void processEvent(Event event) {
        BrightcoveControlBar brightcoveControlBar = brightcoveVideoView.getBrightcoveMediaController().getBrightcoveControlBar();
        brightcoveControlBar.setAlign(false);
        }
    });

IMA 광고 미리로드

Android 용 Native SDK 및 IMA 플러그인을 사용하여 광고를 미리로드하려면setEnablePreloading(true)특성 .

이 속성을 사용하려면 다음 단계를 수행하십시오.

  1. 시작점은 IMA 샘플 앱 .

  2. 찾기private void setupGoogleIMA()함수.

  3. 함수의 마지막 코드 줄 앞에 스 니펫 코드 블록을 추가합니다.

    ImaSdkSettings imaSdkSettings = sdkFactory.createImaSdkSettings();
    AdsRenderingSettings adsRenderingSettings =
    ImaSdkFactory.getInstance().createAdsRenderingSettings();
    adsRenderingSettings.setEnablePreloading(true);
  4. 추가adsRenderingSettings마지막 코드 줄에 매개 변수를 추가합니다.

    googleIMAComponent = new GoogleIMAComponent(brightcoveVideoView, eventEmitter, true, adsRenderingSettings);

광고 없이 검색

당신은 사용할 수 있습니다adsDisabled재산VideoPlaybackController비디오를 검색하는 동안 광고 재생을 비활성화합니다.

이 기능을 사용하려면 다음 단계를 따르십시오.

  1. 얻기VideoPlaybackController인스턴스에서BrightcoveVideoView .

    VideoPlaybackController playbackController = brightcoveVideoView.getPlaybackController();
  2. 광고 재생을 비활성화합니다.

    playbackController.setAdsDisabled(true);
  3. 현재 비디오에서 원하는 시간 위치를 찾습니다.
  4. 정상적인 광고 동작을 재개합니다.

    playbackController.setAdsDisabled(false);

코드는 다음과 같아야합니다.

final VideoPlaybackController playbackController = brightcoveVideoView.getPlaybackController();
eventEmitter.on(EventType.VIDEO_DURATION_CHANGED, new EventListener() {
  @Override
  public void processEvent(final Event event) {
    playbackController.setAdsDisabled(true);
    brightcoveVideoView.seekTo(10000);
  }
});

eventEmitter.on(EventType.DID_SEEK_TO, new EventListener() {
  @Override
  public void processEvent(final Event event) {
    playbackController.setAdsDisabled(false);
  }
});

버퍼 크기 설정

다음 세그먼트의 전달이 CDN에서 지연되는 경우 플레이어에서 버퍼링을 제거하기 위해 버퍼 길이를 늘릴 수 있습니다. 그러나 HLS가 이미 수행 한 것보다 더 나은 작업을 수동으로 수행하지 못할 수도 있습니다.

HLS는 즉시 재생하고 따라 잡을 수없는 경우 품질을 떨어 뜨리도록 설계되었습니다. 이렇게하면 버퍼를 미리로드 할 필요가 없습니다. 따라 잡을 수없는 경우 중단을 방지하기 위해 가능한 한 많은 비디오를 최상의 품질로로드합니다.

Android v6.3.1 용 네이티브 SDK부터 ExoPlayer 2 구현 용 SDK에 다음 클래스가 추가되었습니다.

  • LoadControlConfig
  • AllocatorConfig

이 클래스에 설정된 값은 ExoPlayer를 만드는 데 사용됩니다. DefaultLoadControl ExoPlayer 인스턴스를 만드는 데 사용되는 개체입니다. 개발자는 다음과 같이 버퍼 크기를 제어 할 수 있습니다.

  1. 그만큼LoadControlConfigAllocatorConfig클래스는 빌더 패턴을 따릅니다. 두 클래스에서 설정할 수있는 값은 생성자에서 설정할 수있는 값을 반영합니다.

    AllocatorConfig allocatorConfig = new AllocatorConfig.Builder().build();
    LoadControlConfig loadControlConfig = new LoadControlConfig.Builder()
    .setAllocatorConfig(allocatorConfig)
    .setMinBufferMs(X)
    .setMaxBufferMs(Y)
    .build();
  2. 빌더에 설정되지 않은 값은 기본값을 사용합니다. 사용ExoPlayerVideoDisplayerComponent.setLoadControlConfig()설정 방법LoadControlConfig .

    brightcoveVideoView = (BrightcoveExoPlayerVideoView) findViewById(R.id.brightcove_video_view);
    ...
    ExoPlayerVideoDisplayComponent dc = (ExoPlayerVideoDisplayComponent) brightcoveVideoView.getVideoDisplay();
    dc.setLoadControlConfig(loadControlConfig);

캡션 및 테마 설정

현재BrightcoveCaptionPropertiesActivity Brightcove Player SDK의 매니페스트 파일에 설정되어 있으므로 개발자는 응용 프로그램에서 지정할 필요가 없습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.brightcove.player"
android:versionCode="1"
android:versionName="1.0">

<application>
<!-- If we don't register this Activity in the Manifest, apps using the SDK will crash when they try to access it. -->
<!-- During the app's build process, this manifest will be merged with the app-level one. -->
<activity android:name="com.brightcove.player.captioning.BrightcoveCaptionPropertiesActivity"/>
</application>
</manifest>

그만큼BrightcoveCaptionPropertiesActivity앱에 대한 테마를 설정하는 한 플랫폼 기본 테마를 상속합니다. <activity>앱 매니페스트의 수준.

단일 앱 테마를 설정하면<application>레벨, 다음BrightcoveCaptionPropertiesActivity이 응용 프로그램 수준 테마의 속성을 상속합니다. 일부 테마의 경우 이로 인해 활동이 이상하게 스타일이 지정되거나 읽기 어렵게 보일 수 있습니다.

이 경우 다음을 지정해야합니다. BrightcoveCaptionPropertiesActivity자신의 매니페스트에서 다음과 같이 테마를 적용하십시오.

<activity
android:name="com.brightcove.player.captioning.BrightcoveCaptionPropertiesActivity"
android:theme="@style/MyCustomCaptionSettingsTheme"/>

기본 캡션 설정

동영상에서 여러 언어 캡션을 사용하는 경우 재생이 시작될 때 프로그래밍 방식으로 기본 언어를 설정할 수 있습니다. 코드는 다음과 비슷해야합니다.

brightcoveVideoView.getEventEmitter().once(EventType.CAPTIONS_LANGUAGES, new EventListener() {
  @Override
  public void processEvent(Event event) {
    brightcoveVideoView.setClosedCaptioningEnabled(true);
    brightcoveVideoView.setSubtitleLocale("fr");
  }
});

인 매니페스트 캡션 사용

기본적으로 Android용 Native SDK로 빌드된 플레이어는 사이드카 캡션을 사용합니다. 이러한 캡션은 Playback API 응답의text_tracks객체에서 찾을 수 있습니다.

플레이어가 인매니페스트 캡션을 사용하도록 구성하려면 Video 객체에서CAPTION_SOURCES프로퍼티를 제거해야 합니다.

if (video.getProperties().get(Video.Fields.CAPTION_SOURCES) != null) {
    video.getProperties().remove(Video.Fields.CAPTION_SOURCES);
}

최고 비트 전송률 설정

플레이어에서 비트 전송률 선택기를 구현하는 데 도움이되도록 다음 코드를 사용하여 최고 비트 전송률을 설정할 수 있습니다.

((ExoPlayerVideoDisplayComponent) videoView.getVideoDisplay()).setPeakBitrate(bitRate);

재생 속도 설정

ExoPlayer는 Android 장치에서 재생되는 비디오의 재생 속도 조정을 지원합니다. 자세한 내용은 Google의 ExoPlayer로 가변 속도 재생문서.

다음 코드를 사용하여 재생 속도를 제어 할 수 있습니다.

eventEmitter.on(EventType.DID_PLAY, new EventListener() {
  @Override
  public void processEvent(Event event) {

    //Get instance of ExoPlayer2
    ExoPlayerVideoDisplayComponent displayComponent = (ExoPlayerVideoDisplayComponent) brightcoveVideoView.getVideoDisplay();
    ExoPlayer exoPlayer = displayComponent.getExoPlayer();

    //Set playback speed
    PlaybackParameters param = new PlaybackParameters(1.6f, 1.0f);
    exoPlayer.setPlaybackParameters(param);
  }
});

360° 비디오에 대한 VR 고글 모드 설정

360° 비디오를 재생할 때 사용자는 컨트롤 막대에서 Video 360 버튼을 선택하여 VR 고글 모드로 전환할 수 있습니다. 둘 중 하나를 사용하는 경우BrightcovePlayer또는BrightcovePlayerFragment그런 다음 VR 고글 모드가 활성화되면 화면 방향이 가로로 변경됩니다.

사용자 지정 활동을 사용하는 경우 다음을 추가해야합니다.

brightcoveVideoView.getEventEmitter().on(EventType.CHANGE_ORIENTATION, new EventListener() {
  @Override
  public void processEvent(Event event) {
    int orientation = event.getIntegerProperty(Event.REQUESTED_ORIENTATION);
    setRequestedOrientation(orientation);
  }
});

비디오 정지 영상 표시 / 숨기기

Video Cloud 라이브러리에서 비디오를 검색 할 때 기본 동작은 재생이 시작될 때까지 비디오 정지 이미지를 표시하는 것입니다.

비디오 정지 이미지 표시

당신은 방출하여 언제든지 비디오를 정지시킬 수 있습니다SET_VIDEO_STILL이벤트VIDEO_STILL속성을 동영상 스틸의 URI로 설정합니다.

비디오 정지 이미지 숨기기

비디오를 자동 재생하는 경우 비디오 정지 이미지를 숨길 수 있습니다. 이렇게하려면SET_VIDEO_STILL다음과 같이 기본 동작을 방지합니다.

brightcoveVideoView.getEventEmitter().on(EventType.SET_VIDEO_STILL, new EventListener() {
  @Override
  public void processEvent(Event event) {
    event.preventDefault();
    event.stopPropagation();
  }
});

플레이어 컨트롤 표시

기본적으로 플레이어 컨트롤은 몇 초 후에 사라집니다. 사용자는 비디오를 탭하여 컨트롤을 표시 할 수 있습니다.

사용자가 비디오를 탭할 때까지 플레이어 컨트롤이 계속 표시되도록하려면 다음과 같이 자동 숨기기 기능을 비활성화 할 수 있습니다. (필요한 코드가 강조 표시됨)

public class MainActivity extends BrightcovePlayer {
  private BrightcoveMediaController controller;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);
    brightcoveVideoView = (BrightcoveExoPlayerVideoView) findViewById(R.id.brightcove_video_view);

    controller = new BrightcoveMediaController(brightcoveVideoView);
    controller.setShowHideTimeout(0);

    super.onCreate(savedInstanceState);

비디오 중간에 재생 시작

때로는 비디오 중간에서 재생을 시작해야 할 수도 있습니다. 이를 위해 전화 할 수 있습니다. BrightCoveVideoView.seekTo()재생을 시작하기 전에.

catalog.findVideoByID(getString(R.string.videoId), new VideoListener() {
  @Override
  public void onVideo(Video video) {
    Log.v(TAG, "onVideo: video = " + video);

    brightcoveVideoView.getEventEmitter().on(EventType.DID_SET_VIDEO, new EventListener() {
    @Override
      public void processEvent(Event event) {
      brightcoveVideoView.seekTo(60000);
      brightcoveVideoView.start();
      }
    });
  brightcoveVideoView.add(video);
  brightcoveVideoView.pause();
  }
});

동영상 교체

이 예는 플레이어에서 비디오를 교체하는 한 가지 방법을 보여줍니다.

단일 비디오 사용

이후clear()메서드는 현재 동영상을 언로드 할 때 비동기식이므로 플레이어에 새 동영상을 추가하기 전에 기다려야합니다. 두 가지 옵션이 있습니다.

재생 목록 사용

재생 목록으로 작업하는 경우clear()메서드는 재생 목록의 모든 요소를 제거합니다. 그래서, 당신은 얻을 수 있습니다IndexOutOfBounds재생 목록의 첫 번째 동영상으로 이동하려고 할 때 예외입니다.

대신 다음과 같이 시도 할 수 있습니다.

brightcoveVideoView.pause();
brightcoveVideoView.stopPlayback();
brightcoveVideoView.setCurrentIndex(0);

재생 목록의 비디오 간 전환

재생 목록을 사용하는 경우 다음 코드를 사용하여 재생 목록의 동영상간에 전환 할 수 있습니다.

private void setupControls(List<Video> videos) {
  previousVideoButton = (Button) findViewById(R.id.previous_video_button);
  nextVideoButton = (Button) findViewById(R.id.next_video_button);

  if (videos != null) {
    previousVideoButton.setEnabled(false);
    previousVideoButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
    int index = brightcoveVideoView.getCurrentIndex();
    int size = brightcoveVideoView.getList().size();
    previousVideoButton.setEnabled(index > 1);
    nextVideoButton.setEnabled((index + 1) < size);

    if (index > 0) {
    brightcoveVideoView.setCurrentIndex(index - 1);
    }
  }
});

nextVideoButton.setEnabled(videos.size() > 1);
nextVideoButton.setOnClickListener(new View.OnClickListener() {
  public void onClick(View view) {
    int index = brightcoveVideoView.getCurrentIndex();
    int size = brightcoveVideoView.getList().size();
    previousVideoButton.setEnabled(index >= 0);
    nextVideoButton.setEnabled((index + 2) < size);

    if ((index + 1) < size) {
    	brightcoveVideoView.setCurrentIndex(index + 1);
    }
  }
});
}
}