遷移到第 2 層框架

在本主題中,您將學習如何使用 Exoplayer 2 架構搭配適用於 Android 的布萊特灣原生播放程式 SDK。

概覽

谷歌的 Exoplayer 是一個開源的,適用於 Android 應用程序級的媒體播放器。Brightcove利用ExoPlayer來利用其提供的優勢。有關升級到ExoPlayer的好處的更多信息,請參見帶有ExoPlayer 2的Brightcove本機SDK博客文章。

了解如何針對以下項目類型進行遷移:

請參閱ExoPlayer示例應用程序有關整合ExoPlayer 2框架集成到您的項目中。

新項目

請按照以下步驟將ExoPlayer 2添加到新的Android項目中:

  1. 在您的構建 .gradle 文件中,添加以下依賴項:
    dependencies {
      implementation "com.brightcove.player:exoplayer2:${anpVersion}"
    }
  2. 設置選transitive項,true告訴 gradle 自動包含其他依賴項,如離線播放插件。如果您使用的是小於 5 的 gradle 版本,則默認情況下,傳遞依賴關係處於關閉狀態。因此,您將需要添加以下語句:
    dependencies {
      implementation "com.brightcove.player:exoplayer2:${anpVersion}" {transitive = true}
    }
  3. 如果您使用的是 SDK 版本的環境變量,請打開 gradle.屬性文件,並為 Android 的本地 SDK 設置當前版本值。它看起來應該類似於:
    anpVersion=6.5.0

現有的ExoPlayer 1項目

請按照以下步驟更新現有的ExoPlayer 1項目以使用ExoPlayer 2框架:

  1. 在你的constants.gradle文件,更新Android Build Tools版本:
    buildToolsVersion "28.0.2"
    
  2. 在你的build.gradle文件,更新Android支持庫:
    implementation 'com.android.support:appcompat-v7:${APPCOMPAT_V7_VERSION}'
    implementation 'com.android.support:support-v4:${SUPPORT_V4_VERSION}'
    implementation 'com.android.support:recyclerview-v7:${SUPPORT_V4_VERSION}'
    implementation 'com.android.support:support-vector-drawable:${SUPPORT_V4_VERSION}'
    

    常數的當前值可以在constants.gradle文件。

  3. 在你的build.gradle文件,添加Google Maven存儲庫:
    maven {
      url 'https://maven.google.com'
    }
    
  4. 如果您的項目通過Google IMA使用廣告,請更新Google Play服務廣告:
    implementation 'com.google.android.gms:play-services-ads:'+PLAY_SERVICES_VERSION
    
  5. 在你的build.gradle文件,您以前在其中將Brightcove ExoPlayer庫作為依賴項導入其中:
    dependencies {
      implementation "com.brightcove.player:exoplayer:${anpVersion}"
    }
    

    更改依賴項的名稱:

    dependencies {
      implementation "com.brightcove.player:exoplayer2:${anpVersion}"
    }
    

    Brightcove SDK版本的當前值(anpVersion)可以在gradle.properties文件。

  6. 設置選transitive項,true告訴 gradle 自動包含其他依賴項,如離線播放插件。如果您使用的是小於 5 的 gradle 版本,則默認情況下,傳遞依賴關係處於關閉狀態。所以,你需要添加以下內容:
    dependencies {
    	implementation "com.brightcove.player:exoplayer2:${anpVersion}" {transitive = true}
    }
  7. 如果您使用的是 SDK 版本的環境變量,請打開 gradle.屬性文件,並為 Android 的本地 SDK 設置當前版本值。它看起來應該類似於:
    anpVersion=6.5.0

    不需要額外的代碼即可將ExoPlayer 2集成到您的項目中。

現有的MediaPlayer項目

請按照以下步驟更新現有的MediaPlayer項目以使用ExoPlayer 2框架:

  1. 在您的構建 .gradle 文件中,添加以下依賴項:
    dependencies {
      implementation "com.brightcove.player:exoplayer2:${anpVersion}"
    }
  2. 設置選transitive項,true告訴 gradle 自動包含其他依賴項,如離線播放插件。如果您使用的是小於 5 的 gradle 版本,則默認情況下,傳遞依賴關係處於關閉狀態。所以,你需要添加以下內容:
    dependencies {
      implementation "com.brightcove.player:exoplayer2:${anpVersion}" {transitive = true}
    }
  3. 如果您使用的是 SDK 版本的環境變量,請打開 gradle.屬性文件,並為 Android 的本地 SDK 設置當前版本值。它看起來應該類似於:
    anpVersion=6.5.0
  4. 在您的應用中,使用BrightcoveExoPlayerVideoView而不是BrightcoveVideoView,它使用Android Media Player。

重大變化

對適用於Android的Brightcove本機SDK的以下更改將對ExoPlayer 2進行重大更改。Brightcove本機SDK已棄用了ExoPlayer 1。

ExoPlayerVideoDisplayComponent內部偵聽器

ExoPlayerVideoDisplayComponent類允許您設置偵聽器以獲取ExoPlayer組件的狀態。以下是一些偵聽器的列表:

設置監聽器 接收有關的狀態信息
setDebugListener 入侵劑
setCaptionListener 註解監聽器
setMetadataListener 元調節劑
setInternalErrorListener 內部錯誤偵聽程式

以下是使用ExoPlayer 2的建議。

入侵劑

為了InfoListener界面,進行了以下更改:

  • onAvailableRangeChanged方法已刪除
  • onLoadStarted方法有一個額外的length參數

範例:使用ExoPlayer 2的ExoPlayerVideoDisplayComponent

public interface InfoListener {
void onVideoFormatEnabled(Format format, int trigger, long mediaTimeMs);
void onAudioFormatEnabled(Format format, int trigger, long mediaTimeMs);
void onDroppedFrames(int count, long elapsed);
void onBandwidthSample(int elapsedMs, long bytes, long bitrateEstimate);
void onLoadStarted(int sourceId, int type, int trigger, Format format,
				long mediaStartTimeMs, long mediaEndTimeMs);
void onLoadCompleted(int sourceId, long bytesLoaded, int type, int trigger, Format format,
				long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs);
void onDecoderInitialized(String decoderName, long initializedTimestampMs,
				long initializationDurationMs);
}

註解監聽器

CaptionListener接口保持不變。

範例:外部圖層視訊顯示使用外部圖層 v2 的元件

public interface CaptionListener {
void onCues(List<Cue> cues);
}

元調節劑

MetadataListener接口是ExoPlayer v2引入的。以前的用途Id3MetadataListener現在已棄用。

範例:外部圖層視訊顯示使用外部圖層 v2 的元件

public interface MetadataListener {
void onMetadata(Metadata metadata);
}

隨著新MetadataListener您會收到一個Metadadata中的對象onMetadata打回來。棄用Id3MetadataListener,您收到了一個Id3Frame對象列表。使用新的偵聽器,您仍然可以獲得列表Id3Frame對像如下圖:

exoPlayerVideoDisplayComponent.setMetadataListener(new ExoPlayerVideoDisplayComponent.MetadataListener() {
@Override
public void onMetadata(Metadata metadata) {
 for(int i = 0; i < metadata.length(); i++) {
		 Metadata.Entry entry = metadata.get(i);
		 if (entry instanceof Id3Frame) {
				 Id3Frame id3Frame = (Id3Frame) entry;
		 }
 }
}
});

內部錯誤偵聽程式

InternalErrorListener界面有很多變化。請檢查以下代碼以進行比較:

外部圖層視訊顯示使用外部圖層 v2 的元件

public interface InternalErrorListener {
void onPlayerError(Exception e);
void onAudioTrackUnderrun(int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs);
void onLoadError(int sourceId, IOException e);
void onDrmSessionManagerError(Exception e);
}

使用ExoPlayer v1的ExoPlayerVideoDisplayComponent(不推薦使用

public interface InternalErrorListener {
void onRendererInitializationError(Exception e);
void onAudioTrackInitializationError(AudioTrack.InitializationException e);
void onAudioTrackWriteError(AudioTrack.WriteException e);
void onAudioTrackUnderrun(int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs);
void onDecoderInitializationError(MediaCodecTrackRenderer.DecoderInitializationException e);
void onCryptoError(MediaCodec.CryptoException e);
void onLoadError(int sourceId, IOException e);
void onDrmSessionManagerError(Exception e);
}

使用ExoPlayer 2時,您遇到的異常類型onPlayerError(Exception e)com.google.android.exoplayer2.ExoPlaybackException,但將來可能會改變。

通過使用com.google.android.exoplayer2.ExoPlaybackException,您可以獲取以下異常類型:

  • ExoPlaybackException.TYPE_SOURCE
  • ExoPlaybackException.TYPE_RENDERER
  • ExoPlaybackException.TYPE_UNEXPECTED

您還可以通過獲取Throwable與對象ExoPlaybackException.getSourceException()

離線播放支持

如果您的項目正在使用MediaDownloadable.setConfigurationBundle(Bundle)指定下載首選項(例如視頻比特率)的方法,然後請按以下方式更新代碼:

舊格式(不建議使用)

com.google.android.exoplayer.MediaFormat

新格式

com.brightcove.player.model.MediaFormat

舊版媒體API類

舊版Media API中已棄用的類com.brightcove.player.media package,已從Android的Brightcove本機SDK中刪除。

如果您使用的是Media類,則需要遷移並開始使用com.brightcove.player.edge.Catalog類。

以下課程從com.brightcove.player.mediacom.brightcove.player.model

  • DeliveryType.java
  • CaptionType.java
  • ErrorFields.java
  • VideoFields.java

其他資源

有關使用ExoPlayer 2框架的更多信息,請參見以下文檔: