Complemento Cast para Native SDK para Android

En este tema, aprenderá cómo transmitir sus videos a un televisor conectado a Chromecast, utilizando el complemento Cast para Brightcove Native SDK para Android.

Resumen

Con Google Cast tecnología, puede iniciar y controlar el contenido de video transmitido desde sus dispositivos móviles a televisores de alta definición y sistemas de audio en el hogar. Desde su aplicación, toque el botón Transmitir para transmitir su contenido en una pantalla grande.

Para crear una aplicación Cast, necesita los siguientes componentes:

  • A solicitud de remitente - Esto reside en su dispositivo móvil y detecta dispositivos receptores, establece una conexión segura y refleja su contenido. La aplicación del remitente es el reproductor local que se utiliza para transmitir contenido a la aplicación del receptor en su dispositivo Chromecast. Después de enviar contenido a la aplicación del receptor, puede pensar en él como un control remoto para Chromecast.

    La aplicación de remitente la proporciona el complemento Cast para Brightcove Native SDK para Android. Lo aprenderás en este tema.

  • A aplicación del receptor - Esta aplicación se ejecuta en el dispositivo Chromecast. Se puede considerar como una aplicación HTML de una sola página con elementos CSS y JavaScript.

    Para realizar la prueba, siga estos pasos:

    1. Empezar con Receptor de transmisión de muestra de Google
    2. Revisar Aplicaciones de Google Cast documentación

    Para uso en producción, este documento ilustrará cómo utilizar Brightcove Receiver v2.0.0.

Versión de SDK compatible

Para usar el complemento Cast con el nuevo Brightcove Receiver v2.0, debe usar Brightcove Native SDK para Android versión 6.16.0 y superior.

Comprender el complemento Cast

El complemento Cast está construido sobre el nueva extensión ExoPlayer Cast y el marco de transmisión de servicios de Google Play. Después de agregar la dependencia del complemento de transmisión, gradle extraerá la dependencia de Play Services Cast Framework, la dependencia de ExoPlayer Cast Extension junto con otras dependencias necesarias.

El complemento Cast se ha rediseñado para minimizar su esfuerzo al integrarse con Video Cloud. Al utilizar Video Cloud, el BrightcoveCastMediaManager La clase recopila información de la respuesta de Video Cloud, como Brightcove Video y Source objetos, cada vez que el EventType.SET_SOURCE se emite el evento. Esta información se almacena en caché y está lista para usar cuando el usuario selecciona reproducir para poner el video en cola.

Integrando el complemento Cast

Hay dos formas de integrar su aplicación con el complemento Native SDK para Android Cast. Puede integrarse con Brightcove Cast Receiver v2.0 o con Google Cast Demo Receiver.

Para cualquier integración, debe agregar esta dependencia a su proyecto de aplicación:

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

Uso del receptor Brightcove Cast v2.0

Esta integración está destinada a los clientes de Brightcove que utilizan las API de Brightcove para entregar su contenido.

Para obtener una muestra de código completa, consulte la BasicCastBrightcoveReceiverSampleApp.

Uso del receptor de demostración de Google Cast

Esta integración está destinada a los clientes de Brightcove que son nuevos en la fundición.

Para obtener una muestra de código completa, consulte la BasicCastGoogleReceiverSampleApp.

Especificación de su propio ID de aplicación de receptor de transmisión

La BasicCastGoogleReceiverSampleApp establece un ID de aplicación del receptor de demostración de Google, que puede ser útil para comenzar y realizar pruebas, pero no para la producción.

Para anular este valor con su aplicación Cast Receiver, defina el siguiente valor de cadena en la aplicación de muestra strings.xml expediente:

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

El componente GoogleCast de Brightcove

La GoogleCastComponent class es la clase principal del complemento Brightcove Cast. Crea una instancia de ExoPlayer CastPlayer y establece sus oyentes. Expone algunos métodos esenciales para cargar un video o agregarlo a la cola. La GoogleCastComponent class también agrega varios detectores de eventos de Brightcove para manejar eventos de ciclo de vida de actividad y fragmentos, así como otros detectores de eventos que puede usar para emitir información multimedia para cargar un video en su dispositivo Chromecast.

La GoogleCastComponent ahora usa un patrón Builder. En las versiones del SDK nativo para Android anteriores a la v6.16.0, era necesario crear una instancia del componente y pasar el Context y EventEmitter hacia GoogleCastComponent constructor. Luego, establecería las opciones del componente en una serie de llamadas de método separadas.

A partir del SDK nativo para Android v6.16.0, use el patrón Builder para crear una instancia del GoogleCastComponent y establezca sus opciones, todo dentro de una única cadena de llamadas al método Builder.

CustomData

Como con el GoogleCastComponent , la CustomData La clase usa un patrón Builder para instanciar el objeto y agregarle propiedades. Si bien el receptor Brightcove puede utilizar CustomData para recuperar videos de su catálogo de Brightcove, no es necesario enviar un CustomData objeto, como para enviar un recurso remoto. También es importante tener en cuenta que cuando se utiliza el receptor de demostración de Google, el uso de CustomData no es apoyado. Para los propósitos de esta discusión, nos centraremos en CustomData enviado al receptor utilizado para recuperar los datos de vídeo del catálogo de Brightcove.

¿Qué es CustomData?

CustomData es un objeto JSON contenido en el MediaInfo objeto. Su uso previsto es con la aplicación Brightcove Cast Receiver v2.0.

CustomData con Brightcove Receiver y Catalog Data

Al integrarse con Brightcove Receiver, el CustomData El objeto JSON tomará esta forma:

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

La CustomData El ejemplo de objeto anterior contiene todos los elementos de datos necesarios para transmitir un video desde Brightcove Receiver. Estos datos son los mismos independientemente del cifrado, es decir, no hay una estructura adicional necesaria para la URL de la licencia en el caso de los videos DRM.

También puede encontrar un ejemplo de CustomData objeto en el BrightcoveCastBrightcoveReceiverSampleApp.

CustomData con el receptor de demostración de Google

Como se indicó anteriormente, CustomData no es compatible con el receptor de demostración de Google.

BrightcoveCastMediaManager

Es posible ampliar el BrightcoveCastMediaManager , como se muestra arriba, para anular sus métodos o implementar los suyos propios. Para ver ejemplos de cómo extender la clase BrightcoveCastMediaManager, consulte lo siguiente:

  • Amplíe la sección BrightcoveCastMediaManager
  • BasicCastCustomRemoteVideoSampleApp

OpcionesProveedor

A continuación, debe especificar el OpcionesProveedor implementación para el marco de Google Cast. La OptionsProvider La interfaz ayuda a configurar varias opciones necesarias para inicializar el CastContext clase. Aquí es donde configurará el ID de la aplicación del receptor de transmisión. Para obtener más información sobre la integración de OptionsProvider , ver Google's Inicializar el contexto de transmisión documento.

El complemento Brightcove Cast incluye un DefaultOptionsProvider clase, donde el ID de la aplicación del receptor de transmisión se establece a través de una clave de cadena establecida en el strings.xml archivo de recursos. Para obtener más detalles y aprender cómo anularlo en su aplicación, consulte la Uso de su propia ID de aplicación del receptor Cast sección anterior.

Ya sea que use el DefaultOptionsProvider clase o la tuya OptionsProvider implementación, necesita establecer el OptionsProvider nombre de la clase de implementación en la aplicación AndroidManifest.xml archivo como metadatos de par clave-valor, como se muestra aquí:

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

Si usa el DefaultOptionsProvider clase, puede configurar el ExpandedControllerActivity para activar / desactivar la notificación de transmisión mediante la configuración de información de metadatos similar en su AndroidManifest.

Actividad del controlador ampliada

La ExpandedControllerActivity viene con la biblioteca de Google Cast y le permite controlar el video que se transmite en su dispositivo Chromecast. Esta clase proporciona cierta flexibilidad de personalización. Por ejemplo, hay cinco espacios disponibles para mostrar botones, donde el tercer espacio está reservado para el botón Reproducir no configurable. El resto de los botones se pueden configurar como otros botones predefinidos o como sus propios botones personalizados.

El complemento Brightcove Cast proporciona la subclase DefaultExpandedControllerActivity. Hemos habilitado los siguientes botones en el siguiente orden:

  • Subtítulos
  • Saltar anterior
  • Tocar
  • Omitir próximo
  • Alternar silencio

Además, la barra de búsqueda establece el mismo elemento de diseño predeterminado que se utiliza en el estándar. BrightcoveMediaController:

  • El Progreso Dibujable:
    R.drawable.default_scrubber_progress_horizontal
  • El pulgar dibujable:
    R.drawable.default_scrubber_thumb

Para saber cómo personalizar la barra de búsqueda, consulte la SeekBarColorsSampleApp.

Para configurar el DefaultExpandedControllerActivity o el tuyo ExpandedControllerActivity , configure los siguientes metadatos en su AndroidManifest.xml expediente:

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

Notificación de reparto

Cuando la Notificación de transmisión está habilitada, la notificación aparecerá cuando transmita un video y ponga su aplicación en segundo plano; por ejemplo, después de presionar la tecla de inicio.

<pPara habilitar la notificación de transmisión, configure los siguientes metadatos en su AndroidManifest.xml y proporcione el nombre de la actividad que se iniciará cuando se haga clic en la notificación:

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

Si no proporciona com.brightcove.cast.DefaultOptionsProvider.NOTIFICATION_TARGET_ACTIVITY_CLASS_NAME o si el valor tiene un nombre de actividad no válido, la notificación de transmisión se desactivará.

El botón Cast

El botón de transmisión le permite seleccionar un dispositivo Chromecast en la misma red que su dispositivo y le permite conectarse y crear una sesión. Para agregar el botón de transmisión a su aplicación, siga las instrucciones de Google Integrar elenco: Agregar un botón para transmitir documento.

El complemento Brightcove Cast proporciona un método de utilidad para configurar fácilmente el botón Cast. Esto es útil cuando solo desea agregar el botón Transmitir al menú Actividad / Fragmento. Consulte el siguiente código para obtener más detalles:

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

El mini controlador

El Mini Controlador es un Fragmento que se adjunta a su Actividad, generalmente ubicado en la parte inferior del diseño. El mini controlador le permite reproducir y pausar el video e indica cuándo se está reproduciendo un video en su dispositivo Chromecast. Cuando se hace clic en el minicontrolador, se inicia el controlador expandido.

Para habilitar el minicontrolador, agregue el siguiente código al diseño de su actividad.

<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" />

Para conocer las mejores prácticas con el minicontrolador, consulte la Lista de verificación de diseño: Mini controlador del remitente documento. Para obtener detalles sobre la implementación, consulte la Integrar elenco: Agregar mini controlador documento.

Temas avanzados

Escuchando la sesión de Cast

Si desea que su aplicación reaccione cuando la conexión de Cast comience o finalice, puede agregar el GoogleCastEventType.CAST_SESSION_STARTED o GoogleCastEventType.CAST_SESSION_ENDED oyentes de eventos como se muestra aquí:

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

Alternativamente, puede llamar GoogleCastComponent.isSessionAvailable() para comprobar si hay una sesión disponible.

Transmisión de un video

Para transmitir un video a Chromecast después de una conexión exitosa, puede usar EventEmitter y emitir la información de información multimedia o puede usar directamente el GoogleCastComponent métodos.

Si prefiere emitir la información multimedia, puede utilizar los siguientes eventos:

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

La siguiente tabla muestra las propiedades esperadas para cada evento:

Nombre del evento Propiedades
Clave Tipo de clase de valor
LOAD_MEDIA_INFO GoogleCastComponent.CAST_MEDIA_INFO
GoogleCastComponent.CAST_MEDIA_PLAY_POSITION
MediaInfo Entero
LOAD_MEDIA_QUEUE_ITEM GoogleCastComponent.CAST_MEDIA_QUEUE_ITEM MediaQueueItem
ADD_MEDIA_INFO GoogleCastComponent.CAST_MEDIA_INFO
GoogleCastComponent.CAST_MEDIA_PLAY_POSITION
MediaInfo Entero
ADD_MEDIA_QUEUE_ITEM GoogleCastComponent.CAST_MEDIA_QUEUE_ITEM MediaQueueItem

Alternativamente, puede utilizar lo siguiente GoogleCastComponent métodos:

  • 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 )

Cambiar los datos de MediaInfo predeterminados

De forma predeterminada, el complemento Cast recopila información sobre el objeto de fuente y video actual emitido por el EventType.SET_SOURCE event. Si desea cambiar o agregar información adicional, como agregar un objeto JSON personalizado a su MediaInfo que el receptor de la aplicación entienda, puede hacerlo sobrescribiendo el loadMediaInfo() y addMediaInfo() métodos de la BrightcoveCastMediaManager. Entonces tu BrightcoveCastMediaManager La subclase se pasa como un parámetro de constructor a la GoogleCastComponent clase.

Dentro de estos métodos, puede crear su MediaInfo objetos y emitir los eventos apropiados como se mostró anteriormente. Asegúrate de comprobar com.brightcove.cast.util.CastMediaUtil , ya que proporciona algunos métodos de utilidad para crear un MediaInfo de los objetos Video y Source.

Configuración de Cast MediaController

Para cambiar el diseño del controlador que aparece en Brightcove Video View cuando se inicia una sesión de Cast, siga estos pasos.

  1. Amplíe BrightcoveCastMediaManager
  2. Establecer MediaControllerConfig
  3. Sobrescribir la configuración de la barra de control

Amplíe BrightcoveCastMediaManager

Para cambiar el comportamiento predeterminado del BrightcoveCastMediaManager , cree una subclase y sobrescriba algunos métodos clave:

  • public void updateBrightcoveMediaController(boolean isRemote)

    Este método es llamado por el GoogleCastComponent cuando cambia la sesión; es decir, cuando la sesión ha comenzado o ha finalizado. Cuando la sesión ha comenzado, el isRemote el parámetro será true y el setupRemoteController se llama al método. De lo contrario, el isRemote estarán false y el resetToLocalController se llama.

  • protected void setupRemoteController()

    Este método emite el evento EventType.SET_MEDIA_CONTROLLER_CONFIG con el MediaControllerConfig objeto. Hablaremos mas de MediaControllerConfig más adelante en esta sección. Este método también escucha el BrightcoveMediaController.CONTROL_BAR_CREATED evento y reacciona llamando al setupBrightcoveControlBar método.

  • protected void resetToLocalController()

    Este método es responsable de restablecer el BrightcoveMediaController al diseño del controlador original emitiendo el EventType.RESTORE_DEFAULT_MEDIA_CONTROLLER.

  • protected void setupBrightcoveControlBar(BrightcoveControlBar controlBar)

    Una vez el BrightcoveMediaController ha sido recreado con el diseño proporcionado en el MediaControllerConfig , tendrás acceso a la BrightcoveControlBar vista. Desde aquí, puede acceder a las vistas de la interfaz de usuario, como los botones, donde puede agregar OnClickListeneres para ellos.

Establecer MediaControllerConfig

La MediaControllerConfig es una clase de configuración que puede utilizar para cambiar el diseño de control predeterminado del BrightcoveMediaController clase. En esta clase, puede establecer el diseño y la OnTouchListener. Una vez creado y configurado, puede emitir este objeto como se muestra a continuación:

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

El valor por defecto MediaControllerConfig objeto establece el R.layout.cast_media_controller como el diseño con un solo Tocar botón. Al hacer clic, se abrirá un cuadro de diálogo con dos opciones:

  • Reproducir ahora - Cuando se selecciona, el loadMediaInfo() se llama al método y el video se cargará y reproducirá en Chromecast.
  • Añadir a la cola - Cuando se selecciona, el addMediaInfo() se llama al método y el video se agrega al final de la cola.

Sobrescribir la configuración de la barra de control

Cuando el diseño de su controlador de medios se establece emitiendo el MediaControllerConfig , la BrightcoveControlBar se creará la vista y BrightcoveCastMediaManager.setupBrightcoveControlBar() se llamará al método. Es aquí donde puede obtener los componentes de la interfaz de usuario por Id y agregar los oyentes adecuados.

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

Problemas conocidos

Android 9

Cuando utilice Chromecast con Android 9 y superior, debe incluir un FOREGROUND_SERVICE permiso. Esto permite que la aplicación use notificaciones para controlar una sesión de transmisión cuando la aplicación está en segundo plano y se devuelve al primer plano.

La uses-permission la etiqueta debe agregarse a la aplicación AndroidManifest.xml archivo, de la siguiente manera:

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

Servicios de Google Play

Es posible que no se cree la conexión de transmisión si la versión de Google Play Services del remitente no está actualizada. Cuando los servicios de Google Play del remitente, en particular el marco de servicios de Cast, están desactualizados, es posible que no pueda crear una conexión de Cast. Esto se soluciona actualizando los servicios de Google Play del remitente a través de Google Play Store.