Fragmentos de código usando el SDK nativo para Android

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

Tabla de contenido

Publicidad

Analítica

Subtítulos

Conceptos

Seguridad de contenido (DRM)

Transmisiones en vivo

Reproducción

Controles del jugador

Listas de reproducción

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. Abre el Controles personalizados aplicación de muestra. Usaremos esto como punto de partida. Revise la aplicación de muestra README para obtener detalles sobre la personalización de los controles del reproductor.
  2. Abre el res / layout / land / my_media_controller.xml archivo en Android Studio.
  3. Copia el Button elemento para el full_screen botón. El código debería verse 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. Abre el res / layout / my_tv_media_controller.xml archivo en Android Studio.
  5. Pega el copiado Button elemento en este archivo de diseño. La posición de los elementos determina su posición en la barra de control.
  6. Desplácese hasta la parte superior de la res / layout / my_tv_media_controller.xml expediente. Asegúrese de que la propiedad de estilo esté establecida en @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: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">
  7. Abre el res / valores / estilos.xml archivo en Android Studio.
  8. Hacia style elemento con un name valor de BrightcoveControlBar.TV.Custom , agregue un item elemento para el botón de pantalla completa y configúrelo en true 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 muestra en un dispositivo virtual o físico 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

Modo de pantalla completa

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

Obtener la duración de las transmisiones en vivo

Para obtener la duración de una transmisión en vivo, puede usar el MAX_POSITION. Esto le brinda la posición de búsqueda más grande para una transmisión en vivo (es decir, lo más lejos que puede arrastrar la barra de desplazamiento). El código debería tener un aspecto similar a este:

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

Detectando el ancho de banda de la red

Puede haber casos de uso en los que necesite detectar el ancho de banda de la red dentro de su aplicación, como cuando trabaja con descargas.

Para detectar el ancho de banda, el SDK nativo para Android usa el BandwidthMeter clase proporcionada por ExoPlayer. Nuestra PlayerBandwidthMeter clase usa el BandwidthMeter clase y proporciona la getBitrateEstimate método que devuelve la tasa de bits estimada.

Para obtener más información, consulte lo siguiente:

He aquí un ejemplo:

ExoPlayerVideoDisplayComponent exoPlayer = (ExoPlayerVideoDisplayComponent) brightcoveVideoView.getVideoDisplay();
exoPlayer.getBandwidthMeter().addEventListener(myHandler, new BandwidthMeter.EventListener() {@
	Override public void onBandwidthSample(int elapsedMs, long bytesTransferred, long bitrateEstimate) {}
});

Obtener la instancia de ExoPlayer

Puede haber ocasiones en las que necesite obtener el objeto ExoPlayer para modificar propiedades que no están expuestas a través del SDK nativo de Brightcove. Se crea una instancia de este objeto después de que se configura el video. Por lo tanto, debe esperar a DID_SET_VIDEO evento.

Puede obtener la instancia de ExoPlayer haciendo lo siguiente:

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

Para ver un ejemplo de modificación del AudioAttribute propiedad para ExoPlayer, consulte la Configuración de atributos de audio en una instancia de Exoplayer publicación en el foro.

Obtener URL para imágenes en miniatura

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

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

String thumbnailUrl = video.getProperties().get("thumbnail").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 analitico

Si utiliza el reproductor 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 análisis de Video Cloud. Para obtener 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. Amplíe la aplicación y proporcione un método auxiliar que devuelva su rastreador de aplicaciones. Debería verse similar al Google-services AnalyticsApplication.
  4. En una clase separada que extiende BrightcovePlayer, obtenga la instancia de rastreador compartido:
    // Obtain the shared Tracker instance
    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 seguimiento.

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

Carga de una imagen de póster y video remoto

Los clientes de Brightcove Player solo usan activos de video desde un servidor remoto. Siga estos pasos para cargar un video y una imagen de póster, ambos ubicados en un servidor remoto:

  1. En el onCreate() , después de definir la vista de video, cree un objeto de video a partir de su video alojado en un servidor remoto. Selecciona el DeliveryType para que coincida con el tipo de video que tienes.

    Video video = Video.createVideo("https://sdks.support.brightcove.com/assets/videos/hls/greatblueheron/greatblueheron.m3u8",
      DeliveryType.HLS);
  2. Cargue una imagen remota para usarla como imagen de póster antes de que comience la reproducción de video.

    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();
    }
  3. Agregue el video a la vista e inicie la reproducción del video.

    brightcoveVideoView.add(video);
    brightcoveVideoView.start();
  4. Compruebe para asegurarse de que su onCreate() El método aparece de la siguiente manera:

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

Agregar contenido DRM manualmente

Como cliente de Brightcove Player, es posible que desee utilizar contenido protegido por DRM de su propio servidor. Puede cargar contenido DRM manualmente 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: ¿síncrono o asíncrono?

Estos son algunos de los métodos asincrónicos que se encuentran en Native Player SDK para Android:

  • La start() , seekTo() y stopPlayback() Los métodos son asincrónicos, porque emiten un evento para que otros componentes del sistema lo manejen.
  • La clear() El método es sincrónico con respecto a la actualización de la lista, pero es asincrónico con respecto a la descarga del video actual.

Silenciar / activar el sonido del reproductor

Puede silenciar o reactivar el reproductor mediante programación. Brightcove recomienda utilizar BrightcoveExoPlayerVideoView siempre que sea posible.

BrightcoveExoPlayerVideoView

Al usar el BrightcoveExoPlayerVideoView , puede silenciar o reactivar el reproductor mediante programación haciendo lo siguiente:

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

Si necesita utilizar el BrightcoveVideoView , que usa Android Reproductor multimedia , puede silenciar o reactivar el reproductor mediante programación con el siguiente código:

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

Reproducción sin conexión con DRM

Para los videos descargados para su reproducción sin conexión, el estado de la descarga también se puede mostrar en el Área de notificaciones. 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 cancela.

Descargar estado de notificación
Estado de descarga Texto del contenido de la notificación Icono de notificación
Descargando R.string.odrm_download_running- esto es "Descargando ..." de forma predeterminada

Habrá una barra de progreso que muestra el porcentaje completado.
El icono de "descarga" animado predeterminado de la plataforma: android.R.drawable.stat_sys_download
Rever R.string.odrm_download_waiting_retry- esto es "Esperando reintentar ..." de forma predeterminada  
Ha fallado R.string.odrm_download_failed- esto es "¡Falló!" "de forma predeterminada  
Terminado R.string.odrm_download_complete- esto es "Guardado" por defecto El icono "descargado" estático predeterminado de la plataforma: android.R.drawable.stat_sys_download_done

Para un estado de Reintento o Fallido, el subtexto de la 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 desde la API de reproducción, puede implementar la paginación para una lista de reproducción.

Para desplazarse por un conjunto de videos en una lista de reproducción, use los siguientes parámetros de URL de solicitud:

  • limit- define la cantidad de videos que se devolverán desde la API de reproducción
  • offset: establece la cantidad de videos que se omitirán en una lista de reproducción desde la API de reproducción

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

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

Reproducción de videos locales

Si desea reproducir videos MP4 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();

Colocación de los controles del reproductor en la parte inferior

De forma predeterminada, la barra de control del reproductor se coloca directamente debajo del video, como se muestra aquí:

Controles del reproductor en video
Controles del reproductor en video

También puede colocar la barra de control del reproductor de modo que esté en la parte inferior de la vista de video. Porque los controles son parte del BrightcoveVideoView , estableciendo la altura en match_parent , la vista cubrirá toda la pantalla. Cuando los controles aparecen en la parte inferior de la vista, el video permanecerá en el medio de la vista.

El jugador controla la parte inferior
El reproductor controla la parte inferior de la vista de video

hay dos maneras de hacer esto. El primer enfoque es el siguiente:

  1. Abre el principal / res / valores / style.xml archivo para su proyecto.
  2. Agregue el siguiente código XML:

    <style name="BrightcoveControlBar" parent="BrightcoveControlBarDefault">
      <item name="brightcove_align">false</item>
    </style>

O puede usar código dentro del MainActivity.java archivo de la siguiente manera:

  1. Abre el MainActivity.java archivo para su proyecto.
  2. Después de obtener el emisor de eventos, como se muestra aquí:

    EventEmitter eventEmitter = brightcoveVideoView.getEventEmitter();

    Agregue el siguiente detector de eventos y código. Estamos esperando hasta después de la DID_SET_VIDEO evento para asegurarse de que se ha creado la barra de control.

    eventEmitter.on(EventType.DID_SET_VIDEO, new EventListener() {
      @Override
      public void processEvent(Event event) {
        BrightcoveControlBar brightcoveControlBar = brightcoveVideoView.getBrightcoveMediaController().getBrightcoveControlBar();
        brightcoveControlBar.setAlign(false);
        }
    });

Precargar anuncios IMA

Para precargar anuncios con el SDK nativo para Android y el complemento IMA, utilice el setEnablePreloading(true) propiedad .

Para utilizar esta propiedad, siga estos pasos:

  1. El punto de partida es el Aplicación de muestra de IMA.

  2. Localizar el private void setupGoogleIMA() función.

  3. Agregue el bloque de código de fragmento antes de la última línea de código de la función.

    ImaSdkSettings imaSdkSettings = sdkFactory.createImaSdkSettings();
    AdsRenderingSettings adsRenderingSettings =
    ImaSdkFactory.getInstance().createAdsRenderingSettings();
    adsRenderingSettings.setEnablePreloading(true);
  4. Añade el adsRenderingSettings parámetro a la última línea de código.

    googleIMAComponent = new GoogleIMAComponent(brightcoveVideoView, eventEmitter, true, adsRenderingSettings);

Buscar sin anuncios

Puedes usar el adsDisabled propiedad para el VideoPlaybackController para deshabilitar la reproducción de anuncios mientras busca a través de un video.

Para utilizar esta función, siga estos pasos:

  1. Consigue el VideoPlaybackController instancia de la BrightcoveVideoView.

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

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

    playbackController.setAdsDisabled(false);

Tu código debería verse así:

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

Configurar el tamaño del búfer

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

HLS está diseñado para reproducirse de inmediato y reducir la calidad si no puede mantener el ritmo. De esta forma, no necesita precargar un búfer. Si no puede mantener el ritmo, cargará la mayor cantidad de video que pueda con la mejor calidad para evitar interrupciones.

A partir del SDK nativo para Android v6.3.1, se agregaron las siguientes clases al SDK para la implementación de ExoPlayer 2:

  • LoadControlConfig
  • AllocatorConfig

Los valores establecidos en estas clases se utilizan para crear el ExoPlayer DefaultLoadControl objeto, que se utiliza para crear la instancia de ExoPlayer. Los desarrolladores pueden controlar el tamaño del búfer de la siguiente manera:

  1. La LoadControlConfig y AllocatorConfig las clases siguen los patrones del constructor. Los valores que puede establecer en ambas clases reflejan los valores que puede establecer en sus constructores.

    AllocatorConfig allocatorConfig = new AllocatorConfig.Builder().build();
    LoadControlConfig loadControlConfig = new LoadControlConfig.Builder()
    .setAllocatorConfig(allocatorConfig)
    .setMinBufferMs(X)
    .setMaxBufferMs(Y)
    .build();
  2. Los valores que no se establezcan en el constructor utilizarán valores predeterminados. Utilizar el ExoPlayerVideoDisplayerComponent.setLoadControlConfig() método para configurar el LoadControlConfig.

    brightcoveVideoView = (BrightcoveExoPlayerVideoView) findViewById(R.id.brightcove_video_view);
    ...
    ExoPlayerVideoDisplayComponent dc = (ExoPlayerVideoDisplayComponent) brightcoveVideoView.getVideoDisplay();
    dc.setLoadControlConfig(loadControlConfig);

Configurar subtítulos y temas

Actualmente, el BrightcoveCaptionPropertiesActivity está configurado en el archivo de manifiesto de 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">

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

La BrightcoveCaptionPropertiesActivity heredará el tema predeterminado de la plataforma, siempre que establezca temas para su aplicación en el <activity> nivel en el manifiesto de su aplicación.

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

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

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

Establecer subtítulos predeterminados

Si su video usa subtítulos en varios idiomas, puede establecer mediante programación un idioma predeterminado cuando comience la reproducción. El código debería tener un aspecto similar a este:

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

Uso de subtítulos en el manifiesto

De forma predeterminada, un reproductor creado con Native SDK para Android utilizará subtítulos secundarios. Estos subtítulos se encuentran en el text_tracks objeto de la respuesta de la API de reproducción.

Para configurar el reproductor para usar subtítulos en el manifiesto, el CAPTION_SOURCES La propiedad debe eliminarse del objeto Video:

if (video.getProperties().get(Video.Fields.CAPTION_SOURCES) != null) {
    video.getProperties().remove(Video.Fields.CAPTION_SOURCES);
}

Configuración de la tasa de bits máxima

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

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

Configuración de la velocidad de reproducción

ExoPlayer admite el ajuste de la velocidad de reproducción para videos que se reproducen en dispositivos Android. Para obtener más detalles, consulte el Reproducción de velocidad variable con ExoPlayer documento.

Puede controlar la velocidad de reproducción con el siguiente código:

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

Configuración del modo VR Goggles para videos de 360 °

Al reproducir un video de 360 °, los usuarios pueden seleccionar el botón Video 360 en la barra de control para cambiar al modo VR Goggles. Si está utilizando el BrightcovePlayer o BrightcovePlayerFragment actividad, 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(Event 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 del video hasta que comience la reproducción.

Mostrando la imagen fija del video

Puede mostrar el video en cualquier momento emitiendo un SET_VIDEO_STILL evento con un VIDEO_STILL propiedad establecida en el URI de la imagen fija de vídeo.

Ocultar la imagen fija de vídeo

Si está reproduciendo automáticamente el video, es posible que desee ocultar la imagen fija del video. Para hacer esto, puede 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(Event event) {
    event.preventDefault();
    event.stopPropagation();
  }
});

Mostrando controles del reproductor

De forma predeterminada, los controles del reproductor desaparecerán después de unos segundos. El usuario puede mostrar los controles tocando el video.

Si desea que los controles del reproductor sigan mostrándose hasta que el usuario toque el video, puede deshabilitar la función de ocultación automática de la siguiente manera: (el código necesario está resaltado)

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

Iniciar 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 iniciar la reproducción.

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

Intercambio de videos

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

Usar videos únicos

Desde el clear() El método es asincrónico al descargar el video actual, debe esperar antes de agregar un nuevo video al reproductor. Aquí hay dos opciones.

Usando una lista de reproducción

Si está trabajando con una lista de reproducción, tenga en cuenta que llamar al clear() El método elimina todos los elementos de la lista de reproducción. Entonces, puede obtener un IndexOutOfBounds excepción al intentar saltar al primer video de la lista de reproducción.

En su lugar, puede intentar algo como esto:

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

Cambiar entre videos en una lista de reproducción

Si está usando una lista de reproducción, puede usar el siguiente código para cambiar entre 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(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);
    }
  }
});
}
}