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 (il film di esempio è fornito con la dimostrazione; solo l'esempio 3 viene da Internet).
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, m4v, mov, mkv). 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
// 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
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 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. Imposta quindi i suoi sottotitoli, marcatori e capitoli DOPO di lui — o dai i sottotitoli insieme: of_play(source, subtitles). Lo STESSO film reimpostato non viene ricaricato: continua da dov'è |
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. Solo https: un indirizzo http:// è rifiutato, non si vede nulla e la proprietà si rilegge vuota |
is_subtitles | string | "" | 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 — impostalo quindi DOPO is_source, o usa of_play(source, subtitles). Un file della postazione introvabile è detto allo stesso modo (ue_subtitles_failed, REASON_NOT_FOUND); una traccia rifiutata lascia vuota la proprietà |
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 — una pausa, un arresto e ogni 5 secondi durante la riproduzione (chiudere la finestra può perdere quegli ultimi secondi) — e riprende lì al prossimo of_play della stessa sorgente, comunque sia scritto il percorso. Conservato dal motore su questa postazione, per utente, per gli ultimi 200 film |
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio |
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello 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 — tranne Esc a schermo intero: se ne può sempre uscire; 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 |
ib_pause_when_hidden | boolean | true | Mette 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 |
ib_forward_seek | boolean | true | Un film di formazione da GUARDARE: false impedisce all'utente di cercare oltre il punto più lontano già riprodotto — la barra, le frecce, Fine, un marcatore, i tasti fotogramma per fotogramma; tornare indietro resta libero, e il tuo codice (of_seek) non è trattenuto. of_watched_ms / of_watched_percent leggono ciò che è stato riprodotto, ue_watched_completely dice quando lo è stato tutto |
ib_skip_failed | boolean | false | Una playlist che avanza DA SOLA salta un film che non può essere riprodotto (il suo ue_failed è sollevato, dopo ue_source_changed) invece di fermarsi lì |
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. I tasti . e , avanzano e arretrano di un fotogramma, Esc esce dallo schermo intero o chiude il menu della velocità. Nel menu della velocità: ↑/↓, Inizio/Fine, Invio sceglie, Esc e Tab lo chiudono. Su un lettore senza film, Spazio e il pulsante Riproduci non fanno nulla.
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 avviato, -5 quando il lettore non può riprodurre nulla — nessuna sorgente, o una sorgente rifiutata subito (http://, un formato rifiutato dal nome): of_get_last_error dice quale e nessun ue_failed segue —, -2 quando il componente non è creato, -4 quando la pagina non ha risposto | |
of_play (string as_source) → long | Imposta la sorgente e la riproduce: la stessa chiamata del lettore di suoni. Lo STESSO film non viene ricaricato: in pausa, riprende da dov'è (of_seek(0) lo fa ripartire dall'inizio). Rende 0 una volta avviato, -5 quando la sorgente è rifiutata subito — vuota, http:// (scaricala prima: restclient.of_download), un formato rifiutato dal nome: of_get_last_error dice quale, il film in corso continua e nessun ue_failed segue —, -2 quando il componente non è creato, -4 quando la pagina non ha risposto | |
of_play (string as_source, string as_subtitles) → long | Imposta il film E il suo file di sottotitoli (.vtt, o un .srt che la DLL converte), poi lo riproduce: i sottotitoli appartengono al film, dalli CON lui — impostati prima di un secondo film, se ne andavano con il primo. "": nessun sottotitolo. Gli stessi codici di of_play(source); un file di sottotitoli illeggibile è detto da ue_subtitles_failed, il film continua | |
of_pause ( ) → long | Sospende il film dov'è; of_play lo riprende. Rende 0 una volta inviato, -2 quando il componente non è creato | |
of_stop ( ) → long | Ferma il film e torna al suo inizio; segue ue_stopped. Rende 0, -2 quando il componente non è creato | |
of_seek (long al_ms) → long | Si 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. Finché un segmento è impostato (of_play_range), la posizione resta al suo interno; ib_forward_seek non trattiene il tuo codice, solo l'utente | |
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_is_buffering ( ) → boolean | Vero finché il film GIRA ma attende i suoi dati — il tempo annunciato da ue_buffering. Letto dal componente, mai da una copia | |
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, 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) → long | La 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) → long | Il 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 ( ) → 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, -2 se il componente non è creato. Appartiene al film SULLO SCHERMO: un nuovo is_source lo toglie, aggiungilo DOPO il film. ue_marker_reached parte solo per un film che SUONA | |
of_clear_markers ( ) → long | Rimuove tutti i marcatori. Rende 0, -2 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 | Riproduce UN segmento: alla sua fine, ue_ended, o con ib_loop il segmento riparte. Finché è impostato, ogni ricerca — quella dell'utente (la barra, i tasti, un marcatore) come of_seek — resta AL SUO INTERNO: Inizio porta al suo inizio, un clic oltre la sua fine alla sua fine; il film non lascia mai l'estratto. Rende 0 una volta avviato, -5 quando i limiti non hanno senso o il lettore non ha un film riproducibile (of_get_last_error dice perché), -2 quando il componente non è creato, -4 quando la pagina non ha risposto | |
of_clear_range ( ) → long | Libera il film dal suo segmento. Rende 0, -2 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. ue_seeked segue, come per i tasti. Rende 0, -2 se il componente non è creato | |
of_add_source (string as_source) → long | Aggiunge 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) → 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, -2 quando il componente non è creato | |
of_clear_playlist ( ) → long | Svuota la lista; il film in corso continua. Rende 0, -2 se il componente non è creato | |
of_next ( ) / of_previous ( ) → long | Il 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 ( ) → 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 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) → long | Toglie 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 ( ) → 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_watched_ms ( ) → long | Rende quanti millisecondi del film sono stati davvero RIPRODOTTI — ogni parte contata una volta, una ricerca non guarda nulla. 0 per un nuovo film | |
of_watched_percent ( ) → long | Rende la parte del film RIPRODOTTA, da 0 a 100: un film di formazione da guardare per intero (con ib_forward_seek = false). ue_watched_completely dice quando raggiunge 100; tagliato in modalità demo, dice ciò che è stato visto | |
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 (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, -2 quando il componente non è creato. Appartiene al film SULLO SCHERMO: aggiungilo DOPO il film | |
of_clear_chapters ( ) → long | Rimuove tutti i capitoli; la bolla di anteprima li dimentica. Rende 0, -2 se non creato | |
of_go_chapter (long al_index) → long | Salta 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 ( ) → long | Salta 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 ( ) → long | Salta 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 ( ) → 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; un titolo può contenere qualsiasi carattere. 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, 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 ( ) → 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, 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. of_play non lo solleva per una sorgente rifiutata subito: rende -5. Una voce di playlist che non può essere riprodotta lo solleva UNA volta, dopo ue_source_changed |
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, IN RIPRODUZIONE, passa un marcatore; una ricerca durante una pausa solleva solo ue_seeked |
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. Anche un file della postazione introvabile (REASON_NOT_FOUND) |
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 |
ue_watched_completely ( ) | Ogni parte del film è stata RIPRODOTTA (una ricerca non guarda nulla) — una volta per film: un film di formazione visto per intero |
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 (o Alt+F4) riporta il film. Resta sopra tutto solo finché è la finestra attiva: Alt+Tab verso un'altra applicazione porta quella davanti, e tornare alla tua rimette il film sopra tutto. Esc esce anche quandoib_enabledè falso.ue_fullscreen_changeddice ogni passaggio, in entrambi i sensi: questi gesti dell'utente comeof_fullscreen. - 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. Ogni ricerca resta nell'estratto: Inizio porta al suo inizio, un clic oltre la sua fine alla sua fine. A schermo intero la barra si mostra anche da tastiera (Tab). - 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. Ogni gesto ha il suo evento:
ue_seeked,ue_volume_changed,ue_rate_changed(il pulsante di velocità, 0,5× a 2×),ue_subtitles_changed(il pulsante CC),ue_muted_changed(l'altoparlante, il tasto M). Uno spostamento chiesto dal tuo codice solleva lo stesso evento del gesto:of_seek,of_step_framese le funzioni dei capitoli sollevanoue_seeked. Un VALORE impostato dal tuo codice resta muto, comeSetItem: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)
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, con lo stesso evento:of_playlist_indexdice dove si trova la lista. Conib_skip_failed, la playlist che avanza da sola salta un film che non può essere riprodotto (il suoue_failedè sollevato una volta); la lingua dei sottotitoli scelta segue da un film all'altro quando il successivo la porta. - Ciò che appartiene a un film. Il suo segmento, i sottotitoli, i marcatori e i capitoli: un nuovo
is_sourceli lascia indietro (impostati prima di ogni film, aspettano il primo). La playlist conserva i suoi: il sottotitolo dato aof_add_source(film, sottotitolo)torna con il suo film. Impostali quindi DOPO il film, o dai i sottotitoli con lui:of_play(film, subtitle). - Più tracce di sottotitoli.
of_add_subtitles(lingua, file)per lingua,of_remove_subtitles(lingua)per toglierne una;is_subtitle_langsceglie, il pulsante CC della barra scorre. Un.srtè convertito in WebVTT al momento di servirlo: niente da convertire da parte tua. Un sottotitolo dato da un URLhttpsè scaricato dal componente: il suo server deve consentire CORS, altrimentiue_subtitles_failedlo dice e il film continua senza. - 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. Anche ogni 5 secondi durante la riproduzione; sono conservati gli ultimi 200 film. - Formati. Ciò che WebView2 decodifica: mp4 (H.264, AAC), webm (VP8, VP9, AV1), mov (l'H.264 di un iPhone o di una videocamera), mkv (una registrazione OBS), e i formati audio (mp3, wav, ogg, opus, flac, aac, m4a). Non l'H.265/HEVC senza l'estensione Windows (un
.movHEVC finisce inue_failed, che nomina l'estensione), né AVI, WMV, FLV: il componente li rifiuta dal loro nome (REASON_FORMAT) invece di uno schermo nero. Né HLS né DASH: una telecamera IP passa per un flusso mp4 o webm. Solohttps: un indirizzohttp://di intranet è rifiutato (REASON_INSECURE) — scarica prima il film (restclient,of_download) o servilo da una condivisione\\server\…. - Più tracce audio. Chromium le nasconde dietro un flag: non esposte.
// 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"
Un film di formazione da guardare per intero #
Una formazione obbligatoria, un'istruzione di sicurezza: ib_forward_seek = false impedisce all'utente di saltare in avanti oltre ciò che ha già visto — la barra, le frecce, Fine, un marcatore — senza impedirgli di tornare indietro. of_watched_ms e of_watched_percent dicono ciò che è stato davvero riprodotto (una ricerca non guarda nulla), ue_watched_completely arriva una volta quando lo è stato tutto. In modalità demo il film si ferma a 10 secondi, e la percentuale dice ciò che è stato visto.
// 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()
Venire dal controllo Windows Media Player #
Molte applicazioni PowerBuilder incorporano l'OCX di Windows Media Player in un OLECustomControl — un controllo che Microsoft classifica come « legacy », e che fa cadere più di un'applicazione. u_pbt_video lo sostituisce membro per membro. Due differenze da ricordare: le posizioni sono in millisecondi (WMP conta in secondi) e la velocità in percentuale (ii_rate = 150 per 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 |
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 #
- 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à |
is_accessible_name · is_accessible_description | Il nome e la descrizione che dice un lettore di schermo | 3.4 Proprietà ed event opzionali |