Tabla de contenido
Publicidad
Analítica
Subtítulos
Conceptos
Seguridad de contenido (DRM)
Transmisiones en vivo
Reproducción
- Detectando el ancho de banda de la red
- Obtener la instancia de ExoPlayer
- Reproducción sin conexión con DRM
- Paginación con la API de reproducción
- Reproducción de videos locales
- Configurar el tamaño del búfer
- Configuración de la tasa de bits máxima
- Configuración de la velocidad de reproducción
- Configuración del modo VR Goggles para videos de 360 °
- Iniciar la reproducción en medio de un video
- Intercambio de videos
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:
- 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.
- Abre el res / layout / land / my_media_controller.xml archivo en Android Studio.
- Copia el
Button
elemento para elfull_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"/>
- Abre el res / layout / my_tv_media_controller.xml archivo en Android Studio.
- 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. - 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">
- Abre el res / valores / estilos.xml archivo en Android Studio.
- Hacia
style
elemento con unname
valor deBrightcoveControlBar.TV.Custom
, agregue unitem
elemento para el botón de pantalla completa y configúrelo entrue
para mostrarlo.<style name="BrightcoveControlBar.TV.Custom"> <item name="brightcove_vr_mode">false</item> <item name="brightcove_full_screen">true</item> </style>
- 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.
Modo de pantalla completa
Puede administrar el modo de pantalla completa mediante código.
-
Aquí está el código para configurar 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);
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:
- Brightcove PlayerBandwidthMeter clase
- Correo: Uso simplificado del medidor de ancho de banda
- Interfaz ExoPlayer BandwidthMeter
- Interfaz ExoPlayer BandwidthMeter.EventListener
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:
- Agregue el complemento de servicios de Google a su proyecto.
- Obtenga un archivo de configuración de Google y agréguelo a su proyecto.
- 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.
- 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();
- 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:
-
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 elDeliveryType
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);
-
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(); }
-
Agregue el video a la vista e inicie la reproducción del video.
brightcoveVideoView.add(video); brightcoveVideoView.start();
-
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()
ystopPlayback()
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.
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 predeterminadaHabrá 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ónoffset
: 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í:
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.
hay dos maneras de hacer esto. El primer enfoque es el siguiente:
- Abre el principal / res / valores / style.xml archivo para su proyecto.
-
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:
- Abre el MainActivity.java archivo para su proyecto.
-
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:
-
El punto de partida es el Aplicación de muestra de IMA.
-
Localizar el
private void setupGoogleIMA()
función. -
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);
-
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:
-
Consigue el
VideoPlaybackController
instancia de laBrightcoveVideoView
.VideoPlaybackController playbackController = brightcoveVideoView.getPlaybackController();
-
Desactiva la reproducción de anuncios.
playbackController.setAdsDisabled(true);
- Busque la posición de tiempo deseada en el video actual.
-
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:
-
La
LoadControlConfig
yAllocatorConfig
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();
-
Los valores que no se establezcan en el constructor utilizarán valores predeterminados. Utilizar el
ExoPlayerVideoDisplayerComponent.setLoadControlConfig()
método para configurar elLoadControlConfig
.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.
-
Dado que el tiempo necesario para recuperar un vídeo de Video Cloud debería empequeñecer el tiempo necesario para actualizar la lista de reproducción, puede intentar algo como esto:
brightcoveVideoView.clear(); catalog.findVideoByID("123456789", new VideoListener() { @Override public void onVideo(final Video video) { brightcoveVideoView.add(video); brightcoveVideoView.start(); } });
-
Otro enfoque es esperar un evento:
catalog.findVideoByID("", new VideoListener() { @Override public void onVideo(final Video video) { eventEmitter.once(EventType.DID_CHANGE_LIST, new EventListener() { @Override public void processEvent(Event event) { 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 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);
}
}
});
}
}