Fragmentos de código con el SDK nativo para Android

Producto (s)
Brightcove Player
Video Cloud
Papel (s)
Desarrollador SDK de dispositivos
Tareas)
Desarrollar con los SDK nativos
Tema (s)
Ejemplos de código
API (s)
Playback API
SDK
Androide

En este tema, encontrará una colección de fragmentos de código que puede resultarle útil como referencia mientras desarrolla con el SDK. Para soluciones más detalladas, vea el Ejemplos de reproductor de Android.

Tabla de contenido

publicidad
Análisis
Leyendas
Conceptos
Seguridad de contenido (DRM)
Transmisiones en vivo
Reproducción
Controles del reproductor
Listas de reproducción
El contenido de video

Personalización de controles para Android TV

Puede agregar botones a la barra de control para dispositivos o Android TV. Los pasos a continuación lo guían para agregar un botón de pantalla completa a la barra de control para Android TV:

  1. Abra la Controles personalizados aplicación de muestra Lo usaremos como punto de partida. Revisa la aplicación de muestra README archivo para detalles sobre la personalización de controles de jugador.
  2. Abra la res / layout / land / my_media_controller.xml archivo en Android Studio.
  3. Copia el Botón elemento para el pantalla completa botón. El código debe ser similar a esto:
    <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. Abra la res / layout / my_tv_media_controller.xml archivo en Android Studio.
  5. Pegar el copiado Botón elemento en este archivo de diseño. La posición de los elementos determina su posición en la barra de control.
  6. Desplázate a la parte superior de la res / layout / my_tv_media_controller.xml archivo. Asegúrese de que la propiedad de estilo esté configurada para @ style / BrightcoveControlBar.TV.Custom. El código debería verse así:
    <? xml version = "1.0" encoding = "utf-8"?> <com.brightcove.player.mediacontroller.BrightcoveControlBar xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: Herramientas de bmc = "http://schemas.android.com/apk/res-auto" xmlns: tools = "http://schemas.android.com/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. Abra la res / values ​​/ styles.xml archivo en Android Studio.
  8. Al estilo elemento con un nombre valor de BrightcoveControlBar.TV.CustomAgrega un ít elemento para el botón de pantalla completa y configurarlo para verdadero para mostrarlo.
    <style name = "BrightcoveControlBar.TV.Custom"> <item name = "brightcove_vr_mode"> false </ item> <item name = "brightcove_full_screen"> true </ item> </ style>
  9. Eso es. Ejecute la aplicación de ejemplo en un dispositivo físico o virtual de Android TV. Debería ver el botón de pantalla completa en la barra de control.
    Botón de pantalla completa
    Botón de pantalla completa

Obteniendo la duración de las transmisiones en vivo

Para obtener la duración de una transmisión en vivo, puede usar MAX_POSITION. Esto le proporciona la posición más grande que se puede buscar para una transmisión en vivo (es decir, lo más lejos que puede arrastrar la barra de desplazamiento). Tu código debe ser similar a esto:

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

Obtener URL para imágenes en miniatura

Es posible que desee utilizar las imágenes fijas en miniatura o en video de su biblioteca de Brightcove. Use el siguiente código para obtener la URL de sus imágenes:

Para los clientes de Video Cloud que usan Edge Catalog (com.brightcove.player.edge.Catalog), puede obtener la URL miniatura de esta manera:

String thumbnailUrl = video.getProperties (). Get ("miniatura"). ToString ();

Si encuentra que la imagen en miniatura es demasiado pequeña, puede obtener la imagen fija de video en su lugar:

String videoStillUrl = video.getProperties (). Get ("stillImageUri"). ToString ();

Google analytics

Si usa el reproductor de Brightcove y la clase de catálogo, los análisis de video se recopilarán automáticamente y aparecerán en su módulo de Video Cloud Analytics. Para métricas adicionales, puede agregar Google Analytics a su aplicación.

Para integrar Google Analytics con su aplicación, siga estos pasos:

  1. Agregue el complemento de Servicios de Google a su proyecto.
  2. Obtenga un archivo de configuración de Google y agréguelo a su proyecto.
  3. Extiende la aplicación y proporciona un método de ayuda que devuelve tu rastreador de aplicaciones. Debe ser similar a la google-services AnalyticsApplication.
  4. En una clase separada que amplía BrightcovePlayer, obtenga la instancia del rastreador compartido:
    // Obtenga la instancia de Tracker compartida AnalyticsApplication application = (AnalyticsApplication) getApplication (); tracker = application.getDefaultTracker ();
  5. Anule los métodos apropiados para registrar cambios en la pantalla y / o enviar eventos personalizados para el seguimiento.

Para conocer los pasos detallados, consulte el documento de Google para Agregue Analytics a su aplicación de Android.

Modo de pantalla completa

Puede administrar el modo de pantalla completa usando el código.

  • Aquí está el código para establecer el modo de pantalla completa:

    brightcoveVideoView.getEventEmitter (). emit (EventType.ENTER_FULL_SCREEN);
  • Aquí está el código para salir del modo de pantalla completa:

    brightcoveVideoView.getEventEmitter (). emit (EventType.EXIT_FULL_SCREEN);

Añadiendo manualmente contenido de DRM

Como cliente de Brightcove Player, es posible que desee usar contenido protegido con DRM de su propio servidor. Puede cargar manualmente el contenido de DRM de la siguiente manera:

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

Métodos: sincrónico o asincrónico?

Estos son algunos de los métodos asíncronos que se encuentran en Native Player SDK para Android:

  • La pérdida de músculo es el start (), tratar de() y stopPlayback () los métodos son asíncronos, porque emiten un evento para que otros componentes en el sistema lo manejen.
  • La pérdida de músculo es el claro() El método es sincrónico con respecto a la actualización de la lista, pero es asíncrono con respecto a la descarga del video actual.

Reproducción fuera de línea con DRM

Para videos descargados para reproducción fuera de línea, el estado de descarga también se puede mostrar en el Área de notificación. El título de la notificación se establece en el título del video. La notificación se elimina si la descarga se detiene o se cancela.

Descargar el estado de notificación
Descarga estado Texto de contenido de notificación Ícono de notificación
Descarga de R.string.odrm_download_running - esto es "Descargando ..." por defecto

Habrá una barra de progreso que muestra el porcentaje completado.
El ícono de "descarga" animada por defecto de la plataforma - android.R.drawable.stat_sys_download
Reintente R.string.odrm_download_waiting_retry - esto es "Waiting retry ..." por defecto  
Fallidos R.string.odrm_download_failed - esto es "Fallido!" "por defecto  
Terminado R.string.odrm_download_complete - esto es "Guardado" por defecto El ícono "descargado" estático predeterminado de la plataforma - android.R.drawable.stat_sys_download_done

Para un estado de Reintentar o Fallido, el subtexto de notificación se establecerá en un recurso apropiado según el tipo de error. Aquí está la lista completa:

  • 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

Paginación con la API de reproducción

Al recuperar su contenido de Video Cloud de la API de reproducción, puede implementar la búsqueda de una lista de reproducción.

Para recorrer una serie de videos en una lista de reproducción, use los siguientes parámetros de URL de solicitud:

  • límite - define la cantidad de videos a devolver desde la API Playback
  • compensar - establece el número de videos para saltar en una lista de reproducción de la API de reproducción

Los parámetros de consulta se pasarán al método de catálogo como un mapa objeto, como pares clave-valor. Este ejemplo devuelve videos 6 comenzando con el video 10th en la lista de reproducción:,>

Map <String, String> queryParameters = new HashMap <> (); queryParameters.put ("límite", "6"); queryParameters.put ("offset", "9"); Catalog Catalog = new Catalog (eventEmitter, "myAccount", "myPolicy"); catalog.findPlaylistByID ("myPlaylistId", null, queryParameters, myListener);

Reproducción de videos locales

Si desea reproducir videos MP4 que están almacenados localmente, debe guardarlos en la carpeta de activos de la aplicación.

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

Buscar sin publicidad

Puede utilizar el anunciosDisabled propiedad para el VideoPlaybackController para deshabilitar la reproducción de anuncios mientras buscas a través de un video.

Para usar esta característica, siga estos pasos:

  1. Maker's Shoes VideoPlaybackController instancia de la BrightcoveVideoView.

    VideoPlaybackController playbackController = brightcoveVideoView.getPlaybackController ();
  2. Desactivar la reproducción de anuncios.

    playbackController.setAdsDisabled (true);
  3. Busque la posición de tiempo deseada en el video actual.
  4. Reanudar el comportamiento normal de los anuncios.

    playbackController.setAdsDisabled (falso);

Tu código debería verse más o menos así:

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

Configurando el tamaño del buffer

Puede considerar aumentar la duración del búfer para eliminar el almacenamiento en búfer en el reproductor si la entrega del siguiente segmento se retrasa desde el CDN. Sin embargo, es posible que no pueda hacer nada mejor manualmente que HLS ya lo hace.

HLS está diseñado para jugar de inmediato y perder calidad si no puede mantener el ritmo. De esta forma, no necesita precargar un buffer. Si no puede mantener el ritmo, cargará la mayor cantidad posible de video con la mejor calidad para evitar interrupciones.

Dicho esto, si está utilizando la implementación de ExoPlayer 1, puede controlar lo siguiente:

Por ejemplo, si desea establecer la duración del búfer en 120 segundos, puede establecer minBufferMs to * 120 1000.

Configurar leyendas y temas

Actualmente, la BrightcoveCaptionPropertiesActivity se establece en el archivo de manifiesto del Brightcove Player SDK, por lo que los desarrolladores no necesitan especificarlo en sus aplicaciones:

<? 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"> <aplicación> <! - Si no registramos esta actividad en el Manifiesto, las aplicaciones que usan el SDK se bloquean cuando intentan acceder a él. -> <! - Durante el proceso de compilación de la aplicación, este manifiesto se fusionará con el nivel de aplicación. -> <actividad android: name = "com.brightcove.player.captioning.BrightcoveCaptionPropertiesActivity" /> </ application> </ manifest>

La pérdida de músculo es el BrightcoveCaptionPropertiesActivity heredará el tema predeterminado de la plataforma, siempre que establezca temas para su aplicación en el <actividad> nivel en el manifiesto de su aplicación.

Si establece un solo tema de aplicación en el <aplicación> nivel, luego el BrightcoveCaptionPropertiesActivity heredará las propiedades de este tema de nivel de aplicación. Para algunos temas, esto puede hacer que la actividad tenga un aspecto extraño o incluso ilegible.

En esos casos, debe especificar el BrightcoveCaptionPropertiesActivity en tu propio manifiesto y aplica un tema allí, así:

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

Configurar subtítulos predeterminados

Si su video usa subtítulos en varios idiomas, puede establecer un idioma predeterminado de manera programada cuando comience la reproducción. Tu código debe ser similar a esto:

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

Ajuste de la tasa de bits máxima

Para ayudarlo a implementar un selector de velocidad de bits en su reproductor, puede usar el siguiente código para establecer la tasa de bits pico:

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

Configuración del modo VR Goggles para videos 360 °

Al reproducir un video 360 °, los usuarios pueden seleccionar el botón Video 360 en la barra de control para cambiar al modo VR Goggles. Si está usando el BrightcovePlayer or BrightcovePlayerFragment actividad, entonces la orientación de la pantalla cambiará a horizontal cuando el modo VR Goggles esté habilitado.

Si está utilizando una actividad personalizada, deberá agregar lo siguiente:

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

Mostrar / ocultar imágenes fijas de video

El comportamiento predeterminado al recuperar videos de su biblioteca de Video Cloud es mostrar la imagen fija de video hasta que comience la reproducción.

Ocultar la imagen fija de video

Si está reproduciendo automáticamente el video, es posible que desee ocultar la imagen fija de video. Para hacer esto, puedes escuchar el SET_VIDEO_STILL evento y evitar el comportamiento predeterminado de la siguiente manera:

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

Mostrando la imagen fija de video

Puede mostrar el video aún en cualquier momento emitiendo un SET_VIDEO_STILL evento con un VIDEO_STILL propiedad establecida en el URI del video todavía.

Iniciando la reproducción en medio de un video

A veces, es posible que deba iniciar la reproducción desde algún lugar en el medio del video. Para hacer esto, puedes llamar BrightCoveVideoView.seekTo () antes de comenzar la reproducción.

catalog.findVideoByID (getString (R.string.videoId), nuevo 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 (evento Event) {brightcoveVideoView.seekTo (60000); brightcoveVideoView.start ();}}); brightcoveVideoView.add (video); brightcoveVideoView.pause () ;}});

Intercambio de videos

Este ejemplo muestra un enfoque para intercambiar videos en el reproductor.

Usar videos individuales

Puesto que el claro() El método es asíncrono al descargar el video actual, debe esperar antes de agregar un nuevo video al reproductor. Aquí hay dos opciones.

  • Dado que el momento de buscar un video de Video Cloud debe minimizar el tiempo de actualización de la lista de reproducción, puede intentar algo como esto:

    brightcoveVideoView.clear (); catalog.findVideoByID ("123456789", nuevo VideoListener () {@Override public void onVideo (videovídeo final) {brightcoveVideoView.add (video); brightcoveVideoView.start ();}});
  • Otro enfoque es esperar un evento:

    catalog.findVideoByID ("", nuevo VideoListener () {@Override public void onVideo (videovídeo final) {eventEmitter.once (EventType.DID_CHANGE_LIST, new EventListener () {@Override public void processEvent (Evento evento) {brightcoveVideoView.add ( video); brightcoveVideoView.start ();}}); brightcoveVideoView.clear ();}});

Usando una lista de reproducción

Si está trabajando con una lista de reproducción, tenga en cuenta que llamar al claro() método elimina todos los elementos de la lista de reproducción. Entonces, puedes obtener un Índice fuera de los límites excepción cuando intenta saltar al primer video en la lista de reproducción.

En cambio, puedes probar algo como esto:

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

Alternar entre videos en una lista de reproducción

Si está utilizando una lista de reproducción, puede usar el siguiente código para alternar entre los videos en la lista de reproducción:

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 (falso); previousVideoButton.setOnClickListener (new View.OnClickListener () {public void onClick (Ver vista) {int index = brightcoveVideoView.getCurrentIndex (); int size = brightcoveVideoView.getList (). size (); previousVideoButton.setEnabled (índice> 1); nextVideoButton.setEnabled ((índice + 1) <tamaño); if (índice> 0) {brightcoveVideoView.setCurrentIndex (index - 1);}}}); nextVideoButton.setEnabled (videos.size ()> 1); nextVideoButton.setOnClickListener (new View.OnClickListener () {public void onClick (Ver vista) {int index = brightcoveVideoView.getCurrentIndex (); int size = brightcoveVideoView.getList (). size (); previousVideoButton.setEnabled (índice> = 0) ; nextVideoButton.setEnabled ((índice + 2) <tamaño); if ((índice + 1) <tamaño) {brightcoveVideoView.setCurrentIndex (índice + 1);}}}); }}

Trabajando con control de volumen

Puede silenciar o activar el sonido del programa mediante programación. Brightcove recomienda usar BrightcoveExoPlayerVideoView siempre que sea posible.

BrightcoveExoPlayerVideoView

Cuando se utiliza el BrightcoveExoPlayerVideoView, puede silenciar o activar el sonido del programa programáticamente haciendo lo siguiente:

volumen de flotación = 100; ... brightcoveVideoView.getEventEmitter (). on (EventType.DID_SET_VIDEO, new EventListener () {@Override public void processEvent (evento Event) {setMute (true); brightcoveVideoView.start ();}}); ... private void setMute (boolean mute) {volume = mute? 0: 100; Mapa  properties = new HashMap <> (); properties.put (Event.VOLUME, volumen); brightcoveVideoView.getEventEmitter (). emit (EventType.SET_VOLUME, properties); }  ,>

BrightcoveVideoView

Si necesita usar el BrightcoveVideoView, que usa Android Reproductor multimedia, puedes silenciar o anular el silencio del reproductor mediante el siguiente código:

volumen de flotación = 100; ... brightcoveVideoView.getEventEmitter (). on (EventType.DID_SET_VIDEO, new EventListener () {@Override public void processEvent (evento Event) {setMute (true); brightcoveVideoView.start ();}}); ... private void setMute (boolean mute) {volume = mute? 0: 1; Mapa <String, Object> properties = new HashMap <> (); properties.put (Event.LEFT_VOLUME, volumen); properties.put (Event.RIGHT_VOLUME, volumen); brightcoveVideoView.getEventEmitter (). emit (EventType.SET_VOLUME, properties); }