video — u_pbt_video #
← Riferimento dei componenti · Sommario della guida
Lettore video: un file della postazione — servito in flusso dalla DLL, un film lungo parte subito — o un URL, con la barra di trasporto del componente, che segue il tema: riproduzione, ricerca, tempo, muto, volume. Sottotitoli WebVTT, locandina prima della riproduzione, ciclo, velocità, inquadratura, cattura del fotogramma corrente in PNG. Tutto ciò che l'utente fa sulla barra, la tua applicazione lo sa.
▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Video player: il film, il codice che lo pilota e questa pagina, fianco a fianco (connessione Internet necessaria per il film di esempio).
In breve #
| Userobject | u_pbt_video |
| Classe degli item | — (componente senza item) |
| Serve per | Un film di formazione nell'applicazione, il video di un prodotto, la rilettura di una registrazione, un ciclo di presentazione su uno stand |
| Principio | Un <video> del motore WebView2: tutti i formati che decodifica (mp4, webm, ogv, m4v). La barra è del componente; i suoi gesti passano per gli stessi verbi delle tue chiamate, quindi gli stessi eventi |
| Dipendenza | Il runtime WebView2, già richiesto dalla libreria — nient'altro |
Avvio rapido #
// 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
Tutto ciò che regoli è una proprietà (is_source, ii_volume, ib_loop…), letta dal vivo sul componente; tutto ciò che fai è un metodo (of_play, of_pause, of_stop, of_seek, of_capture); tutto ciò che accade è un evento (ue_started, ue_ended, ue_progress…). Un file mancante non è un'eccezione: ue_failed lo dice, e il messaggio appare sull'immagine.
Proprietà #
| Proprietà | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_source | string | "" | Il film: un file della postazione (qualsiasi percorso, in flusso) o un URL http(s). Impostarlo ferma ciò che stava suonando; ib_autoplay decide se il nuovo parte da solo. Un film di qualsiasi dimensione, anche in un'applicazione a 32 bit: la DLL lo trasmette a fette, mai l'intero file in una volta; un film che il motore non sa decodificare è segnalato da ue_failed |
ib_autoplay | boolean | false | Avvia il film appena is_source è impostato; altrimenti attende of_play, la barra o la tastiera, e mostra is_poster |
ib_muted | boolean | false | Toglie l'audio, volume conservato; anche il pulsante della barra e il tasto M lo impostano |
ii_volume | integer | 100 | Volume in percentuale, 0 a 100; anche il cursore della barra e le frecce su/giù |
ib_loop | boolean | false | Ripete il film in ciclo fino a of_stop; un film in ciclo non solleva mai ue_ended |
ii_rate | integer | 100 | Velocità in percentuale, 25 a 400: 50 = metà, 200 = doppia, l'audio segue |
is_stretch | string | "uniform" | Inquadratura: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL — le quattro modalità di un'immagine |
ib_controls | boolean | true | La barra di trasporto del componente, a tema. false la nasconde: la tua finestra pilota il film |
is_poster | string | "" | La locandina mostrata prima del film: file, URL o pack.dll:NOME, come la sorgente di un'immagine. Un prefisso mono:/tint:/white:/black: ricolora un'immagine monocroma sul tema |
is_subtitles | string | "" | Un file di sottotitoli, locale o URL: WebVTT (.vtt) o SubRip (.srt, convertito dalla DLL). Una traccia; of_add_subtitles ne accumula diverse |
is_subtitle_lang | string | "" | La traccia di sottotitoli mostrata (una lingua di of_add_subtitles); vuoto = nessuna |
ii_fps | integer | 25 | Immagini al secondo del film, per of_step_frames |
ib_remember_position | boolean | false | Ricorda dove ogni film è lasciato e riprende lì al prossimo of_play della stessa sorgente |
is_theme_style | string | fluent | Stile visivo del componente (costanti THEME_STYLE_*) |
is_theme_mode | string | light | Variante chiara o scura (costanti THEME_MODE_*) |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento del tema) |
is_tooltip | string | "" | Tooltip semplice mostrato al passaggio del mouse sul componente |
is_super_tooltip_title | string | "" | Titolo del tooltip avanzato (prevale su is_tooltip) |
is_super_tooltip_text | string | "" | Testo del tooltip avanzato (markup avanzato accettato) |
is_super_tooltip_image | string | "" | Immagine del tooltip avanzato |
ib_enabled | boolean | true | false: immagine attenuata, barra e tastiera inerti; il tuo codice comanda ancora |
ib_scrub_preview | boolean | true | Una bolla di tempo segue il cursore sulla barra di scorrimento (true, predefinito), col capitolo se ce ne sono. false la nasconde |
Un clic sull'immagine mette in pausa, un secondo riprende. Tastiera, quando il film ha il focus: Spazio o K riproduci/pausa, ←/→ cinque secondi, ↑/↓ volume, M muto, Inizio/Fine.
Metodi #
| Metodo | Ruolo |
|---|---|
of_play ( ) → long | Riproduce is_source da dov'è: dall'inizio la prima volta, dalla pausa poi (ue_resumed). Rende 0 una volta inviato, -1 se il componente non è creato |
of_play (string as_source) → long | Imposta is_source e lo riproduce: la stessa chiamata del lettore audio. Rende 0 una volta inviato, -1 senza componente |
of_pause ( ) → long | Sospende il film dov'è; of_play lo riprende. Rende 0 una volta inviato, -1 senza componente |
of_stop ( ) | Ferma il film e torna al suo inizio; segue ue_stopped |
of_seek (long al_ms) → long | Si posiziona in un punto del film, in millisecondi, in riproduzione o no; un file locale cerca subito. Rende 0 una volta inviato, -1 senza componente |
of_is_playing ( ) → boolean | Vero finché un film è in corso — pausa compresa, non è finito |
of_is_paused ( ) → boolean | Vero finché il film è sospeso — da of_pause, dalla barra o dalla tastiera |
of_duration ( ) → long | Rende il numero di millisecondi che dura il film, 0 finché sconosciuto |
of_position ( ) → long | Rende il numero di millisecondi letti dall'inizio; anche ue_progress lo porta ogni secondo |
of_capture (string as_path) → long | Salva l'immagine mostrata ora in PNG ; attende la prima immagine decodificata (10 s al massimo), quindi può seguire direttamente of_play. Rende 0 una volta scritta, -4 senza film, senza immagine in tempo, o quando un film di un altro sito rifiuta i suoi pixel, -5 su un percorso vuoto o non scrivibile |
of_fullscreen (boolean ab_on) → long | Il film su TUTTO il monitor (la DLL sposta il controllo in una finestra sua; la tua finestra non è toccata), o di ritorno. Doppio clic, il pulsante della barra, Esc. Rende 0, -1 se il componente non è creato |
of_is_fullscreen ( ) → boolean | Vero finché il film copre il monitor |
of_add_marker (long al_ms, string as_label) → long | Un MARCATORE sulla barra: un segno cliccabile, e ue_marker_reached quando il film lo supera. Rende 0, -5 su una posizione negativa, -1 se il componente non è creato |
of_clear_markers ( ) → long | Rimuove tutti i marcatori. Rende 0, -1 se il componente non è creato |
of_marker_count ( ) → long | Rende il numero di marcatori |
of_play_range (long al_from_ms, long al_to_ms) → long | Suona UN segmento: alla fine ue_ended, o con ib_loop il segmento riparte. Rende 0, -5 su limiti senza senso, -1 se il componente non è creato |
of_clear_range ( ) → long | Libera il film dal suo segmento. Rende 0, -1 se il componente non è creato |
of_step_frames (long al_frames) → long | Avanza o arretra di al_frames immagini (ii_fps) e mette in pausa; tasti . e , sull'immagine. Rende 0, -1 se il componente non è creato |
of_add_source (string as_source) → long | Aggiunge un film alla PLAYLIST: il primo diventa is_source, i successivi si susseguono da soli (ue_source_changed). Rende 0, -5 su una sorgente vuota, -1 se il componente non è creato |
of_add_source (string as_source, string as_subtitles) → long | Aggiunge un film CON il suo file di sottotitoli (.vtt o .srt, convertito dalla DLL): il sottotitolo appartiene a quel film e appare solo quando viene riprodotto. Il modo semplice e senza ambiguità di sottotitolare una playlist. Rende 0, -5 su una sorgente vuota |
of_clear_playlist ( ) → long | Svuota la lista; il film in corso continua. Rende 0, -1 se il componente non è creato |
of_next ( ) / of_previous ( ) → long | Il film successivo o precedente della lista. Rende 0, -1 se il componente non è creato |
of_playlist_count ( ) → long | Rende il numero di film della lista |
of_playlist_index ( ) → long | Rende l'indice (da 1) del film della lista in corso, 0 fuori lista |
of_add_subtitles (string as_lang, string as_source) → long | Una traccia di sottotitoli per lingua: .vtt, o .srt convertito dalla DLL. Il pulsante CC della barra le scorre. Rende 0, -5 su una sorgente vuota, -1 se il componente non è creato |
of_subtitle_count ( ) → long | Rende il numero di tracce di sottotitoli |
of_remembered_position ( ) → long | Rende il numero di millisecondi in cui is_source è stato lasciato (ib_remember_position), 0 altrimenti |
of_has_output ( ) → boolean | Vero se la postazione ha un'uscita audio |
of_add_chapter (long al_ms, string as_title) → long | Un CAPITOLO (sommario): ue_chapter_changed quando la riproduzione vi entra. of_go_chapter salta (1-based), of_next_chapter / of_previous_chapter li scorrono, of_chapter_count / of_chapter_index / of_chapters li leggono, of_clear_chapters li svuota. Rende 0, -5 se negativo |
of_clear_chapters ( ) → long | Rimuove tutti i capitoli; la barra e la bolla di anteprima li dimenticano. Rende 0, -1 se non creato |
of_go_chapter (long al_index) → long | Salta al capitolo al_index (1-based, nell'ordine di of_add_chapter) e riproduce da lì; ue_seeked segue. Rende 0, -5 per un numero inferiore a 1 |
of_next_chapter ( ) → long | Salta al capitolo dopo la posizione corrente; ue_seeked segue. Dall'ultimo capitolo nulla si muove. Rende 0, -1 se non creato |
of_previous_chapter ( ) → long | Salta al capitolo prima di quello in cui si trova la riproduzione; ue_seeked segue. Dal primo capitolo nulla si muove. Rende 0, -1 se non creato |
of_chapter_count ( ) → long | Rende il numero di capitoli del film (of_add_chapter), 0 senza |
of_chapter_index ( ) → long | Rende il numero (1-based) del capitolo in cui si trova la riproduzione, 0 prima del primo o senza capitoli. Letto dal vivo |
of_chapters (ref long al_ms[], ref string as_titles[]) → long | Riempie i capitoli in ordine — la posizione di ciascuno in ms in al_ms, il titolo in as_titles — per costruire un menu tuo. Rende il numero, 0 senza capitoli |
of_picture_in_picture (boolean ab_on) → long | Il film in una finestra flottante propria (true) o indietro (false); ue_pip_changed segue. of_is_pip dice se flotta, of_pip_available se la postazione lo permette. Rende 0, -1 se non creato |
of_is_pip ( ) → boolean | Vero finché il film flotta nella sua finestra Picture-in-Picture; di nuovo falso quando l'utente la chiude |
of_pip_available ( ) → boolean | Vero se il motore e la postazione permettono il Picture-in-Picture: da chiedere prima di offrire il pulsante |
Eventi #
| Evento | Quando |
|---|---|
ue_started (long al_duration_ms) | Il film parte davvero; la lunghezza quando il file la dice, 0 altrimenti |
ue_ended (boolean ab_truncated) | Il film è finito da sé; ab_truncated vero quando il limite demo l'ha tagliato |
ue_failed (string as_message) | Il film non ha potuto suonare: file mancante, formato non decodificabile, URL muto; il messaggio appare anche sull'immagine |
ue_stopped ( ) | of_stop ha tagliato un film in corso |
ue_paused ( ) / ue_resumed ( ) | Il film è sospeso, poi riprende — dal tuo codice, dalla barra o dalla tastiera indifferentemente |
ue_progress (long al_position_ms, long al_duration_ms) | Una volta al secondo durante la riproduzione: ciò che una tua barra di avanzamento aspetta, senza timer |
ue_seeked (long al_position_ms) | L'UTENTE ha spostato la posizione (barra, frecce, marcatore); mai of_seek |
ue_volume_changed (long al_percent) | L'utente ha girato il volume; mai ii_volume |
ue_rate_changed (long al_percent) | L'utente ha scelto una velocità sulla barra; mai ii_rate |
ue_subtitles_changed (string as_lang) | L'utente ha scorso i sottotitoli (CC); vuoto = nessuno |
ue_fullscreen_changed (boolean ab_on) | Il film è passato a schermo intero, o è tornato |
ue_marker_reached (long al_ms, string as_label) | Il film supera un marcatore |
ue_source_changed (long al_index, string as_source) | La playlist passa a un altro film |
ue_chapter_changed (long al_index, string as_title) | La riproduzione entra in un altro capitolo (of_add_chapter): il suo numero (1-based, 0 prima del primo) e il titolo |
ue_pip_changed (boolean ab_on) | Il film entra (true) o esce (false) dalla finestra Picture-in-Picture — con of_picture_in_picture o dall'utente che la chiude |
Schermo intero, marcatori, segmento, fotogramma per fotogramma #
- Schermo intero.
of_fullscreen(true), un doppio clic sull'immagine o l'ultimo pulsante della barra. La DLL sposta il controllo in una finestra sua che copre il monitor; la tua finestra PowerBuilder non è toccata, ed Esc riporta il film.ue_fullscreen_changedlo dice in entrambi i sensi. - Marcatori.
of_add_marker(ms, etichetta)mette un segno sulla barra: l'utente lo vede, lo sorvola (l'etichetta), lo clicca (il film vi salta,ue_seeked), eue_marker_reachedarriva quando il film lo supera. Capitoli di una formazione, punti da controllare, difetti rilevati. - Segmento.
of_play_range(da, a)suona solo un estratto; conib_looplo ripete fino aof_clear_range. - Fotogramma per fotogramma.
of_step_frames(±n)avanza o arretra di n immagini aii_fpsal secondo e mette in pausa; i tasti . e , fanno lo stesso. Il motore non dice la cadenza di un film: dilla tu. - La barra parla. Ciò che solo l'utente può fare è riportato da un evento suo:
ue_seeked,ue_volume_changed,ue_rate_changed(il pulsante di velocità, 0,5× a 2×),ue_subtitles_changed(il pulsante CC). Ciò che fa il tuo codice, lo sa già:of_seeknon solleva nulla.
// 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)
Playlist, sottotitoli, ripresa, formati #
- Playlist.
of_add_sourceaccumula film; il primo diventais_source, i successivi si susseguono da soli alla fine di ciascuno,ue_source_changednomina ogni passaggio.of_nexteof_previousa mano. - Più tracce di sottotitoli.
of_add_subtitles(lingua, file)per lingua;is_subtitle_langsceglie, il pulsante CC della barra scorre. Un.srtè convertito in WebVTT dalla DLL al momento di servirlo: nulla da convertire da parte tua. - Ripresa.
ib_remember_position = true: dove un film è lasciato (pausa, stop) è conservato dal motore su questa postazione, per utente, e il prossimoof_playdella stessa sorgente riprende lì. Un film visto fino in fondo riparte dall'inizio. - Formati. Ciò che WebView2 decodifica: mp4 (H.264, AAC), webm (VP8, VP9, AV1), ogv (Theora), e i formati audio (mp3, wav, ogg, flac, aac, m4a). Niente H.265/HEVC senza l'estensione Windows, né AVI, WMV, MKV, MOV vecchi: il componente li rifiuta per nome (
ue_failednomina l'estensione) invece di uno schermo nero. Né HLS né DASH: una telecamera IP passa per un flusso mp4 o webm. - Più tracce audio. Chromium le nasconde dietro un flag: non esposte.
// 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()
Esempi #
Un ciclo di presentazione silenzioso, senza 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")
I tuoi pulsanti e una barra di avanzamento #
// 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 del film per un rapporto #
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())
Buone pratiche #
- Un file della postazione piuttosto che un URL appena puoi: servito in flusso dalla DLL, parte subito, cerca senza ricaricare, e
of_capturepuò leggerne i pixel — ciò che un film di un altro sito rifiuta. - Scripta
ue_failedsu ogni film il cui percorso dipende dai dati: è la tua unica rete, e il messaggio è già sullo schermo. - Imposta
ib_autoplaysolo per un ciclo di presentazione: un film che parte da solo con l'audio sorprende l'utente; altrove bastano la locandina e il pulsante di riproduzione. ue_progresssostituisce un timer: una volta al secondo, posizione e lunghezza, solo durante la riproduzione.
Ereditato dalla base comune #
Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |