PBToolboxAI v4 ← Site

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 o JPEG. 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 #

Userobjectu_pbt_video
Classe degli item— (componente senza item)
Serve perUn film di formazione nell'applicazione, il video di un prodotto, la rilettura di una registrazione, un ciclo di presentazione su uno stand
PrincipioUn <video> del motore WebView2: tutti i formati che decodifica (mp4, webm, m4v, mov, mkv). La barra è del componente; i suoi gesti passano per gli stessi verbi delle tue chiamate, quindi gli stessi eventi
DipendenzaIl 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(/*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

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àTipoPredefinitoRuolo
is_sourcestring""Il film: un file della postazione (qualsiasi percorso, in flusso) o un URL https. Un indirizzo http:// è rifiutato (ue_failed, REASON_INSECURE): il motore lo promuove a https e fallisce — scarica prima il film (restclient, of_download). Formati: mp4, webm, m4v, mov (un film di iPhone o di videocamera in H.264), mkv e i formati audio; avi, wmv e flv sono rifiutati dal loro nome (REASON_FORMAT). 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. Un NUOVO film lascia indietro ciò che apparteneva al vecchio: il suo segmento, i sottotitoli, i marcatori e i capitoli (impostati prima di ogni film, aspettano il primo); un film della playlist conserva i propri sottotitoli
ib_autoplaybooleanfalseAvvia il film appena is_source è impostato; altrimenti attende of_play, la barra o la tastiera, e mostra is_poster
ib_mutedbooleanfalseToglie l'audio, volume conservato; anche il pulsante della barra e il tasto M lo impostano
ii_volumeinteger100Volume in percentuale, 0 a 100; anche il cursore della barra e le frecce su/giù
ib_loopbooleanfalseRipete il film in ciclo fino a of_stop; un film in ciclo non solleva mai ue_ended
ii_rateinteger100Velocità in percentuale, 25 a 400: 50 = metà, 200 = doppia, l'audio segue
is_stretchstring"uniform"Inquadratura: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL — le quattro modalità di un'immagine
ib_controlsbooleantrueLa barra di trasporto del componente, a tema. false la nasconde: la tua finestra pilota il film
is_posterstring""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_subtitlesstring""Un file di sottotitoli, locale o URL https: WebVTT (.vtt) o SubRip (.srt, convertito — UTF-8, UTF-16 o la code page ANSI della postazione). Un URL è SCARICATO dal componente: il suo server deve consentire CORS (GitHub, un CDN lo fanno); un rifiuto, o un URL http://, è detto da ue_subtitles_failed e il film continua. Una traccia; of_add_subtitles ne accumula diverse. Appartiene al film: un nuovo is_source lo toglie
is_subtitle_langstring""La traccia di sottotitoli mostrata (una lingua di of_add_subtitles); vuoto = nessuna
ii_fpsinteger25Immagini al secondo del film, per of_step_frames
ib_remember_positionbooleanfalseRicorda dove ogni film è lasciato e riprende lì al prossimo of_play della stessa sorgente
is_theme_stylestring""Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio
is_theme_modestring""Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio
il_theme_accentlong-1Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema)
is_tooltipstring""Tooltip semplice mostrato al passaggio del mouse sul componente
is_super_tooltip_titlestring""Titolo del tooltip avanzato (prevale su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip avanzato (markup avanzato accettato)
is_super_tooltip_imagestring""Immagine del tooltip avanzato
ib_enabledbooleantruefalse: immagine attenuata, barra e tastiera inerti — tranne Esc a schermo intero: se ne può sempre uscire; il tuo codice comanda ancora
ib_scrub_previewbooleantrueUna bolla di tempo segue il cursore sulla barra di scorrimento (true, predefinito), col capitolo se ce ne sono. false la nasconde
ib_pause_when_hiddenbooleantrueMette in pausa il film quando il componente è NASCOSTO (un'altra pagina di un tab o di un dock PBToolboxAI, PBT_SetVisible): ue_paused segue, e il film attende of_play, non riprende mai da solo. false lo lascia suonare (una parete di schermi). Un Tab NATIVO di PowerBuilder non avvisa il componente: chiama of_pause nel suo SelectionChanged

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 #

MetodoRuolo
of_play ( ) → longRiproduce is_source da dov'è: dall'inizio la prima volta, dalla pausa poi (ue_resumed). Rende 0 una volta inviato, -2 se il componente non è creato
of_play (string as_source) → longImposta is_source e lo riproduce: la stessa chiamata del lettore audio. Rende 0 una volta inviato, -1 senza componente
of_pause ( ) → longSospende 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) → longSi posiziona in un punto del film, in millisecondi, in riproduzione o no; un file locale cerca subito. ue_seeked segue, come per la barra. Rende 0 una volta inviato, -2 se il componente non è creato
of_is_playing ( ) → booleanVero finché un film è in corso — pausa compresa, non è finito
of_is_paused ( ) → booleanVero finché il film è sospeso — da of_pause, dalla barra o dalla tastiera
of_is_buffering ( ) → booleanVero finché il film GIRA ma attende i suoi dati — il tempo annunciato da ue_buffering. Letto dal componente, mai da una copia
of_duration ( ) → longRende il numero di millisecondi che dura il film, 0 finché sconosciuto
of_position ( ) → longRende il numero di millisecondi letti dall'inizio; anche ue_progress lo porta ogni secondo
of_capture (string as_path) → longSalva l'immagine mostrata ora, alla dimensione del film: of_capture(as_path, 0). L'ESTENSIONE sceglie il formato: .jpg o .jpeg scrive un JPEG, tutto il resto un PNG; attende la prima immagine decodificata (10 s al massimo), quindi può seguire direttamente of_play. Rende 0 una volta scritta, -4 senza film, con un film che non si è potuto caricare, senza immagine in tempo, quando un film di un altro sito rifiuta i suoi pixel o quando il file non può essere scritto, -5 su un percorso vuoto o che dipende dalla cartella corrente (\x, C:x), -2 se il componente non è creato; dopo un ritorno negativo, of_get_last_error dice perché. Un percorso relativo si scrive nella cartella in cui l'applicazione è partita (la cartella corrente al caricamento della libreria, la stessa nell'IDE e compilata)
of_capture (string as_path, long al_max_width) → longLa stessa cattura, RIDOTTA a al_max_width pixel di larghezza (altezza in proporzione): la miniatura di un film 4K non è un'immagine 4K. 0 conserva la dimensione del film. Stessi ritorni di of_capture(as_path)
of_fullscreen (boolean ab_on) → longIl film su TUTTO il monitor (la DLL sposta il controllo in una finestra sua; la tua finestra non è toccata), o di ritorno. Sopra tutto finché è la finestra attiva: Alt+Tab verso un'altra applicazione porta quella davanti, e tornare alla tua rimette il film sopra tutto. Doppio clic, il pulsante della barra, Esc, Alt+F4. Esc esce anche quando ib_enabled è falso. Questi gesti e questa chiamata sollevano ue_fullscreen_changed (of_is_fullscreen lo legge). Rende 0, -2 se il componente non è creato
of_is_fullscreen ( ) → booleanVero finché il film copre il monitor
of_add_marker (long al_ms, string as_label) → longUn MARCATORE sulla barra: un segno cliccabile, e ue_marker_reached quando il film lo supera. Rende 0, -5 su una posizione negativa, -2 se il componente non è creato
of_clear_markers ( ) → longRimuove tutti i marcatori. Rende 0, -2 se il componente non è creato
of_marker_count ( ) → longRende il numero di marcatori
of_play_range (long al_from_ms, long al_to_ms) → longSuona UN segmento: alla fine ue_ended, o con ib_loop il segmento riparte. Rende 0, -5 su limiti senza senso, -2 se il componente non è creato
of_clear_range ( ) → longLibera il film dal suo segmento. Rende 0, -2 se il componente non è creato
of_step_frames (long al_frames) → longAvanza o arretra di al_frames immagini (ii_fps) e mette in pausa; tasti . e , sull'immagine. ue_seeked segue, come per i tasti. Rende 0, -2 se il componente non è creato
of_add_source (string as_source) → longAggiunge un film alla PLAYLIST: il primo diventa is_source (sopra un film impostato prima, a meno che non STIA SUONANDO: la playlist lo segue allora alla sua fine), i successivi si susseguono da soli (ue_source_changed per ogni film che segue, e per il primo quando questa chiamata lo carica). Rende 0, -5 su una sorgente vuota, -2 se il componente non è creato
of_add_source (string as_source, string as_subtitles) → longAggiunge 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 ( ) → longSvuota la lista; il film in corso continua. Rende 0, -2 se il componente non è creato
of_next ( ) / of_previous ( ) → longIl film successivo o precedente della lista; of_playlist_index dice dove si trova, e ue_source_changed segue. Rende 0, -2 se il componente non è creato
of_playlist_count ( ) → longRende il numero di film della lista
of_playlist_index ( ) → longRende l'indice (da 1) del film della lista in corso, 0 fuori lista
of_add_subtitles (string as_lang, string as_source) → longUna traccia di sottotitoli per lingua: .vtt, o .srt convertito, dalla postazione o da un URL https (scaricato: CORS necessario, vedi ue_subtitles_failed). Il pulsante CC della barra le scorre. Rende 0, -5 su una sorgente vuota, una lingua già posta sul film (prima of_remove_subtitles) o che contiene / o `, -2` se il componente non è creato
of_remove_subtitles (string as_lang) → longToglie la traccia di una lingua dal film sullo schermo (e dal film della lista che suona: non torna con of_previous). La traccia di is_subtitles si chiama default. Rende 0, -5 per una lingua che il film non porta, -2 se il componente non è creato
of_subtitle_count ( ) → longRende il numero di tracce di sottotitoli
of_remembered_position ( ) → longRende il numero di millisecondi in cui is_source è stato lasciato (ib_remember_position), 0 altrimenti
of_has_output ( ) → booleanVero se la postazione ha un'uscita audio
of_add_chapter (long al_ms, string as_title) → longUn CAPITOLO (sommario): ue_chapter_changed quando la riproduzione vi entra. of_go_chapter salta (1-based), of_next_chapter / of_previous_chapter li scorrono (ogni salto solleva ue_seeked e ue_chapter_changed), of_chapter_count / of_chapter_index / of_chapters li leggono, of_clear_chapters li svuota. Rende 0, -5 se negativo
of_clear_chapters ( ) → longRimuove tutti i capitoli; la barra e la bolla di anteprima li dimenticano. Rende 0, -2 se non creato
of_go_chapter (long al_index) → longSalta al capitolo al_index (1-based, nell'ordine di of_add_chapter); of_chapter_index lo legge subito, e ue_seeked poi ue_chapter_changed seguono, come per un clic sulla barra. Rende 0, -5 per un numero inferiore a 1 o superiore a of_chapter_count(), -2 se il componente non è creato
of_next_chapter ( ) → longSalta al capitolo dopo la posizione corrente; of_chapter_index lo legge subito, e ue_seeked poi ue_chapter_changed seguono. Dall'ultimo capitolo nulla si muove. Rende 0, -2 se non creato
of_previous_chapter ( ) → longSalta al capitolo prima di quello in cui si trova la riproduzione; of_chapter_index lo legge subito, e ue_seeked poi ue_chapter_changed seguono. Dal primo capitolo nulla si muove. Rende 0, -2 se non creato
of_chapter_count ( ) → longRende il numero di capitoli del film (of_add_chapter), 0 senza
of_chapter_index ( ) → longRende 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[]) → longRiempie i capitoli in ordine — la posizione di ciascuno in ms in al_ms, il titolo in as_titles — per costruire un menu tuo; un titolo può contenere qualsiasi carattere. Rende il numero, 0 senza capitoli
of_picture_in_picture (boolean ab_on) → longIl film in una finestra flottante propria (true) o indietro (false); ue_pip_changed segue, come quando l'utente chiude la piccola finestra. of_is_pip dice se flotta, of_pip_available se la postazione lo permette. Rende 0, -2 se non creato
of_is_pip ( ) → booleanVero finché il film flotta nella sua finestra Picture-in-Picture; di nuovo falso quando l'utente la chiude
of_pip_available ( ) → booleanVero se il motore e la postazione permettono il Picture-in-Picture: da chiedere prima di offrire il pulsante

Eventi #

EventoQuando
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, string as_reason)Il film non ha potuto suonare. as_reason lo dice in una parola che il tuo codice verifica: REASON_INSECURE (una sorgente http://), REASON_FORMAT (avi, wmv, flv, o un formato che il motore dichiara non riproducibile), REASON_UNSUPPORTED (file mancante o contenitore non decodificabile), REASON_DECODE, REASON_NETWORK, REASON_NO_SOURCE, REASON_FAILED; as_message è il testo mostrato 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; anche quando il componente è nascosto (ib_pause_when_hidden)
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)La posizione si è spostata: l'utente (barra, frecce, marcatore) o il tuo codice — anche of_seek, of_step_frames e le funzioni dei capitoli lo sollevano, come il gesto
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_muted_changed (boolean ab_on)L'utente ha tolto (true) o ridato (false) il suono — l'altoparlante della barra, il tasto M; mai ib_muted
ue_fullscreen_changed (boolean ab_on)Il film è passato a schermo intero, o ne è tornato: doppio clic, il pulsante, Esc, Alt+F4, o of_fullscreen. of_reset non lo solleva mai
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: da sola, finito il precedente, o con of_next, of_previous e il primo of_add_source
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; anche quando l'utente o il tuo codice (of_go_chapter, of_next_chapter, of_previous_chapter) vi salta
ue_pip_changed (boolean ab_on)Il film è entrato (true) nella finestra Picture-in-Picture o ne è uscito (false): l'utente l'ha chiusa, il motore vi ha messo il film da solo, o of_picture_in_picture l'ha chiesto (of_is_pip lo legge)
ue_subtitles_failed (string as_lang, string as_reason)Un file di sottotitoli non si è potuto caricare: un URL https il cui server rifiuta CORS o risponde un errore (REASON_NETWORK, REASON_NOT_FOUND), un URL http:// (REASON_INSECURE). La traccia è tolta, il film continua
ue_buffering (boolean ab_on)Il film GIRA ma deve attendere i suoi dati per più di un quarto di secondo (true) — una rete lenta, un salto lontano in un film da un URL: un anello nel colore d'accento del tema gira sull'immagine — poi l'attesa finisce (false): il film riparte, oppure è stato messo in pausa, fermato, sostituito, o è fallito. of_reset non lo solleva mai

Schermo intero, marcatori, segmento, fotogramma per fotogramma #

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

Playlist, sottotitoli, ripresa, formati #

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

Esempi #

Un ciclo di presentazione silenzioso, senza 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")

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 #

// 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())

Buone pratiche #

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.

MembriRuoloDescritto in
of_resetRiportare il componente a zero3.6 Riportare un componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsScorciatoie da tastiera del componente3.5 Le scorciatoie da tastiera
of_is_created · of_is_ready · of_get_last_errorSe è nato, se è pronto, cosa è fallito3.7 Diagnostica
of_save_as_png · of_save_as_jpgEsportare il rendering in immagine3.8 Esportare il rendering come immagine
of_set_redrawRaggruppare le modifiche in un solo ridisegno3.10 Buone pratiche
of_preload_iconsIcone mostrate senza ritardoVisualizzazione istantanea: of_icon
of_set_translationTradurre una dicitura del componente5.2 Adattare un'etichetta: of_set_translation
of_focus_webviewDare il focus al componente6.4 Tastiera e focus
of_print · of_print_to_pdfStampare, o scrivere un PDF6.9 Stampare
of_set_property · of_get_property · of_component_namePilotare una proprietà per nome3.1 Il motore delle proprietà

← Riferimento dei componenti · Sommario della guida