Migración a ExoPlayer 2 Framework

En este tema, aprenderá a utilizar el marco ExoPlayer 2 con Brightcove Native Player SDK para Android.

Resumen

ExoPlayer de Google es un reproductor multimedia de código abierto a nivel de aplicación para Android. Brightcove aprovecha ExoPlayer para aprovechar los beneficios que ofrece. Para obtener más información sobre los beneficios de actualizar a ExoPlayer, consulte la SDK nativo de Brightcove con ExoPlayer 2 entrada en el blog.

Aprenda a migrar para los siguientes tipos de proyectos:

Referirse a Aplicaciones de muestra de ExoPlayer para obtener orientación adicional sobre la integración del ExoPlayer 2 framework en tu proyecto.

Nuevo proyecto

Siga estos pasos para agregar ExoPlayer 2 a un nuevo proyecto de Android:

  1. En tus build.gradle archivo, agregue la siguiente dependencia:
    dependencies {
      implementation "com.brightcove.player:exoplayer2:${anpVersion}"
    }
  2. Establecer el transitive opción a true le dice a Gradle que incluya automáticamente otras dependencias, como el complemento de reproducción sin conexión. Si está utilizando una versión de Gradle menor que 5, el dependencias transitivas están desactivados de forma predeterminada. Por lo tanto, deberá agregar la siguiente declaración:
    dependencies {
      implementation "com.brightcove.player:exoplayer2:${anpVersion}" {transitive = true}
    }
  3. Si está utilizando una variable de entorno para la versión del SDK, abra el gradle.properties y establezca el valor de la versión actual del SDK nativo para Android. Debería ser similar a este:
    anpVersion=6.5.0

Proyecto ExoPlayer 1 existente

Siga estos pasos para actualizar un proyecto de ExoPlayer 1 existente para usar el marco de ExoPlayer 2:

  1. En tus constants.gradle archivo, actualice la versión de Android Build Tools:
    buildToolsVersion "28.0.2"
    
  2. En tus build.gradle archivo, actualice las bibliotecas de soporte de 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}'
    

    Los valores actuales de las constantes se pueden encontrar en la constants.gradle expediente.

  3. En tus build.gradle archivo, agregue el repositorio de Google Maven:
    maven {
      url 'https://maven.google.com'
    }
    
  4. Si su proyecto utiliza publicidad con Google IMA, actualice Google Play Services Ads:
    implementation 'com.google.android.gms:play-services-ads:'+PLAY_SERVICES_VERSION
    
  5. En tus build.gradle archivo, donde previamente importó la biblioteca Brightcove ExoPlayer como una dependencia como esta:
    dependencies {
      implementation "com.brightcove.player:exoplayer:${anpVersion}"
    }
    

    Cambie el nombre de la dependencia:

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

    El valor actual de la versión Brightcove SDK (anpVersion ) se puede encontrar en el gradle.properties expediente.

  6. Establecer el transitive opción a true le dice a Gradle que incluya automáticamente otras dependencias, como el complemento de reproducción sin conexión. Si está utilizando una versión de Gradle menor que 5, el dependencias transitivas están desactivados de forma predeterminada. Por lo tanto, deberá agregar lo siguiente:
    dependencies {
    	implementation "com.brightcove.player:exoplayer2:${anpVersion}" {transitive = true}
    }
  7. Si está utilizando una variable de entorno para la versión del SDK, abra el gradle.properties y establezca el valor de la versión actual del SDK nativo para Android. Debería ser similar a este:
    anpVersion=6.5.0

    No debería requerirse codificación adicional para integrar ExoPlayer 2 en su proyecto.

Proyecto de MediaPlayer existente

Siga estos pasos para actualizar un proyecto de MediaPlayer existente para usar el marco ExoPlayer 2:

  1. En tus build.gradle archivo, agregue la siguiente dependencia:
    dependencies {
      implementation "com.brightcove.player:exoplayer2:${anpVersion}"
    }
  2. Establecer el transitive opción a true le dice a Gradle que incluya automáticamente otras dependencias, como el complemento de reproducción sin conexión. Si está utilizando una versión de Gradle menor que 5, el dependencias transitivas están desactivados de forma predeterminada. Por lo tanto, deberá agregar lo siguiente:
    dependencies {
      implementation "com.brightcove.player:exoplayer2:${anpVersion}" {transitive = true}
    }
  3. Si está utilizando una variable de entorno para la versión del SDK, abra el gradle.properties y establezca el valor de la versión actual del SDK nativo para Android. Debería ser similar a este:
    anpVersion=6.5.0
  4. En su aplicación, use el BrightcoveExoPlayerVideoView en vez de BrightcoveVideoView , que utiliza Android Media Player.

Rompiendo cambios

Los siguientes cambios en Brightcove Native SDK para Android son cambios importantes con ExoPlayer 2. El uso de ExoPlayer 1 ha quedado obsoleto con Brightcove Native SDK.

Oyentes internos de ExoPlayerVideoDisplayComponent

La ExoPlayerVideoDisplayComponent class le permite configurar oyentes para obtener el estado de los componentes de ExoPlayer. A continuación se muestra una lista de algunos de los oyentes:

Establecer el oyente Recibir información de estado sobre
setDebugListener InfoListener
setCaptionListener CaptionListener
setMetadataListener MetadataListener
setInternalErrorListener InternalErrorListener

A continuación se presentan recomendaciones para usar ExoPlayer 2.

InfoListener

Para el InfoListener interfaz, se realizaron los siguientes cambios:

  • La onAvailableRangeChanged el método fue eliminado
  • La onLoadStarted El método tiene un adicional length parámetro

Ejemplo: ExoPlayerVideoDisplayComponent usando ExoPlayer 2

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

La CaptionListener la interfaz no ha cambiado.

Ejemplo: ExoPlayerVideoDisplayComponent usando ExoPlayer v2

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

MetadataListener

La MetadataListener La interfaz se introdujo con ExoPlayer v2. El uso anterior del Id3MetadataListener ahora está en desuso.

Ejemplo: ExoPlayerVideoDisplayComponent usando ExoPlayer v2

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

Con el nuevo MetadataListener recibirás un Metadadata objeto en el onMetadata llamar de vuelta. Con el desaprobado Id3MetadataListener , recibió una lista de objetos Id3Frame. Con el nuevo oyente, aún puede obtener una lista de Id3Frame objetos como se muestra a continuación:

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

La InternalErrorListener La interfaz tiene muchos cambios. Por favor, consulte el código a continuación para comparar:

ExoPlayerVideoDisplayComponent usando ExoPlayer 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);
}

ExoPlayerVideoDisplayComponent usando ExoPlayer v1 (obsoleto)

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);
}

Al usar ExoPlayer 2, el tipo de excepción que obtiene onPlayerError(Exception e) es com.google.android.exoplayer2.ExoPlaybackException , pero esto puede cambiar en el futuro.

Al usar com.google.android.exoplayer2.ExoPlaybackException, puede obtener los siguientes tipos de excepción:

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

También puede recuperar la causa del error obteniendo el Throwable objeto con ExoPlaybackException.getSourceException().

Soporte de reproducción sin conexión

Si su proyecto utiliza el MediaDownloadable.setConfigurationBundle(Bundle) método para especificar las preferencias de descarga, como la tasa de bits de video, luego actualice su código de la siguiente manera:

Formato antiguo (obsoleto)

com.google.android.exoplayer.MediaFormat

Nuevo formato

com.brightcove.player.model.MediaFormat

Clases de API de medios heredados

Las clases de API de medios heredadas en desuso, en el com.brightcove.player.media package , se eliminaron del SDK nativo de Brightcove para Android.

Si estaba usando las clases de medios, debe migrar y comenzar a usar las com.brightcove.player.edge.Catalog clase.

Las siguientes clases se movieron de com.brightcove.player.media a com.brightcove.player.model:

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

Recursos adicionales

Para obtener más información sobre el uso del marco ExoPlayer 2, consulte los siguientes documentos: