video — u_pbt_video #
← Referencia de componentes · Índice de la guía
Reproductor de vídeo: un archivo del equipo — servido en flujo por la DLL, una película larga empieza enseguida — o una URL, con la barra de transporte del componente, que sigue el tema: reproducción, búsqueda, tiempo, silencio, volumen. Subtítulos WebVTT, cartel antes de la reproducción, bucle, velocidad, encuadre, captura del fotograma actual en PNG o JPEG. Todo lo que el usuario hace en la barra, su aplicación lo sabe.
▶ Verlo en vivo — Aplicación de demostración, mosaico Video player: la película, el código que la controla y esta página, lado a lado (la película de ejemplo viene con la demostración; solo el ejemplo 3 viene de Internet).
De un vistazo #
| Userobject | u_pbt_video |
| Clase de items | — (componente sin items) |
| Sirve para | Una película de formación en la aplicación, el vídeo de un producto, la reproducción de una grabación, un bucle de presentación en un stand |
| Principio | Un <video> del motor WebView2: todos los formatos que decodifica (mp4, webm, m4v, mov, mkv). La barra es del componente; sus gestos pasan por los mismos verbos que sus llamadas, por tanto los mismos eventos |
| Dependencia | El runtime WebView2, ya requerido por la biblioteca — nada más |
Inicio rápido #
// A film of the workstation, streamed by the DLL : starts at once
uo_video.is_poster = "img\packimages.dll:PNG/COVER" // shown until the film starts
// The film and ITS subtitles in one call : the subtitles belong to this film
uo_video.of_play(/*source*/ "films\training.mp4", /*subtitles*/ "films\training.vtt")
// A URL plays the same way
uo_video.of_play(/*source*/ "https://www.w3schools.com/html/mov_bbb.mp4")
// The user pauses from the bar, or your code does : either way ue_paused fires
uo_video.of_pause()
uo_video.of_seek(/*ms*/ 90000) // to 1:30, in milliseconds
Todo lo que se ajusta es una propiedad (is_source, ii_volume, ib_loop…), leída en directo del componente; todo lo que se hace es un método (of_play, of_pause, of_stop, of_seek, of_capture); todo lo que ocurre es un evento (ue_started, ue_ended, ue_progress…). Un archivo ausente no es una excepción: ue_failed lo dice, y el mensaje se muestra sobre la imagen.
Propiedades #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_source | string | "" | La película: un archivo del equipo (cualquier ruta, en flujo) o una URL https. Una dirección http:// se rechaza (ue_failed, REASON_INSECURE): el motor la promueve a https y falla — descargue antes la película (restclient, of_download). Formatos: mp4, webm, m4v, mov (una película de iPhone o de cámara en H.264), mkv y los formatos de audio; avi, wmv y flv se rechazan por su nombre (REASON_FORMAT). Fijarla detiene lo que sonaba; ib_autoplay decide si la nueva arranca sola. Una película de cualquier tamaño, también en una aplicación de 32 bits: la DLL la sirve por tramos, nunca el archivo entero de una vez; una película que el motor no puede decodificar la señala ue_failed. Una NUEVA película deja atrás lo que pertenecía a la anterior: su segmento, sus subtítulos, marcadores y capítulos (fijados antes de cualquier película, esperan a la primera); una película de la lista conserva sus propios subtítulos. Fije pues sus subtítulos, marcadores y capítulos DESPUÉS de ella — o dé los subtítulos con ella: of_play(source, subtitles). La MISMA película fijada de nuevo no se recarga: sigue desde donde está |
ib_autoplay | boolean | false | Arranca la película en cuanto se fija is_source; si no, espera a of_play, la barra o el teclado, y muestra is_poster |
ib_muted | boolean | false | Silencia el sonido, volumen conservado; el botón de la barra y la tecla M también lo fijan |
ii_volume | integer | 100 | Volumen en porcentaje, 0 a 100; también el control de la barra y las flechas arriba/abajo |
ib_loop | boolean | false | Repite la película en bucle hasta of_stop; una película en bucle nunca lanza ue_ended |
ii_rate | integer | 100 | Velocidad en porcentaje, 25 a 400: 50 = mitad, 200 = doble, el sonido sigue |
is_stretch | string | "uniform" | Encuadre: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL — los cuatro modos de una imagen |
ib_controls | boolean | true | La barra de transporte del componente, con el tema. false la oculta: su ventana controla la película |
is_poster | string | "" | El cartel mostrado antes de la película: archivo, URL o pack.dll:NOMBRE, como el origen de una imagen. Un prefijo mono:/tint:/white:/black: recolorea una imagen monocroma al tema. Solo https: una dirección http:// se rechaza, no se muestra nada y la propiedad se relee vacía |
is_subtitles | string | "" | Un archivo de subtítulos, local o URL https: WebVTT (.vtt) o SubRip (.srt, convertido — UTF-8, UTF-16 o la página de códigos ANSI del equipo). Una URL la DESCARGA el componente: su servidor debe permitir CORS (GitHub, un CDN lo hacen); un rechazo, o una URL http://, lo dice ue_subtitles_failed y la película sigue. Una pista; of_add_subtitles apila varias. Pertenece a la película: un nuevo is_source lo quita — fíjelo pues DESPUÉS de is_source, o use of_play(source, subtitles). Un archivo del equipo que no se encuentra se dice igual (ue_subtitles_failed, REASON_NOT_FOUND); una pista rechazada deja la propiedad vacía |
is_subtitle_lang | string | "" | La pista de subtítulos mostrada (un idioma de of_add_subtitles); vacío = ninguna |
ii_fps | integer | 25 | Imágenes por segundo de la película, para of_step_frames |
ib_remember_position | boolean | false | Recuerda dónde se deja cada película — una pausa, una parada y cada 5 segundos durante la reproducción (cerrar la ventana puede perder esos últimos segundos) — y reanuda ahí en el siguiente of_play de la misma fuente, se escriba como se escriba su ruta. Guardado por el motor en este equipo, por usuario, para las 200 últimas películas |
is_theme_style | string | "" | Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio |
is_theme_mode | string | "" | Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento de la aplicación, o el del tema) |
is_tooltip | string | "" | Tooltip simple mostrado al pasar el ratón por el componente |
is_super_tooltip_title | string | "" | Título del tooltip enriquecido (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto del tooltip enriquecido (se acepta el marcado enriquecido) |
is_super_tooltip_image | string | "" | Imagen del tooltip enriquecido |
ib_enabled | boolean | true | false: imagen atenuada, barra y teclado inertes — salvo Escape en pantalla completa: siempre se puede salir; su código sigue mandando |
ib_scrub_preview | boolean | true | Una burbuja de tiempo sigue el cursor sobre la barra (true, por defecto), con el capítulo si los hay. false la oculta |
ib_pause_when_hidden | boolean | true | Pone la película en pausa cuando el componente está OCULTO (otra página de un tab o de un dock PBToolboxAI, PBT_SetVisible): ue_paused sigue, y la película espera of_play, nunca se reanuda sola. false la deja reproducirse (un muro de pantallas). Un Tab NATIVO de PowerBuilder no avisa al componente: llame a of_pause en su SelectionChanged |
ib_forward_seek | boolean | true | Una película de formación que hay que VER: false impide al usuario buscar más allá del punto más lejano ya reproducido — la barra, las flechas, Fin, un marcador, las teclas imagen a imagen; volver atrás sigue libre, y su código (of_seek) no queda retenido. of_watched_ms / of_watched_percent leen lo reproducido, ue_watched_completely dice cuándo se reprodujo todo |
ib_skip_failed | boolean | false | Una lista que avanza SOLA salta una película que no puede reproducirse (se lanza su ue_failed, después de ue_source_changed) en lugar de detenerse ahí |
Un clic en la imagen pausa, un segundo reanuda. Teclado, cuando la película tiene el foco: Espacio o K reproducir/pausa, ←/→ cinco segundos, ↑/↓ volumen, M silencio, Inicio/Fin. Las teclas . y , avanzan y retroceden una imagen, Esc sale de la pantalla completa o cierra el menú de velocidad. En el menú de velocidad: ↑/↓, Inicio/Fin, Intro elige, Esc y Tab lo cierran. En un reproductor sin película, Espacio y el botón Reproducir no hacen nada.
Métodos #
| Método | Función | |
|---|---|---|
of_play ( ) → long | Reproduce is_source desde donde está: desde el principio la primera vez, desde la pausa después (ue_resumed). Devuelve 0 una vez iniciado, -5 cuando el reproductor no puede reproducir nada — sin fuente, o una fuente rechazada al instante (http://, un formato rechazado por su nombre): of_get_last_error dice cuál y no sigue ningún ue_failed —, -2 cuando el componente no está creado, -4 cuando la página no respondió | |
of_play (string as_source) → long | Fija la fuente y la reproduce: la misma llamada que el reproductor de sonidos. La MISMA película no se recarga: en pausa, se reanuda donde está (of_seek(0) la reinicia). Devuelve 0 una vez iniciada, -5 cuando la fuente se rechaza al instante — vacía, http:// (descárguela antes: restclient.of_download), un formato rechazado por su nombre: of_get_last_error dice cuál, la película en curso sigue y no sigue ningún ue_failed —, -2 cuando el componente no está creado, -4 cuando la página no respondió | |
of_play (string as_source, string as_subtitles) → long | Fija la película Y su archivo de subtítulos (.vtt, o un .srt que la DLL convierte), y la reproduce: los subtítulos pertenecen a la película, déselos CON ella — fijados antes de una segunda película, se iban con la primera. "": sin subtítulos. Los mismos códigos que of_play(source); un archivo de subtítulos ilegible lo dice ue_subtitles_failed, la película sigue | |
of_pause ( ) → long | Suspende la película donde está; of_play la retoma. Devuelve 0 una vez enviado, -2 cuando el componente no está creado | |
of_stop ( ) → long | Detiene la película y vuelve a su inicio; sigue ue_stopped. Devuelve 0, -2 cuando el componente no está creado | |
of_seek (long al_ms) → long | Se sitúa en una posición de la película, en milisegundos, en reproducción o no; un archivo local busca enseguida. ue_seeked sigue, como con la barra. Devuelve 0 una vez enviado, -2 si el componente no está creado. Mientras haya un segmento fijado (of_play_range), la posición queda dentro; ib_forward_seek no retiene su código, solo al usuario | |
of_is_playing ( ) → boolean | Verdadero mientras una película está en curso — pausa incluida, no ha terminado | |
of_is_paused ( ) → boolean | Verdadero mientras la película está suspendida — por of_pause, la barra o el teclado | |
of_is_buffering ( ) → boolean | Verdadero mientras la película SE REPRODUCE pero espera sus datos — el tiempo que anunció ue_buffering. Leído del componente, nunca de una copia | |
of_duration ( ) → long | Devuelve el número de milisegundos que dura la película, 0 mientras se desconoce | |
of_position ( ) → long | Devuelve el número de milisegundos reproducidos desde el inicio; ue_progress también lo trae cada segundo | |
of_capture (string as_path) → long | Guarda la imagen mostrada ahora, al tamaño de la película: of_capture(as_path, 0). La EXTENSIÓN elige el formato: .jpg o .jpeg escribe un JPEG, todo lo demás un PNG; espera la primera imagen decodificada (10 s como máximo), así que puede seguir directamente a of_play. Devuelve 0 una vez escrita, -4 sin película, con una película que no pudo cargarse, sin imagen a tiempo, cuando una película de otro sitio rechaza sus píxeles o cuando el archivo no se puede escribir, -5 con una ruta vacía o que depende de la carpeta actual (\x, C:x), -2 si el componente no está creado; tras un retorno negativo, of_get_last_error dice por qué. Una ruta relativa se escribe en la carpeta en la que arrancó la aplicación (la carpeta actual al cargar la biblioteca, la misma en el IDE y compilada) | |
of_capture (string as_path, long al_max_width) → long | La misma captura, REDUCIDA a al_max_width píxeles de ancho (alto en proporción): la miniatura de una película 4K no es una imagen 4K. 0 conserva el tamaño de la película. Mismos retornos que of_capture(as_path) | |
of_fullscreen (boolean ab_on) → long | La película en TODO el monitor (la DLL mueve el control a una ventana propia; su ventana no se toca), o de vuelta. Por encima de todo mientras es la ventana activa: Alt+Tab hacia otra aplicación pone esa aplicación delante, y volver a la suya pone de nuevo la película por encima de todo. Doble clic, el botón de la barra, Escape, Alt+F4. Escape sale incluso cuando ib_enabled es falso. Estos gestos y esta llamada lanzan ue_fullscreen_changed (of_is_fullscreen lo lee). Devuelve 0, -2 si el componente no está creado | |
of_is_fullscreen ( ) → boolean | Verdadero mientras la película cubre el monitor | |
of_add_marker (long al_ms, string as_label) → long | Un MARCADOR en la barra: una marca clicable, y ue_marker_reached cuando la película la pasa. Devuelve 0, -5 con una posición negativa, -2 si el componente no está creado. Pertenece a la película EN PANTALLA: un nuevo is_source lo quita, añádalo DESPUÉS de la película. ue_marker_reached solo se lanza para una película que SE REPRODUCE | |
of_clear_markers ( ) → long | Quita todos los marcadores. Devuelve 0, -2 si el componente no está creado | |
of_marker_count ( ) → long | Devuelve el número de marcadores | |
of_play_range (long al_from_ms, long al_to_ms) → long | Reproduce UN segmento: a su fin, ue_ended, o con ib_loop el segmento vuelve a empezar. Mientras esté fijado, toda búsqueda — la del usuario (la barra, las teclas, un marcador) como of_seek — queda DENTRO: Inicio lleva a su comienzo, un clic más allá de su fin a su fin; la película nunca sale del extracto. Devuelve 0 una vez iniciado, -5 cuando los límites no tienen sentido o el reproductor no tiene película reproducible (of_get_last_error dice por qué), -2 cuando el componente no está creado, -4 cuando la página no respondió | |
of_clear_range ( ) → long | Libera la película de su segmento. Devuelve 0, -2 si el componente no está creado | |
of_step_frames (long al_frames) → long | Avanza o retrocede al_frames imágenes (ii_fps) y pausa; teclas . y , sobre la imagen. ue_seeked sigue, como con las teclas. Devuelve 0, -2 si el componente no está creado | |
of_add_source (string as_source) → long | Añade una película a la LISTA DE REPRODUCCIÓN: la primera pasa a ser is_source (sobre una película fijada antes, salvo que SE ESTÉ REPRODUCIENDO: la lista la sigue entonces al terminar), las siguientes se encadenan solas (ue_source_changed por cada película que sigue, y por la primera cuando esta llamada la carga). Devuelve 0, -5 con una fuente vacía, -2 si el componente no está creado | |
of_add_source (string as_source, string as_subtitles) → long | Añade una película CON su archivo de subtítulos (.vtt o .srt, convertido por la DLL): el subtítulo pertenece a esa película y se muestra solo cuando se reproduce. La forma simple y sin ambigüedad de subtitular una lista. Devuelve 0, -5 con una fuente vacía, -2 cuando el componente no está creado | |
of_clear_playlist ( ) → long | Vacía la lista; la película en curso continúa. Devuelve 0, -2 si el componente no está creado | |
of_next ( ) / of_previous ( ) → long | La película siguiente o anterior de la lista; of_playlist_index dice dónde está, y ue_source_changed sigue. Devuelve 0, -2 si el componente no está creado | |
of_playlist_count ( ) → long | Devuelve el número de películas de la lista | |
of_playlist_index ( ) → long | Devuelve el índice (desde 1) de la película de la lista en curso, 0 fuera de la lista | |
of_add_subtitles (string as_lang, string as_source) → long | Una pista de subtítulos por idioma: .vtt, o .srt convertido, del equipo o de una URL https (descargada: CORS necesario, ver ue_subtitles_failed). El botón CC de la barra las recorre. Devuelve 0, -5 con una fuente vacía, un idioma ya puesto en la película (of_remove_subtitles antes) o que contiene / o ` | , -2` si el componente no está creado |
of_remove_subtitles (string as_lang) → long | Quita la pista de un idioma de la película en pantalla (y de la película de la lista que se reproduce: no vuelve con of_previous). La pista de is_subtitles se llama default. Devuelve 0, -5 para un idioma que la película no lleva, -2 si el componente no está creado | |
of_subtitle_count ( ) → long | Devuelve el número de pistas de subtítulos | |
of_remembered_position ( ) → long | Devuelve el número de milisegundos donde se dejó is_source (ib_remember_position), 0 si no | |
of_watched_ms ( ) → long | Devuelve cuántos milisegundos de la película se han REPRODUCIDO de verdad — cada parte contada una vez, una búsqueda no ve nada. 0 para una película nueva | |
of_watched_percent ( ) → long | Devuelve la parte de la película REPRODUCIDA, de 0 a 100: una película de formación que hay que ver entera (con ib_forward_seek = false). ue_watched_completely dice cuándo llega a 100; cortada en modo demo, dice lo que se vio | |
of_has_output ( ) → boolean | Verdadero si el equipo tiene salida de audio | |
of_add_chapter (long al_ms, string as_title) → long | Un CAPÍTULO (índice): ue_chapter_changed cuando la reproducción entra. of_go_chapter salta (1-based), of_next_chapter / of_previous_chapter los recorren (cada salto lanza ue_seeked y ue_chapter_changed), of_chapter_count / of_chapter_index / of_chapters los leen, of_clear_chapters los vacía. Devuelve 0, -5 si negativo, -2 cuando el componente no está creado. Pertenece a la película EN PANTALLA: añádalo DESPUÉS de la película | |
of_clear_chapters ( ) → long | Quita todos los capítulos; la burbuja de previsualización los olvida. Devuelve 0, -2 si no está creado | |
of_go_chapter (long al_index) → long | Salta al capítulo al_index (1-based, en el orden de of_add_chapter); of_chapter_index lo lee enseguida, y ue_seeked y luego ue_chapter_changed siguen, como con un clic en la barra. Devuelve 0, -5 para un número menor que 1 o mayor que of_chapter_count(), -2 si el componente no está creado | |
of_next_chapter ( ) → long | Salta al capítulo que sigue a la posición actual; of_chapter_index lo lee enseguida, y ue_seeked y luego ue_chapter_changed siguen. Desde el último capítulo nada se mueve. Devuelve 0, -2 si no está creado | |
of_previous_chapter ( ) → long | Salta al capítulo anterior al que está la reproducción; of_chapter_index lo lee enseguida, y ue_seeked y luego ue_chapter_changed siguen. Desde el primer capítulo nada se mueve. Devuelve 0, -2 si no está creado | |
of_chapter_count ( ) → long | Devuelve el número de capítulos de la película (of_add_chapter), 0 sin ninguno | |
of_chapter_index ( ) → long | Devuelve el número (1-based) del capítulo donde está la reproducción, 0 antes del primero o sin capítulos. Leído en vivo | |
of_chapters (ref long al_ms[], ref string as_titles[]) → long | Rellena los capítulos en orden — la posición de cada uno en ms en al_ms, su título en as_titles — para construir un menú propio; un título puede contener cualquier carácter. Devuelve el número, 0 sin capítulos | |
of_picture_in_picture (boolean ab_on) → long | La película en una ventana flotante propia (true) o de vuelta (false); ue_pip_changed sigue, como cuando el usuario cierra la ventanita. of_is_pip dice si flota, of_pip_available si el equipo lo permite. Devuelve 0, -2 si no está creado | |
of_is_pip ( ) → boolean | Verdadero mientras la película flota en su ventana Picture-in-Picture; falso de nuevo cuando el usuario la cierra | |
of_pip_available ( ) → boolean | Verdadero si el motor y el equipo permiten el Picture-in-Picture: pregúntelo antes de ofrecer el botón |
Eventos #
| Evento | Cuándo |
|---|---|
ue_started (long al_duration_ms) | La película empieza de verdad; la longitud cuando el archivo la indica, 0 si no |
ue_ended (boolean ab_truncated) | La película terminó por sí misma; ab_truncated verdadero cuando el límite demo la cortó |
ue_failed (string as_message, string as_reason) | La película no pudo reproducirse. as_reason lo dice en una palabra que su código comprueba: REASON_INSECURE (una fuente http://), REASON_FORMAT (avi, wmv, flv, o un formato que el motor declara ilegible), REASON_UNSUPPORTED (archivo ausente o contenedor no decodificable), REASON_DECODE, REASON_NETWORK, REASON_NO_SOURCE, REASON_FAILED; as_message es el texto mostrado sobre la imagen. of_play no lo lanza para una fuente rechazada al instante: devuelve -5. Una entrada de la lista que no puede reproducirse lo lanza UNA vez, después de ue_source_changed |
ue_stopped ( ) | of_stop cortó una película en curso |
ue_paused ( ) / ue_resumed ( ) | La película se suspende, luego se reanuda — por su código, la barra o el teclado indistintamente; también cuando el componente se oculta (ib_pause_when_hidden) |
ue_progress (long al_position_ms, long al_duration_ms) | Una vez por segundo durante la reproducción: lo que una barra de progreso suya necesita, sin timer |
ue_seeked (long al_position_ms) | La posición se movió: el usuario (barra, flechas, marcador) o su código — of_seek, of_step_frames y las funciones de capítulo también lo lanzan, como el gesto |
ue_volume_changed (long al_percent) | El usuario giró el volumen; nunca ii_volume |
ue_rate_changed (long al_percent) | El usuario eligió una velocidad en la barra; nunca ii_rate |
ue_subtitles_changed (string as_lang) | El usuario recorrió los subtítulos (CC); vacío = ninguno |
ue_muted_changed (boolean ab_on) | El usuario silenció (true) o devolvió (false) el sonido — el altavoz de la barra, la tecla M; nunca ib_muted |
ue_fullscreen_changed (boolean ab_on) | La película pasó a pantalla completa, o volvió: doble clic, el botón, Escape, Alt+F4, o of_fullscreen. of_reset nunca lo lanza |
ue_marker_reached (long al_ms, string as_label) | La película, EN REPRODUCCIÓN, pasa un marcador; una búsqueda durante una pausa solo lanza ue_seeked |
ue_source_changed (long al_index, string as_source) | La lista de reproducción pasa a otra película: sola, al terminar la anterior, o por of_next, of_previous y el primer of_add_source |
ue_chapter_changed (long al_index, string as_title) | La reproducción entra en otro capítulo (of_add_chapter): su número (1-based, 0 antes del primero) y su título; también cuando el usuario o su código (of_go_chapter, of_next_chapter, of_previous_chapter) salta ahí |
ue_pip_changed (boolean ab_on) | La película entró (true) en la ventana Picture-in-Picture o salió de ella (false): el usuario la cerró, el motor puso ahí la película por sí solo, o of_picture_in_picture lo pidió (of_is_pip lo lee) |
ue_subtitles_failed (string as_lang, string as_reason) | Un archivo de subtítulos no pudo cargarse: una URL https cuyo servidor rechaza CORS o responde un error (REASON_NETWORK, REASON_NOT_FOUND), una URL http:// (REASON_INSECURE). La pista se quita, la película sigue. También un archivo del equipo que no se encuentra (REASON_NOT_FOUND) |
ue_buffering (boolean ab_on) | La película SE REPRODUCE pero debe esperar sus datos más de un cuarto de segundo (true) — una red lenta, un salto lejos en una película de una URL: un anillo con el acento del tema gira sobre la imagen — luego la espera termina (false): la película sigue, o se ha pausado, detenido, sustituido, o ha fallado. of_reset nunca lo lanza |
ue_watched_completely ( ) | Todas las partes de la película se han REPRODUCIDO (una búsqueda no ve nada) — una vez por película: una película de formación vista entera |
Pantalla completa, marcadores, segmento, imagen por imagen #
- Pantalla completa.
of_fullscreen(true), un doble clic en la imagen o el último botón de la barra. La DLL mueve el control a una ventana propia que cubre el monitor; su ventana PowerBuilder no se toca, y Escape (o Alt+F4) devuelve la película. Solo queda por encima de todo mientras es la ventana activa: Alt+Tab hacia otra aplicación pone esa aplicación delante, y volver a la suya pone de nuevo la película por encima de todo. Escape sale incluso cuandoib_enabledes falso.ue_fullscreen_changeddice cada cambio, en ambos sentidos: estos gestos del usuario comoof_fullscreen. - Marcadores.
of_add_marker(ms, etiqueta)pone una marca en la barra: el usuario la ve, la sobrevuela (la etiqueta), la clica (la película salta ahí,ue_seeked), yue_marker_reachedllega cuando la película la pasa. Capítulos de una formación, puntos a controlar, defectos detectados. - Segmento.
of_play_range(desde, hasta)reproduce solo un extracto; conib_looplo repite hastaof_clear_range. Toda búsqueda queda en el extracto: Inicio lleva a su comienzo, un clic más allá de su fin a su fin. En pantalla completa la barra se muestra también con el teclado (Tab). - Imagen por imagen.
of_step_frames(±n)avanza o retrocede n imágenes aii_fpspor segundo y pausa; las teclas . y , hacen lo mismo. El motor no dice la cadencia de una película: dígala usted. - La barra habla. Cada gesto tiene su evento:
ue_seeked,ue_volume_changed,ue_rate_changed(el botón de velocidad, 0,5× a 2×),ue_subtitles_changed(el botón CC),ue_muted_changed(el altavoz, la tecla M). Un desplazamiento pedido por su código lanza el mismo que el gesto:of_seek,of_step_framesy las funciones de capítulo lanzanue_seeked. Un VALOR fijado por su código queda mudo, comoSetItem:ii_volume,ii_rate,is_subtitle_lang,ib_muted.
// Chapters on the bar, then one extract in a loop
uo_video.of_add_marker(/*ms*/ 2000, /*label*/ "Intro")
uo_video.of_add_marker(/*ms*/ 5000, /*label*/ "The bunny")
uo_video.ib_loop = true
uo_video.of_play_range(/*from_ms*/ 2000, /*to_ms*/ 8000)
// Surveillance : back one picture at a time
uo_video.ii_fps = 30
uo_video.of_step_frames(/*frames*/ -1)
Lista de reproducción, subtítulos, reanudación, formatos #
- Lista de reproducción.
of_add_sourceapila películas; la primera pasa a seris_source, las siguientes se encadenan solas al final de cada una,ue_source_changednombra cada paso.of_nextyof_previousa mano, con el mismo evento:of_playlist_indexdice dónde está la lista. Conib_skip_failed, la lista que avanza sola salta una película que no puede reproducirse (suue_failedse lanza una vez); el idioma de subtítulos elegido pasa de una película a otra cuando la siguiente lo lleva. - Lo que pertenece a una película. Su segmento, sus subtítulos, marcadores y capítulos: un nuevo
is_sourcelos deja atrás (fijados antes de cualquier película, esperan a la primera). La lista de reproducción conserva los suyos: el subtítulo dado aof_add_source(película, subtítulo)vuelve con su película. Fíjelos pues DESPUÉS de la película, o dé los subtítulos con ella:of_play(film, subtitle). - Varias pistas de subtítulos.
of_add_subtitles(idioma, archivo)por idioma,of_remove_subtitles(idioma)para quitar una;is_subtitle_langelige, el botón CC de la barra las recorre. Un.srtse convierte a WebVTT al servirlo: nada que convertir por su parte. Un subtítulo dado por una URLhttpslo descarga el componente: su servidor debe permitir CORS, si noue_subtitles_failedlo dice y la película sigue sin él. - Reanudación.
ib_remember_position = true: donde se deja una película (pausa, parada) lo guarda el motor en este equipo, por usuario, y el siguienteof_playde la misma fuente reanuda ahí. Una película vista hasta el final vuelve a empezar. También cada 5 segundos durante la reproducción; se guardan las 200 últimas películas. - Formatos. Lo que WebView2 decodifica: mp4 (H.264, AAC), webm (VP8, VP9, AV1), mov (el H.264 de un iPhone o de una cámara), mkv (una grabación OBS), y los formatos de audio (mp3, wav, ogg, opus, flac, aac, m4a). No el H.265/HEVC sin la extensión de Windows (un
.movHEVC termina enue_failed, que nombra la extensión), ni AVI, WMV, FLV: el componente los rechaza por su nombre (REASON_FORMAT) en lugar de una pantalla negra. Ni HLS ni DASH: una cámara IP pasa por un flujo mp4 o webm. Solohttps: una direcciónhttp://de intranet se rechaza (REASON_INSECURE) — descargue antes la película (restclient,of_download) o sírvala desde un recurso compartido\\servidor\…. - Varias pistas de audio. Chromium las esconde tras un flag: no expuestas.
// A playlist, each film WITH its subtitles, the position remembered
uo_video.ib_remember_position = true
uo_video.of_add_source(/*source*/ "intro.mp4", /*subtitles*/ "intro.en.vtt")
uo_video.of_add_source(/*source*/ "lesson-1.mp4", /*subtitles*/ "lesson-1.en.srt") // .srt : converted by the DLL
uo_video.of_play()
// A second language for the film on screen : it stays with that film
uo_video.of_add_subtitles(/*lang*/ "fr", /*source*/ "intro.fr.vtt")
uo_video.is_subtitle_lang = "fr"
Una película de formación que hay que ver entera #
Una formación obligatoria, una consigna de seguridad: ib_forward_seek = false impide al usuario saltar hacia delante más allá de lo que ya ha visto — la barra, las flechas, Fin, un marcador — sin impedirle volver atrás. of_watched_ms y of_watched_percent dicen lo que se ha reproducido de verdad (una búsqueda no ve nada), ue_watched_completely llega una vez cuando se ha reproducido todo. En modo demo la película se detiene a los 10 segundos, y el porcentaje dice lo que se vio.
// Local variables
long ll_percent
// A training film the user must watch whole : no skipping ahead
uo_video.ib_forward_seek = false
uo_video.of_play(/*source*/ "films\safety-training.mp4", /*subtitles*/ "films\safety-training.srt")
// When the window closes : how much was really seen (ue_watched_completely says 100)
ll_percent = uo_video.of_watched_percent()
Venir del control Windows Media Player #
Muchas aplicaciones PowerBuilder incrustan el OCX de Windows Media Player en un OLECustomControl — un control que Microsoft clasifica como « heredado », y que hace caer más de una aplicación. u_pbt_video lo sustituye miembro a miembro. Dos diferencias que recordar: las posiciones están en milisegundos (WMP cuenta en segundos) y la velocidad en porcentaje (ii_rate = 150 para settings.rate = 1.5).
| Windows Media Player | u_pbt_video |
|---|---|
URL | is_source · of_play(source) |
controls.play() · controls.pause() · controls.stop() | of_play() · of_pause() · of_stop() |
controls.currentPosition | of_position() · of_seek(al_ms) |
currentMedia.duration | of_duration() |
settings.volume · settings.mute | ii_volume · ib_muted |
settings.rate | ii_rate |
settings.autoStart | ib_autoplay |
settings.setMode("loop", true) | ib_loop |
uiMode = "none" | ib_controls = false |
fullScreen | of_fullscreen() · of_is_fullscreen() |
stretchToFit | is_stretch |
closedCaption.SAMIFileName | is_subtitles (.vtt, .srt) |
currentPlaylist | of_add_source · of_next · of_previous · of_playlist_index |
PlayStateChange | ue_started · ue_paused · ue_resumed · ue_stopped · ue_ended |
PositionChange | ue_seeked |
MarkerHit | ue_marker_reached (of_add_marker) |
Buffering | ue_buffering |
MediaError | ue_failed |
Ejemplos #
Un bucle de presentación silencioso, sin barra #
// A silent showcase film, in a loop, without its bar
uo_video.ib_controls = false
uo_video.ib_muted = true
uo_video.ib_loop = true
uo_video.is_stretch = u_pbt_video.STRETCH_UNIFORMTOFILL
uo_video.of_play(/*source*/ "films\showcase.mp4")
Sus propios botones y una barra de progreso #
// cb_play.clicked
if uo_video.of_is_paused() or not uo_video.of_is_playing() then uo_video.of_play() else uo_video.of_pause()
// uo_video.ue_progress : once a second, no timer needed
hpb_progress.Position = al_position_ms * 100 / Max(al_duration_ms, 1)
Una miniatura de la película para un informe #
// Stop the film on the picture to keep
uo_video.of_play(/*source*/ "films\training.mp4")
uo_video.of_pause()
uo_video.of_seek(/*ms*/ 15000) // the frame at 0:15
// of_capture waits for the picture itself (10 s at most) : no timer to write.
// A .jpg path writes a JPEG ; 320 : a thumbnail 320 pixels wide.
// A relative path goes to the folder the application started in.
if uo_video.of_capture(/*path*/ "C:\Reports\training.jpg", /*max_width*/ 320) < 0 then MessageBox("Capture", uo_video.of_get_last_error())
Buenas prácticas #
- Un archivo del equipo antes que una URL siempre que pueda: servido en flujo por la DLL, arranca enseguida, busca sin recargar, y
of_capturepuede leer sus píxeles — lo que una película de otro sitio rechaza. - Programe
ue_faileden toda película cuya ruta dependa de los datos: es su única red, y el mensaje ya está en pantalla. - Fije
ib_autoplaysolo para un bucle de presentación: una película que arranca sola con sonido sorprende al usuario; en otros casos bastan el cartel y el botón de reproducción. ue_progresssustituye a un timer: una vez por segundo, posición y longitud, solo durante la reproducción.
Heredado de la base común #
Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.
| Miembros | Función | Detallado en |
|---|---|---|
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
is_accessible_name · is_accessible_description | El nombre y la descripción que dice un lector de pantalla | 3.4 Propiedades y eventos opcionales |