목차
분석 도구
DRM (콘텐츠 보안)
라이브 스트림
재생
재생목록
Android TV 용 컨트롤 사용자 지정
장치 또는 Android TV의 컨트롤 막대에 버튼을 추가 할 수 있습니다. 아래 단계는 Android TV의 컨트롤 막대에 전체 화면 버튼을 추가하는 과정을 안내합니다.
- 열기맞춤형 컨트롤샘플 앱. 이것을 시작점으로 사용하겠습니다. 샘플 앱 검토읽어보기플레이어 컨트롤 사용자 지정에 대한 자세한 내용은 파일을 참조하십시오.
- 열기 res / layout / land / my_media_controller.xml Android Studio의 파일.
- 복사
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"/>
- 열기 res / layout / my_tv_media_controller.xml Android Studio의 파일.
- 복사 한 붙여 넣기
Button
요소를이 레이아웃 파일에 추가합니다. 요소의 위치에 따라 컨트롤 막대에서의 위치가 결정됩니다. - 맨 위로 스크롤 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">
- 열기 res / values / styles.xml Android Studio의 파일.
- 로
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>
- 그게 다야 Android TV 실제 또는 가상 장치에서 샘플 앱을 실행합니다. 컨트롤 막대에 전체 화면 버튼이 표시되어야합니다.
전체 화면으로보기
코드를 사용하여 전체 화면 모드를 관리 할 수 있습니다.
-
다음은 전체 화면 모드를 설정하는 코드입니다.
brightcoveVideoView.getEventEmitter().emit(EventType.ENTER_FULL_SCREEN);
-
전체 화면 모드를 종료하는 코드는 다음과 같습니다.
brightcoveVideoView.getEventEmitter().emit(EventType.EXIT_FULL_SCREEN);
실시간 스트림 기간 가져 오기
실시간 스트림의 길이를 확인하려면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
메서드를 제공합니다.
자세한 내용은 다음을 참조하십시오.
- Brightcove PlayerBandwidthMeter 클래스
- 우편: 간소화된 대역폭 측정기 사용
- ExoPlayer BandwidthMeter 인터페이스
- ExoPlayer BandwidthMeter.EventListener 인터페이스
예를 들면 다음과 같습니다.
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 애널리틱스를 앱과 통합하려면 다음 단계를 따르세요.
- 프로젝트에 Google 서비스 플러그인을 추가합니다.
- Google 구성 파일을 가져 와서 프로젝트에 추가하십시오.
- 응용 프로그램을 확장하고 응용 프로그램 추적기를 반환하는 도우미 메서드를 제공합니다. 다음과 유사해야합니다. google-services AnalyticsApplication .
- BrightcovePlayer를 확장하는 별도의 클래스에서 공유 추적기 인스턴스를 가져옵니다.
// Obtain the shared Tracker instance AnalyticsApplication application = (AnalyticsApplication) getApplication(); tracker = application.getDefaultTracker();
- 적절한 방법을 재정 의하여 화면 변경 사항을 기록하거나 추적을 위해 사용자 지정 이벤트를 보냅니다.
자세한 단계는 Google 문서를 참조하십시오. Android 앱에 분석 추가 .
원격 비디오 및 포스터 이미지로드
Brightcove Player 고객 만 원격 서버의 비디오 자산을 사용합니다. 다음 단계에 따라 원격 서버에있는 비디오 및 포스터 이미지를로드하십시오.
-
에서
onCreate()
방법은 비디오보기를 정의한 후 원격 서버에서 호스팅되는 비디오에서 비디오 개체를 만듭니다. 가지고 있는 비디오 유형과DeliveryType
일치하도록 를 설정합니다.Video video = Video.createVideo("https://sdks.support.brightcove.com/assets/videos/hls/greatblueheron/greatblueheron.m3u8", DeliveryType.HLS);
-
비디오 재생이 시작되기 전에 포스터 이미지로 사용할 원격 이미지를 로드합니다.
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(); }
-
보기에 비디오를 추가하고 비디오 재생을 시작합니다.
brightcoveVideoView.add(video); brightcoveVideoView.start();
-
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 매개 변수를 사용합니다.
쿼리 매개 변수는 다음과 같이 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
,보기가 전체 화면을 덮을 것입니다. 컨트롤이보기 하단에 나타나면 비디오는보기 중간에 유지됩니다.
이를 수행 할 수있는 두 가지 방법이 있습니다. 첫 번째 접근 방식은 다음과 같습니다.
- 열기 main / res / values / style.xml프로젝트 파일.
-
다음 XML 코드를 추가하십시오.
<style name="BrightcoveControlBar" parent="BrightcoveControlBarDefault"> <item name="brightcove_align">false</item> </style>
또는 내에서 코드를 사용할 수 있습니다. MainActivity.java다음과 같이 파일 :
- 열기 MainActivity.java프로젝트 파일.
-
다음과 같이 이벤트 이미 터를 가져온 후 :
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)
특성 .
이 속성을 사용하려면 다음 단계를 수행하십시오.
-
시작점은 IMA 샘플 앱 .
-
찾기
private void setupGoogleIMA()
함수. -
함수의 마지막 코드 줄 앞에 스 니펫 코드 블록을 추가합니다.
ImaSdkSettings imaSdkSettings = sdkFactory.createImaSdkSettings(); AdsRenderingSettings adsRenderingSettings = ImaSdkFactory.getInstance().createAdsRenderingSettings(); adsRenderingSettings.setEnablePreloading(true);
-
추가
adsRenderingSettings
마지막 코드 줄에 매개 변수를 추가합니다.googleIMAComponent = new GoogleIMAComponent(brightcoveVideoView, eventEmitter, true, adsRenderingSettings);
광고 없이 검색
당신은 사용할 수 있습니다adsDisabled
재산VideoPlaybackController
비디오를 검색하는 동안 광고 재생을 비활성화합니다.
이 기능을 사용하려면 다음 단계를 따르십시오.
-
얻기
VideoPlaybackController
인스턴스에서BrightcoveVideoView
.VideoPlaybackController playbackController = brightcoveVideoView.getPlaybackController();
-
광고 재생을 비활성화합니다.
playbackController.setAdsDisabled(true);
- 현재 비디오에서 원하는 시간 위치를 찾습니다.
-
정상적인 광고 동작을 재개합니다.
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 인스턴스를 만드는 데 사용되는 개체입니다. 개발자는 다음과 같이 버퍼 크기를 제어 할 수 있습니다.
-
그만큼
LoadControlConfig
과AllocatorConfig
클래스는 빌더 패턴을 따릅니다. 두 클래스에서 설정할 수있는 값은 생성자에서 설정할 수있는 값을 반영합니다.AllocatorConfig allocatorConfig = new AllocatorConfig.Builder().build(); LoadControlConfig loadControlConfig = new LoadControlConfig.Builder() .setAllocatorConfig(allocatorConfig) .setMinBufferMs(X) .setMaxBufferMs(Y) .build();
-
빌더에 설정되지 않은 값은 기본값을 사용합니다. 사용
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()
메서드는 현재 동영상을 언로드 할 때 비동기식이므로 플레이어에 새 동영상을 추가하기 전에 기다려야합니다. 두 가지 옵션이 있습니다.
-
Video Cloud에서 비디오를 가져 오는 시간이 재생 목록을 업데이트하는 시간을 줄여야하므로 다음과 같이 시도해 볼 수 있습니다.
brightcoveVideoView.clear(); catalog.findVideoByID("123456789", new VideoListener() { @Override public void onVideo(final Video video) { brightcoveVideoView.add(video); brightcoveVideoView.start(); } });
-
또 다른 방법은 이벤트를 기다리는 것입니다.
catalog.findVideoByID("", new VideoListener() { @Override public void onVideo(final Video video) { eventEmitter.once(EventType.DID_CHANGE_LIST, new EventListener() { @Override public void processEvent(Event event) { brightcoveVideoView.add(video); brightcoveVideoView.start(); } }); brightcoveVideoView.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);
}
}
});
}
}