PBToolboxAI v4 ← Site

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 (conexión a Internet necesaria para la película de ejemplo).


De un vistazo #

Userobjectu_pbt_video
Clase de items— (componente sin items)
Sirve paraUna 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
PrincipioUn <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
DependenciaEl 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(/*source*/ "films\training.mp4")

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

PropiedadTipoPredeterminadoFunción
is_sourcestring""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
ib_autoplaybooleanfalseArranca 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_mutedbooleanfalseSilencia el sonido, volumen conservado; el botón de la barra y la tecla M también lo fijan
ii_volumeinteger100Volumen en porcentaje, 0 a 100; también el control de la barra y las flechas arriba/abajo
ib_loopbooleanfalseRepite la película en bucle hasta of_stop; una película en bucle nunca lanza ue_ended
ii_rateinteger100Velocidad en porcentaje, 25 a 400: 50 = mitad, 200 = doble, el sonido sigue
is_stretchstring"uniform"Encuadre: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL — los cuatro modos de una imagen
ib_controlsbooleantrueLa barra de transporte del componente, con el tema. false la oculta: su ventana controla la película
is_posterstring""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_subtitlesstring""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
is_subtitle_langstring""La pista de subtítulos mostrada (un idioma de of_add_subtitles); vacío = ninguna
ii_fpsinteger25Imágenes por segundo de la película, para of_step_frames
ib_remember_positionbooleanfalseRecuerda dónde se dejó cada película y reanuda ahí en el siguiente of_play de la misma fuente
is_theme_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el componente
is_super_tooltip_titlestring""Título del tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido
ib_enabledbooleantruefalse: imagen atenuada, barra y teclado inertes — salvo Escape en pantalla completa: siempre se puede salir; su código sigue mandando
ib_scrub_previewbooleantrueUna 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_hiddenbooleantruePone 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

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étodoFunción
of_play ( ) → longReproduce is_source desde donde está: desde el principio la primera vez, desde la pausa después (ue_resumed). Devuelve 0 una vez enviado, -2 si el componente no está creado
of_play (string as_source) → longFija is_source y la reproduce: la misma llamada que la del reproductor de sonido. Devuelve 0 una vez enviado, -1 sin componente
of_pause ( ) → longSuspende 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) → longSe 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
of_is_playing ( ) → booleanVerdadero mientras una película está en curso — pausa incluida, no ha terminado
of_is_paused ( ) → booleanVerdadero mientras la película está suspendida — por of_pause, la barra o el teclado
of_is_buffering ( ) → booleanVerdadero 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 ( ) → longDevuelve el número de milisegundos que dura la película, 0 mientras se desconoce
of_position ( ) → longDevuelve el número de milisegundos reproducidos desde el inicio; ue_progress también lo trae cada segundo
of_capture (string as_path) → longGuarda 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) → longLa 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) → longLa 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 ( ) → booleanVerdadero mientras la película cubre el monitor
of_add_marker (long al_ms, string as_label) → longUn 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
of_clear_markers ( ) → longQuita todos los marcadores. Devuelve 0, -2 si el componente no está creado
of_marker_count ( ) → longDevuelve el número de marcadores
of_play_range (long al_from_ms, long al_to_ms) → longReproduce UN segmento: al final, ue_ended, o con ib_loop el segmento vuelve a empezar. Devuelve 0, -5 con límites sin sentido, -2 si el componente no está creado
of_clear_range ( ) → longLibera la película de su segmento. Devuelve 0, -2 si el componente no está creado
of_step_frames (long al_frames) → longAvanza 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) → longAñ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) → longAñ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 ( ) → longVacía la lista; la película en curso continúa. Devuelve 0, -2 si el componente no está creado
of_next ( ) / of_previous ( ) → longLa 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 ( ) → longDevuelve el número de películas de la lista
of_playlist_index ( ) → longDevuelve 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) → longUna 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) → longQuita 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 ( ) → longDevuelve el número de pistas de subtítulos
of_remembered_position ( ) → longDevuelve el número de milisegundos donde se dejó is_source (ib_remember_position), 0 si no
of_has_output ( ) → booleanVerdadero si el equipo tiene salida de audio
of_add_chapter (long al_ms, string as_title) → longUn 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
of_clear_chapters ( ) → longQuita todos los capítulos; la barra y la burbuja de previsualización los olvidan. Devuelve 0, -2 si no está creado
of_go_chapter (long al_index) → longSalta 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 ( ) → longSalta 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 ( ) → longSalta 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 ( ) → longDevuelve el número de capítulos de la película (of_add_chapter), 0 sin ninguno
of_chapter_index ( ) → longDevuelve 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[]) → longRellena 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) → longLa 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 ( ) → booleanVerdadero mientras la película flota en su ventana Picture-in-Picture; falso de nuevo cuando el usuario la cierra
of_pip_available ( ) → booleanVerdadero si el motor y el equipo permiten el Picture-in-Picture: pregúntelo antes de ofrecer el botón

Eventos #

EventoCuá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
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 pasa un marcador
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
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

Pantalla completa, marcadores, segmento, imagen por imagen #

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

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

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 #

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.

MiembrosFunciónDetallado en
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
of_is_created · of_is_ready · of_get_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar una propiedad por su nombre3.1 El motor de propiedades

← Referencia de componentes · Índice de la guía