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. 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 (conexión a Internet necesaria para la película de ejemplo).
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, ogv, m4v). 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
uo_video.is_subtitles = "films\training.vtt"
uo_video.of_play("films\training.mp4")
// A URL plays the same way
uo_video.of_play("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(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 http(s). 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 |
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 |
is_subtitles | string | "" | Un archivo de subtítulos, local o URL: WebVTT (.vtt) o SubRip (.srt, convertido por la DLL). Una pista; of_add_subtitles apila varias |
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 dejó cada película y reanuda ahí en el siguiente of_play de la misma fuente |
is_theme_style | string | fluent | Estilo visual del componente (constantes THEME_STYLE_*) |
is_theme_mode | string | light | Variante clara u oscura (constantes THEME_MODE_*) |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento 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; 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 |
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.
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 enviado, -1 si el componente no está creado |
of_play (string as_source) → long | Fija is_source y la reproduce: la misma llamada que la del reproductor de sonido. Devuelve 0 una vez enviado, -1 sin componente |
of_pause ( ) → long | Suspende la película donde está; of_play la retoma. Devuelve 0 una vez enviado, -1 sin componente |
of_stop ( ) | Detiene la película y vuelve a su inicio; sigue ue_stopped |
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. Devuelve 0 una vez enviado, -1 sin componente |
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_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 en 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, sin imagen a tiempo, o cuando una película de otro sitio rechaza sus píxeles, -5 con una ruta vacía o no escribible |
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. Doble clic, el botón de la barra, Escape. Devuelve 0, -1 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, -1 si el componente no está creado |
of_clear_markers ( ) → long | Quita todos los marcadores. Devuelve 0, -1 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: al final, ue_ended, o con ib_loop el segmento vuelve a empezar. Devuelve 0, -5 con límites sin sentido, -1 si el componente no está creado |
of_clear_range ( ) → long | Libera la película de su segmento. Devuelve 0, -1 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. Devuelve 0, -1 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, las siguientes se encadenan solas (ue_source_changed). Devuelve 0, -5 con una fuente vacía, -1 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 |
of_clear_playlist ( ) → long | Vacía la lista; la película en curso continúa. Devuelve 0, -1 si el componente no está creado |
of_next ( ) / of_previous ( ) → long | La película siguiente o anterior de la lista. Devuelve 0, -1 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 por la DLL. El botón CC de la barra las recorre. Devuelve 0, -5 con una fuente vacía, -1 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_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, of_chapter_count / of_chapter_index / of_chapters los leen, of_clear_chapters los vacía. Devuelve 0, -5 si negativo |
of_clear_chapters ( ) → long | Quita todos los capítulos; la barra y la burbuja de previsualización los olvidan. Devuelve 0, -1 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) y reproduce desde ahí; ue_seeked sigue. Devuelve 0, -5 para un número menor que 1 |
of_next_chapter ( ) → long | Salta al capítulo que sigue a la posición actual; ue_seeked sigue. Desde el último capítulo nada se mueve. Devuelve 0, -1 si no está creado |
of_previous_chapter ( ) → long | Salta al capítulo anterior al que está la reproducción; ue_seeked sigue. Desde el primer capítulo nada se mueve. Devuelve 0, -1 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. 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. of_is_pip dice si flota, of_pip_available si el equipo lo permite. Devuelve 0, -1 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) | La película no pudo reproducirse: archivo ausente, formato no decodificable, URL muda; el mensaje también se muestra sobre la imagen |
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 |
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) | El USUARIO movió la posición (barra, flechas, marcador); nunca of_seek |
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_fullscreen_changed (boolean ab_on) | La película pasó a pantalla completa, o volvió |
ue_marker_reached (long al_ms, string as_label) | La película pasa un marcador |
ue_source_changed (long al_index, string as_source) | La lista de reproducción pasa a otra película |
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 |
ue_pip_changed (boolean ab_on) | La película entra (true) o sale (false) de la ventana Picture-in-Picture — por of_picture_in_picture o por el usuario que la cierra |
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 devuelve la película.ue_fullscreen_changedlo dice en ambos sentidos. - 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. - 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. Lo que solo el usuario puede hacer lo reporta un evento propio:
ue_seeked,ue_volume_changed,ue_rate_changed(el botón de velocidad, 0,5× a 2×),ue_subtitles_changed(el botón CC). Lo que hace su código, ya lo sabe:of_seekno lanza nada.
// Chapters on the bar, then one extract in a loop
uo_video.of_add_marker(2000, "Intro")
uo_video.of_add_marker(5000, "The bunny")
uo_video.ib_loop = true
uo_video.of_play_range(2000, 8000)
// Surveillance : back one picture at a time
uo_video.ii_fps = 30
uo_video.of_step_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. - Varias pistas de subtítulos.
of_add_subtitles(idioma, archivo)por idioma;is_subtitle_langelige, el botón CC de la barra recorre. Un.srtes convertido a WebVTT por la DLL al servirlo: nada que convertir por su parte. - 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. - Formatos. Lo que WebView2 decodifica: mp4 (H.264, AAC), webm (VP8, VP9, AV1), ogv (Theora), y los formatos de audio (mp3, wav, ogg, flac, aac, m4a). Sin H.265/HEVC sin la extensión de Windows, ni AVI, WMV, MKV, MOV antiguos: el componente los rechaza por su nombre (
ue_failednombra la extensión) en vez de una pantalla negra. Ni HLS ni DASH: una cámara IP pasa por un flujo mp4 o webm. - Varias pistas de audio. Chromium las esconde tras un flag: no expuestas.
// A playlist with two subtitle tracks, the position remembered
uo_video.ib_remember_position = true
uo_video.of_add_subtitles("en", "film.en.vtt")
uo_video.of_add_subtitles("fr", "film.fr.srt") // .srt : converted by the DLL
uo_video.is_subtitle_lang = "fr"
uo_video.of_add_source("intro.mp4")
uo_video.of_add_source("lesson-1.mp4")
uo_video.of_play()
Ejemplos #
Un bucle de presentación silencioso, sin barra #
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("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 #
uo_video.of_play("films\training.mp4")
uo_video.of_pause()
uo_video.of_seek(15000) // the frame at 0:15
// of_capture waits for the picture itself (10 s at most) : no timer to write
if uo_video.of_capture("report\training.png") <> 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 |