video — u_pbt_video #
← Référence des composants · Sommaire du guide
Lecteur vidéo : un fichier du poste — servi en flux par la DLL, un long film démarre tout de suite — ou une URL, avec la barre de transport du composant, qui suit le thème : lecture, recherche, temps, muet, volume. Sous-titres WebVTT, affiche avant lecture, boucle, vitesse, cadrage, capture de l'image courante en PNG. Tout ce que l'utilisateur fait sur la barre, votre application le sait.
▶ Le voir en vrai — Application de démonstration, tuile Video player : le film, le code qui le pilote et cette page, côte à côte (connexion Internet requise pour le film d'exemple).
En bref #
| Userobject | u_pbt_video |
| Classe d'items | — (composant sans items) |
| Sert à | Un film de formation dans l'application, la vidéo d'un produit, la relecture d'un enregistrement, une boucle de présentation sur un stand |
| Principe | Un <video> du moteur WebView2 : tous les formats qu'il décode (mp4, webm, ogv, m4v). La barre est celle du composant ; ses gestes passent par les mêmes verbes que vos appels, donc les mêmes événements |
| Dépendance | Le runtime WebView2, déjà requis par la bibliothèque — rien d'autre |
Démarrage rapide #
// 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
Tout ce qui se règle est une propriété (is_source, ii_volume, ib_loop…), lue en direct sur le composant ; ce qui se fait est une méthode (of_play, of_pause, of_stop, of_seek, of_capture) ; ce qui arrive est un événement (ue_started, ue_ended, ue_progress…). Un fichier absent n'est pas une exception : ue_failed le dit, et le message s'affiche sur l'image.
Propriétés #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
is_source | string | "" | Le film : un fichier du poste (n'importe quel chemin, servi en flux) ou une URL http(s). Le poser arrête ce qui jouait ; ib_autoplay décide si le nouveau démarre seul. Un film de n'importe quelle taille, en 32 bits aussi : la DLL le sert par tranches, jamais le fichier entier d'un coup ; un film que le moteur ne décode pas est signalé par ue_failed |
ib_autoplay | boolean | false | Démarre le film dès que is_source est posé ; sinon il attend of_play, la barre ou le clavier, et montre is_poster |
ib_muted | boolean | false | Coupe le son, volume conservé ; le bouton de la barre et la touche M le posent aussi |
ii_volume | integer | 100 | Volume en pour cent, 0 à 100 ; le curseur de la barre et les flèches haut/bas aussi |
ib_loop | boolean | false | Rejoue le film en boucle jusqu'à of_stop ; un film en boucle ne lève jamais ue_ended |
ii_rate | integer | 100 | Vitesse en pour cent, 25 à 400 : 50 = moitié, 200 = double, le son suit |
is_stretch | string | "uniform" | Cadrage : STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL — les quatre modes d'une image |
ib_controls | boolean | true | La barre de transport du composant, au thème. false la masque : votre fenêtre pilote le film |
is_poster | string | "" | L'affiche montrée avant le film : fichier, URL ou pack.dll:NOM, comme la source d'une image. Un préfixe mono:/tint:/white:/black: recolore une image monochrome au thème |
is_subtitles | string | "" | Un fichier de sous-titres, local ou URL : WebVTT (.vtt) ou SubRip (.srt, converti par la DLL). Une piste ; of_add_subtitles en empile plusieurs |
is_subtitle_lang | string | "" | La piste de sous-titres affichée (langue d'of_add_subtitles) ; vide = aucune |
ii_fps | integer | 25 | Images par seconde du film, pour of_step_frames |
ib_remember_position | boolean | false | Retient où chaque film est laissé et y reprend au prochain of_play de la même source |
is_theme_style | string | fluent | Style visuel du composant (constantes THEME_STYLE_*) |
is_theme_mode | string | light | Variante claire ou sombre (constantes THEME_MODE_*) |
il_theme_accent | long | -1 | Couleur d'accent de ce composant (-1 = accent du thème) |
is_tooltip | string | "" | Info-bulle simple affichée au survol du composant |
is_super_tooltip_title | string | "" | Titre de l'info-bulle enrichie (prend le pas sur is_tooltip) |
is_super_tooltip_text | string | "" | Texte de l'info-bulle enrichie (balisage riche accepté) |
is_super_tooltip_image | string | "" | Image de l'info-bulle enrichie |
ib_enabled | boolean | true | false : image assombrie, barre et clavier inertes ; votre code commande toujours |
ib_scrub_preview | boolean | true | Une bulle de temps suit le curseur sur la barre de défilement (true, par défaut), avec le chapitre s'il y en a. false la masque |
Un clic sur l'image met en pause, un second reprend. Clavier, quand le film a le focus : Espace ou K lecture/pause, ←/→ cinq secondes, ↑/↓ volume, M muet, Début/Fin.
Méthodes #
| Méthode | Rôle |
|---|---|
of_play ( ) → long | Joue is_source d'où il est : du début la première fois, de la pause ensuite (ue_resumed). Rend 0 une fois envoyé, -1 si le composant n'est pas créé |
of_play (string as_source) → long | Pose is_source et le joue : le même appel que celui du lecteur de sons. Rend 0 une fois envoyé, -1 sans composant |
of_pause ( ) → long | Suspend le film où il est ; of_play le reprend. Rend 0 une fois envoyé, -1 sans composant |
of_stop ( ) | Arrête le film et revient à son début ; ue_stopped suit |
of_seek (long al_ms) → long | Se place à une position du film, en millisecondes, en lecture ou non ; un fichier local cherche tout de suite. Rend 0 une fois envoyé, -1 sans composant |
of_is_playing ( ) → boolean | Vrai tant qu'un film est en cours — en pause compris, il n'est pas fini |
of_is_paused ( ) → boolean | Vrai tant que le film est suspendu — par of_pause, la barre ou le clavier |
of_duration ( ) → long | Rend le nombre de millisecondes que dure le film, 0 tant qu'il est inconnu |
of_position ( ) → long | Rend le nombre de millisecondes lues depuis le début ; ue_progress l'apporte aussi chaque seconde |
of_capture (string as_path) → long | Enregistre l'image montrée maintenant en PNG ; attend la première image décodée (10 s au plus), donc peut suivre of_play directement. Rend 0 une fois écrite, -4 sans film, sans image à temps, ou quand un film d'un autre site refuse ses pixels, -5 sur un chemin vide ou inscriptible |
of_fullscreen (boolean ab_on) → long | Le film sur TOUT le moniteur (la DLL déplace le contrôle dans une fenêtre à elle ; votre fenêtre n'est pas touchée), ou de retour. Double-clic, le bouton de la barre, Échap. Rend 0, -1 si le composant n'est pas créé |
of_is_fullscreen ( ) → boolean | Vrai tant que le film couvre le moniteur |
of_add_marker (long al_ms, string as_label) → long | Un MARQUEUR sur la barre : un repère cliquable, et ue_marker_reached quand le film le passe. Rend 0, -5 sur une position négative, -1 si le composant n'est pas créé |
of_clear_markers ( ) → long | Retire tous les marqueurs. Rend 0, -1 si le composant n'est pas créé |
of_marker_count ( ) → long | Rend le nombre de marqueurs |
of_play_range (long al_from_ms, long al_to_ms) → long | Joue UN segment : à la fin, ue_ended, ou avec ib_loop le segment reprend. Rend 0, -5 sur des bornes sans sens, -1 si le composant n'est pas créé |
of_clear_range ( ) → long | Libère le film de son segment. Rend 0, -1 si le composant n'est pas créé |
of_step_frames (long al_frames) → long | Avance ou recule d'al_frames images (ii_fps) et met en pause ; touches . et , sur l'image. Rend 0, -1 si le composant n'est pas créé |
of_add_source (string as_source) → long | Ajoute un film à la LISTE DE LECTURE : le premier devient is_source, les suivants s'enchaînent d'eux-mêmes (ue_source_changed). Rend 0, -5 sur une source vide, -1 si le composant n'est pas créé |
of_add_source (string as_source, string as_subtitles) → long | Ajoute un film AVEC son fichier de sous-titres (.vtt ou .srt, converti par la DLL) : le sous-titre appartient à ce film et s'affiche seulement quand il passe. La façon simple et sans ambiguïté de sous-titrer une liste. Rend 0, -5 sur une source vide |
of_clear_playlist ( ) → long | Vide la liste ; le film en cours continue. Rend 0, -1 si le composant n'est pas créé |
of_next ( ) / of_previous ( ) → long | Le film suivant ou précédent de la liste. Rend 0, -1 si le composant n'est pas créé |
of_playlist_count ( ) → long | Rend le nombre de films de la liste |
of_playlist_index ( ) → long | Rend l'indice (depuis 1) du film de la liste en cours, 0 hors liste |
of_add_subtitles (string as_lang, string as_source) → long | Une piste de sous-titres par langue : .vtt, ou .srt converti par la DLL. Le bouton CC de la barre les fait défiler. Rend 0, -5 sur une source vide, -1 si le composant n'est pas créé |
of_subtitle_count ( ) → long | Rend le nombre de pistes de sous-titres |
of_remembered_position ( ) → long | Rend le nombre de millisecondes où is_source a été laissé (ib_remember_position), 0 sinon |
of_has_output ( ) → boolean | Vrai si le poste a une sortie audio |
of_add_chapter (long al_ms, string as_title) → long | Un CHAPITRE (table des matières) : ue_chapter_changed quand la lecture y entre. of_go_chapter y saute (à partir de 1), of_next_chapter / of_previous_chapter les parcourent, of_chapter_count / of_chapter_index / of_chapters les lisent, of_clear_chapters les vide. Rend 0, -5 si négatif (numéros à partir de 1) |
of_clear_chapters ( ) → long | Retire tous les chapitres ; la barre et la bulle de survol les oublient. Rend 0, -1 si le composant n'est pas créé |
of_go_chapter (long al_index) → long | Saute au chapitre al_index (à partir de 1, dans l'ordre de of_add_chapter) et lit à partir de là ; ue_seeked suit. Rend 0, -5 pour un numéro inférieur à 1 |
of_next_chapter ( ) → long | Saute au chapitre qui suit la position courante ; ue_seeked suit. Rien ne bouge depuis le dernier chapitre. Rend 0, -1 si le composant n'est pas créé |
of_previous_chapter ( ) → long | Saute au chapitre qui précède celui où se trouve la lecture ; ue_seeked suit. Rien ne bouge depuis le premier chapitre. Rend 0, -1 si le composant n'est pas créé |
of_chapter_count ( ) → long | Rend le nombre de chapitres du film (of_add_chapter), 0 sans |
of_chapter_index ( ) → long | Rend le numéro (à partir de 1) du chapitre où se trouve la lecture, 0 avant le premier ou sans chapitre. Lu en direct |
of_chapters (ref long al_ms[], ref string as_titles[]) → long | Remplit les chapitres dans l'ordre — la position de chacun en ms dans al_ms, son titre dans as_titles — pour bâtir un menu à vous. Rend le nombre de chapitres, 0 sans |
of_picture_in_picture (boolean ab_on) → long | Le film dans une fenêtre flottante à lui (true) ou de retour (false) ; ue_pip_changed suit. of_is_pip dit s'il flotte, of_pip_available si le poste l'autorise. Rend 0, -1 si le composant n'est pas créé |
of_is_pip ( ) → boolean | Vrai tant que le film flotte dans sa fenêtre Picture-in-Picture ; faux de nouveau quand l'utilisateur la ferme |
of_pip_available ( ) → boolean | Vrai si le moteur et le poste autorisent le Picture-in-Picture : à demander avant d'offrir le bouton |
Événements #
| Événement | Quand |
|---|---|
ue_started (long al_duration_ms) | Le film démarre vraiment ; la longueur quand le fichier la dit, 0 sinon |
ue_ended (boolean ab_truncated) | Le film est fini de lui-même ; ab_truncated vrai quand la limite démo l'a coupé |
ue_failed (string as_message) | Le film n'a pas pu jouer : fichier absent, format non décodable, URL muette ; le message s'affiche aussi sur l'image |
ue_stopped ( ) | of_stop a coupé un film en cours |
ue_paused ( ) / ue_resumed ( ) | Le film est suspendu, puis reprend — par votre code, la barre ou le clavier, indifféremment |
ue_progress (long al_position_ms, long al_duration_ms) | Une fois par seconde pendant la lecture : ce qu'une barre de progression à vous attend, sans timer |
ue_seeked (long al_position_ms) | L'UTILISATEUR a déplacé la position (barre, flèches, marqueur) ; jamais of_seek |
ue_volume_changed (long al_percent) | L'utilisateur a tourné le volume ; jamais ii_volume |
ue_rate_changed (long al_percent) | L'utilisateur a choisi une vitesse sur la barre ; jamais ii_rate |
ue_subtitles_changed (string as_lang) | L'utilisateur a fait défiler les sous-titres (CC) ; vide = aucun |
ue_fullscreen_changed (boolean ab_on) | Le film est passé plein écran, ou revenu |
ue_marker_reached (long al_ms, string as_label) | Le film passe un marqueur |
ue_source_changed (long al_index, string as_source) | La liste de lecture passe à un autre film |
ue_chapter_changed (long al_index, string as_title) | La lecture entre dans un autre chapitre (of_add_chapter) : son numéro (à partir de 1, 0 avant le premier) et son titre |
ue_pip_changed (boolean ab_on) | Le film entre (true) ou quitte (false) la fenêtre Picture-in-Picture — par of_picture_in_picture ou par l'utilisateur qui la ferme |
Plein écran, marqueurs, segment, image par image #
- Plein écran.
of_fullscreen(true), un double-clic sur l'image ou le dernier bouton de la barre. La DLL déplace le contrôle dans une fenêtre à elle qui couvre le moniteur ; votre fenêtre PowerBuilder n'est pas touchée, et Échap ramène le film.ue_fullscreen_changedle dit dans les deux sens. - Marqueurs.
of_add_marker(ms, libellé)pose un repère sur la barre : l'utilisateur le voit, le survole (le libellé), le clique (le film y saute,ue_seeked), etue_marker_reachedarrive quand le film le passe. Chapitres d'une formation, points à contrôler, défauts relevés. - Segment.
of_play_range(de, à)ne joue qu'un extrait ; avecib_loopil le rejoue jusqu'àof_clear_range. - Image par image.
of_step_frames(±n)avance ou recule de n images àii_fpspar seconde et met en pause ; les touches . et , font de même. Le moteur ne dit pas la cadence d'un film : dites-la. - La barre parle. Ce que seul l'utilisateur peut faire est rapporté par un événement à lui :
ue_seeked,ue_volume_changed,ue_rate_changed(le bouton de vitesse, 0,5× à 2×),ue_subtitles_changed(le bouton CC). Ce que votre code fait, il le sait déjà :of_seekne lève rien.
// 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)
Liste de lecture, sous-titres, reprise, formats #
- Liste de lecture.
of_add_sourceempile des films ; le premier devientis_source, les suivants s'enchaînent d'eux-mêmes à la fin de chacun,ue_source_changednomme chaque passage.of_nextetof_previousà la main. - Plusieurs pistes de sous-titres.
of_add_subtitles(langue, fichier)par langue ;is_subtitle_langchoisit, le bouton CC de la barre fait défiler. Un.srtest converti en WebVTT par la DLL au moment de le servir : rien à convertir chez vous. - Reprise.
ib_remember_position = true: là où un film est laissé (pause, arrêt) est retenu par le moteur sur ce poste, par utilisateur, et le prochainof_playde la même source y reprend. Un film vu jusqu'au bout repart du début. - Formats. Ce que WebView2 décode : mp4 (H.264, AAC), webm (VP8, VP9, AV1), ogv (Theora), et les formats audio (mp3, wav, ogg, flac, aac, m4a). Pas le H.265/HEVC sans l'extension Windows, ni l'AVI, le WMV, le MKV, le MOV anciens : le composant les refuse par leur nom (
ue_failednomme l'extension) au lieu d'un écran noir. Ni HLS ni DASH : une caméra IP passe par un flux mp4 ou webm. - Pistes audio multiples. Chromium les cache derrière un drapeau : non exposées.
// 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()
Exemples #
Une boucle de présentation, silencieuse, sans barre #
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")
Vos propres boutons et une barre de progression #
// 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)
Une vignette du film pour un rapport #
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())
Bonnes pratiques #
- Un fichier du poste plutôt qu'une URL dès que vous le pouvez : servi en flux par la DLL, il démarre tout de suite, cherche sans recharger, et
of_capturepeut lire ses pixels — ce qu'un film d'un autre site refuse. - Scriptez
ue_failedsur tout film dont le chemin dépend des données : c'est votre seul filet, et le message est déjà à l'écran. - Ne posez
ib_autoplayque pour une boucle de présentation : un film qui démarre seul avec le son surprend l'utilisateur ; ailleurs, l'affiche et le bouton de lecture suffisent. ue_progressremplace un timer : une fois par seconde, position et longueur, uniquement pendant la lecture.
Hérité du socle commun #
Ces membres existent sur tous les composants visuels — ils ne sont pas propres à celui-ci. Ils sont détaillés une seule fois, dans les chapitres transverses ; cette table dit seulement où les lire.
| Membres | Rôle | Détaillé dans |
|---|---|---|
of_reset | Remettre le composant à zéro | 3.6 Remettre un composant à zéro : of_reset() |
of_register_shortcut · of_clear_shortcuts | Raccourcis clavier du composant | 3.5 Les raccourcis clavier |
of_is_created · of_is_ready · of_get_last_error | S'il est né, s'il est prêt, ce qui a échoué | 3.7 Diagnostic |
of_save_as_png · of_save_as_jpg | Exporter le rendu en image | 3.8 Exporter le rendu en image |
of_set_redraw | Grouper les modifications en un seul repaint | 3.10 Bonnes pratiques |
of_preload_icons | Icônes affichées sans délai | Affichage instantané : of_icon |
of_set_translation | Traduire un libellé du composant | 5.2 Adapter un libellé : of_set_translation |
of_focus_webview | Donner le focus au composant | 6.4 Clavier et focus |
of_print · of_print_to_pdf | Imprimer, ou écrire un PDF | 6.9 Imprimer |
of_set_property · of_get_property · of_component_name | Piloter une propriété par son nom | 3.1 Le moteur de propriétés |