video — u_pbt_video #
← Referência dos componentes · Índice do guia
Leitor de vídeo: um ficheiro do posto — servido em fluxo pela DLL, um filme longo começa de imediato — ou um URL, com a barra de transporte do componente, que segue o tema: reprodução, procura, tempo, silêncio, volume. Legendas WebVTT, cartaz antes da reprodução, ciclo, velocidade, enquadramento, captura da imagem atual em PNG ou JPEG. Tudo o que o utilizador faz na barra, a sua aplicação sabe.
▶ Ver ao vivo — Aplicação de demonstração, mosaico Video player: o filme, o código que o controla e esta página, lado a lado (o filme de exemplo vem com a demonstração; só o exemplo 3 vem da Internet).
Em resumo #
| Userobject | u_pbt_video |
| Classe de items | — (componente sem items) |
| Serve para | Um filme de formação na aplicação, o vídeo de um produto, a repetição de uma gravação, um ciclo de apresentação num stand |
| Princípio | Um <video> do motor WebView2: todos os formatos que descodifica (mp4, webm, m4v, mov, mkv). A barra é do componente; os seus gestos passam pelos mesmos verbos que as suas chamadas, logo os mesmos eventos |
| Dependência | O runtime WebView2, já exigido pela biblioteca — nada mais |
Início rápido #
// A film of the workstation, streamed by the DLL : starts at once
uo_video.is_poster = "img\packimages.dll:PNG/COVER" // shown until the film starts
// 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
Tudo o que se define é uma propriedade (is_source, ii_volume, ib_loop…), lida em direto no componente; tudo o que se faz é um método (of_play, of_pause, of_stop, of_seek, of_capture); tudo o que acontece é um evento (ue_started, ue_ended, ue_progress…). Um ficheiro ausente não é uma exceção: ue_failed di-lo, e a mensagem aparece sobre a imagem.
Propriedades #
| Propriedade | Tipo | Predefinição | Função |
|---|---|---|---|
is_source | string | "" | O filme: um ficheiro do posto (qualquer caminho, em fluxo) ou um URL https. Um endereço http:// é recusado (ue_failed, REASON_INSECURE): o motor promove-o a https e falha — descarregue primeiro o filme (restclient, of_download). Formatos: mp4, webm, m4v, mov (um filme de iPhone ou de câmara em H.264), mkv e os formatos áudio; avi, wmv e flv são recusados pelo nome (REASON_FORMAT). Defini-lo pára o que tocava; ib_autoplay decide se o novo arranca sozinho. Um filme de qualquer tamanho, também numa aplicação de 32 bits: a DLL serve-o por fatias, nunca o ficheiro inteiro de uma vez; um filme que o motor não consegue descodificar é assinalado por ue_failed. Um NOVO filme deixa para trás o que pertencia ao anterior: o seu segmento, legendas, marcadores e capítulos (definidos antes de qualquer filme, esperam pelo primeiro); um filme da lista conserva as suas próprias legendas. Defina pois as suas legendas, marcadores e capítulos DEPOIS dele — ou dê as legendas com ele: of_play(source, subtitles). O MESMO filme definido de novo não é recarregado: continua de onde está |
ib_autoplay | boolean | false | Arranca o filme assim que is_source é definido; senão espera por of_play, pela barra ou pelo teclado, e mostra is_poster |
ib_muted | boolean | false | Corta o som, volume mantido; o botão da barra e a tecla M também o definem |
ii_volume | integer | 100 | Volume em percentagem, 0 a 100; também o cursor da barra e as setas cima/baixo |
ib_loop | boolean | false | Repete o filme em ciclo até of_stop; um filme em ciclo nunca dispara ue_ended |
ii_rate | integer | 100 | Velocidade em percentagem, 25 a 400: 50 = metade, 200 = dobro, o som segue |
is_stretch | string | "uniform" | Enquadramento: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL — os quatro modos de uma imagem |
ib_controls | boolean | true | A barra de transporte do componente, com o tema. false esconde-a: a sua janela controla o filme |
is_poster | string | "" | O cartaz mostrado antes do filme: ficheiro, URL ou pack.dll:NOME, como a origem de uma imagem. Um prefixo mono:/tint:/white:/black: recolore uma imagem monocromática ao tema. Só https: um endereço http:// é recusado, nada aparece e a propriedade relê-se vazia |
is_subtitles | string | "" | Um ficheiro de legendas, local ou URL https: WebVTT (.vtt) ou SubRip (.srt, convertido — UTF-8, UTF-16 ou a página de código ANSI do posto). Um URL é DESCARREGADO pelo componente: o seu servidor tem de autorizar CORS (GitHub, um CDN fazem-no); uma recusa, ou um URL http://, é dita por ue_subtitles_failed e o filme continua. Uma faixa; of_add_subtitles empilha várias. Pertence ao filme: um novo is_source retira-a — defina-o pois DEPOIS de is_source, ou use of_play(source, subtitles). Um ficheiro do posto que não se encontra é dito da mesma forma (ue_subtitles_failed, REASON_NOT_FOUND); uma faixa recusada deixa a propriedade vazia |
is_subtitle_lang | string | "" | A faixa de legendas mostrada (um idioma de of_add_subtitles); vazio = nenhuma |
ii_fps | integer | 25 | Imagens por segundo do filme, para of_step_frames |
ib_remember_position | boolean | false | Lembra onde cada filme é deixado — uma pausa, uma paragem e a cada 5 segundos durante a reprodução (fechar a janela pode perder esses últimos segundos) — e retoma aí no próximo of_play da mesma fonte, seja qual for a escrita do caminho. Guardado pelo motor neste posto, por utilizador, para os 200 últimos filmes |
is_theme_style | string | "" | Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança |
is_theme_mode | string | "" | Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança |
il_theme_accent | long | -1 | Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema) |
is_tooltip | string | "" | Tooltip simples apresentado ao passar sobre o componente |
is_super_tooltip_title | string | "" | Título do tooltip enriquecido (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto do tooltip enriquecido (aceita marcação enriquecida) |
is_super_tooltip_image | string | "" | Imagem do tooltip enriquecido |
ib_enabled | boolean | true | false: imagem escurecida, barra e teclado inertes — exceto Escape em ecrã inteiro: pode-se sempre sair; o seu código continua a comandar |
ib_scrub_preview | boolean | true | Uma bolha de tempo segue o cursor sobre a barra (true, por omissão), com o capítulo se houver. false oculta-a |
ib_pause_when_hidden | boolean | true | Põe o filme em pausa quando o componente fica OCULTO (outra página de um tab ou de um dock PBToolboxAI, PBT_SetVisible): ue_paused segue, e o filme espera por of_play, nunca retoma sozinho. false deixa-o tocar (uma parede de ecrãs). Um Tab NATIVO do PowerBuilder não avisa o componente: chame of_pause no seu SelectionChanged |
ib_forward_seek | boolean | true | Um filme de formação para VER: false impede o utilizador de procurar além do ponto mais distante já reproduzido — a barra, as setas, Fim, um marcador, as teclas imagem a imagem; voltar atrás continua livre, e o seu código (of_seek) não é retido. of_watched_ms / of_watched_percent leem o que foi reproduzido, ue_watched_completely diz quando tudo o foi |
ib_skip_failed | boolean | false | Uma lista que avança SOZINHA salta um filme que não pode tocar (o seu ue_failed é levantado, depois de ue_source_changed) em vez de parar aí |
Um clique na imagem pausa, um segundo retoma. Teclado, quando o filme tem o foco: Espaço ou K reproduzir/pausa, ←/→ cinco segundos, ↑/↓ volume, M silêncio, Início/Fim. As teclas . e , avançam e recuam uma imagem, Esc sai do ecrã inteiro ou fecha o menu de velocidade. No menu de velocidade: ↑/↓, Início/Fim, Enter escolhe, Esc e Tab fecham-no. Num leitor sem filme, Espaço e o botão Reproduzir não fazem nada.
Métodos #
| Método | Função | |
|---|---|---|
of_play ( ) → long | Reproduz is_source de onde está: do início da primeira vez, da pausa depois (ue_resumed). Devolve 0 uma vez iniciado, -5 quando o leitor não pode reproduzir nada — sem fonte, ou uma fonte recusada de imediato (http://, um formato recusado pelo nome): of_get_last_error diz qual e nenhum ue_failed segue —, -2 quando o componente não está criado, -4 quando a página não respondeu | |
of_play (string as_source) → long | Define a fonte e reprodu-la: a mesma chamada que o leitor de sons. O MESMO filme não é recarregado: em pausa, retoma onde está (of_seek(0) recomeça-o). Devolve 0 uma vez iniciado, -5 quando a fonte é recusada de imediato — vazia, http:// (descarregue-a primeiro: restclient.of_download), um formato recusado pelo nome: of_get_last_error diz qual, o filme em curso continua e nenhum ue_failed segue —, -2 quando o componente não está criado, -4 quando a página não respondeu | |
of_play (string as_source, string as_subtitles) → long | Define o filme E o seu ficheiro de legendas (.vtt, ou um .srt que a DLL converte), e reprodu-lo: as legendas pertencem ao filme, dê-as COM ele — definidas antes de um segundo filme, iam-se com o primeiro. "": sem legendas. Os mesmos códigos que of_play(source); um ficheiro de legendas ilegível é dito por ue_subtitles_failed, o filme continua | |
of_pause ( ) → long | Suspende o filme onde está; of_play retoma-o. Devolve 0 uma vez enviado, -2 quando o componente não está criado | |
of_stop ( ) → long | Pára o filme e volta ao início; segue-se ue_stopped. Devolve 0, -2 quando o componente não está criado | |
of_seek (long al_ms) → long | Posiciona-se num ponto do filme, em milissegundos, em reprodução ou não; um ficheiro local procura de imediato. ue_seeked segue-se, como com a barra. Devolve 0 uma vez enviado, -2 se o componente não estiver criado. Enquanto um segmento está definido (of_play_range), a posição fica dentro dele; ib_forward_seek não retém o seu código, só o utilizador | |
of_is_playing ( ) → boolean | Verdadeiro enquanto um filme está em curso — pausa incluída, não terminou | |
of_is_paused ( ) → boolean | Verdadeiro enquanto o filme está suspenso — por of_pause, pela barra ou pelo teclado | |
of_is_buffering ( ) → boolean | Verdadeiro enquanto o filme CORRE mas espera pelos seus dados — o tempo que ue_buffering anunciou. Lido no componente, nunca numa cópia | |
of_duration ( ) → long | Devolve o número de milissegundos que o filme dura, 0 enquanto desconhecido | |
of_position ( ) → long | Devolve o número de milissegundos reproduzidos desde o início; ue_progress também o traz a cada segundo | |
of_capture (string as_path) → long | Guarda a imagem mostrada agora, no tamanho do filme: of_capture(as_path, 0). A EXTENSÃO escolhe o formato: .jpg ou .jpeg escreve um JPEG, todo o resto um PNG; espera pela primeira imagem descodificada (10 s no máximo), por isso pode seguir-se diretamente a of_play. Devolve 0 uma vez escrita, -4 sem filme, com um filme que não se conseguiu carregar, sem imagem a tempo, quando um filme de outro site recusa os seus píxeis ou quando o ficheiro não pode ser escrito, -5 num caminho vazio ou que depende da pasta atual (\x, C:x), -2 se o componente não estiver criado; após um retorno negativo, of_get_last_error diz porquê. Um caminho relativo é escrito na pasta em que a aplicação arrancou (a pasta atual ao carregar a biblioteca, a mesma no IDE e compilada) | |
of_capture (string as_path, long al_max_width) → long | A mesma captura, REDUZIDA a al_max_width píxeis de largura (altura em proporção): a miniatura de um filme 4K não é uma imagem 4K. 0 mantém o tamanho do filme. Mesmos retornos que of_capture(as_path) | |
of_fullscreen (boolean ab_on) → long | O filme em TODO o monitor (a DLL move o controlo para uma janela própria; a sua janela não é tocada), ou de volta. Acima de tudo enquanto é a janela ativa: Alt+Tab para outra aplicação põe essa aplicação à frente, e voltar à sua põe de novo o filme acima de tudo. Duplo clique, o botão da barra, Escape, Alt+F4. Escape sai mesmo quando ib_enabled é falso. Estes gestos e esta chamada lançam ue_fullscreen_changed (of_is_fullscreen lê-o). Devolve 0, -2 se o componente não estiver criado | |
of_is_fullscreen ( ) → boolean | Verdadeiro enquanto o filme cobre o monitor | |
of_add_marker (long al_ms, string as_label) → long | Um MARCADOR na barra: um traço clicável, e ue_marker_reached quando o filme o passa. Devolve 0, -5 numa posição negativa, -2 se o componente não estiver criado. Pertence ao filme NO ECRÃ: um novo is_source retira-o, adicione-o DEPOIS do filme. ue_marker_reached só parte para um filme que TOCA | |
of_clear_markers ( ) → long | Remove todos os marcadores. Devolve 0, -2 se o componente não estiver criado | |
of_marker_count ( ) → long | Devolve o número de marcadores | |
of_play_range (long al_from_ms, long al_to_ms) → long | Reproduz UM segmento: no seu fim, ue_ended, ou com ib_loop o segmento recomeça. Enquanto estiver definido, toda a procura — a do utilizador (a barra, as teclas, um marcador) como of_seek — fica DENTRO dele: Início leva ao seu começo, um clique além do seu fim ao seu fim; o filme nunca sai do excerto. Devolve 0 uma vez iniciado, -5 quando os limites não fazem sentido ou o leitor não tem filme reproduzível (of_get_last_error diz porquê), -2 quando o componente não está criado, -4 quando a página não respondeu | |
of_clear_range ( ) → long | Liberta o filme do seu segmento. Devolve 0, -2 se o componente não estiver criado | |
of_step_frames (long al_frames) → long | Avança ou recua al_frames imagens (ii_fps) e pausa; teclas . e , sobre a imagem. ue_seeked segue-se, como com as teclas. Devolve 0, -2 se o componente não estiver criado | |
of_add_source (string as_source) → long | Acrescenta um filme à LISTA DE REPRODUÇÃO: o primeiro torna-se is_source (por cima de um filme definido antes, exceto se estiver A TOCAR: a lista segue-o então no fim), os seguintes encadeiam-se sozinhos (ue_source_changed para cada filme que se segue, e para o primeiro quando esta chamada o carrega). Devolve 0, -5 numa fonte vazia, -2 se o componente não estiver criado | |
of_add_source (string as_source, string as_subtitles) → long | Acrescenta um filme COM o seu ficheiro de legendas (.vtt ou .srt, convertido pela DLL): a legenda pertence a esse filme e aparece só quando ele toca. A forma simples e sem ambiguidade de legendar uma lista. Devolve 0, -5 numa fonte vazia, -2 quando o componente não está criado | |
of_clear_playlist ( ) → long | Esvazia a lista; o filme em curso continua. Devolve 0, -2 se o componente não estiver criado | |
of_next ( ) / of_previous ( ) → long | O filme seguinte ou anterior da lista; of_playlist_index diz onde está, e ue_source_changed segue-se. Devolve 0, -2 se o componente não estiver criado | |
of_playlist_count ( ) → long | Devolve o número de filmes da lista | |
of_playlist_index ( ) → long | Devolve o índice (a partir de 1) do filme da lista em curso, 0 fora da lista | |
of_add_subtitles (string as_lang, string as_source) → long | Uma faixa de legendas por idioma: .vtt, ou .srt convertido, do posto ou de um URL https (descarregado: CORS necessário, ver ue_subtitles_failed). O botão CC da barra percorre-as. Devolve 0, -5 numa fonte vazia, um idioma já definido no filme (of_remove_subtitles primeiro) ou que contém / ou ` | , -2` se o componente não estiver criado |
of_remove_subtitles (string as_lang) → long | Retira a faixa de um idioma do filme no ecrã (e do filme da lista que toca: não volta com of_previous). A faixa de is_subtitles chama-se default. Devolve 0, -5 para um idioma que o filme não tem, -2 se o componente não estiver criado | |
of_subtitle_count ( ) → long | Devolve o número de faixas de legendas | |
of_remembered_position ( ) → long | Devolve o número de milissegundos onde is_source foi deixado (ib_remember_position), 0 caso contrário | |
of_watched_ms ( ) → long | Devolve quantos milissegundos do filme foram realmente REPRODUZIDOS — cada parte contada uma vez, uma procura não vê nada. 0 para um filme novo | |
of_watched_percent ( ) → long | Devolve a parte do filme REPRODUZIDA, de 0 a 100: um filme de formação para ver inteiro (com ib_forward_seek = false). ue_watched_completely diz quando chega a 100; cortado em modo demo, diz o que foi visto | |
of_has_output ( ) → boolean | Verdadeiro se o posto tem saída áudio | |
of_add_chapter (long al_ms, string as_title) → long | Um CAPÍTULO (índice): ue_chapter_changed quando a leitura entra. of_go_chapter salta (1-based), of_next_chapter / of_previous_chapter percorrem (cada salto lança ue_seeked e ue_chapter_changed), of_chapter_count / of_chapter_index / of_chapters leem, of_clear_chapters esvazia. Devolve 0, -5 se negativo, -2 quando o componente não está criado. Pertence ao filme NO ECRÃ: adicione-o DEPOIS do filme | |
of_clear_chapters ( ) → long | Remove todos os capítulos; a bolha de pré-visualização esquece-os. Devolve 0, -2 se não criado | |
of_go_chapter (long al_index) → long | Salta para o capítulo al_index (1-based, pela ordem de of_add_chapter); of_chapter_index lê-o de imediato, e ue_seeked e depois ue_chapter_changed seguem-se, como com um clique na barra. Devolve 0, -5 para um número inferior a 1 ou superior a of_chapter_count(), -2 se o componente não estiver criado | |
of_next_chapter ( ) → long | Salta para o capítulo a seguir à posição atual; of_chapter_index lê-o de imediato, e ue_seeked e depois ue_chapter_changed seguem-se. Do último capítulo nada se move. Devolve 0, -2 se não criado | |
of_previous_chapter ( ) → long | Salta para o capítulo anterior àquele onde está a leitura; of_chapter_index lê-o de imediato, e ue_seeked e depois ue_chapter_changed seguem-se. Do primeiro capítulo nada se move. Devolve 0, -2 se não criado | |
of_chapter_count ( ) → long | Devolve o número de capítulos do filme (of_add_chapter), 0 sem nenhum | |
of_chapter_index ( ) → long | Devolve o número (1-based) do capítulo onde está a leitura, 0 antes do primeiro ou sem capítulos. Lido ao vivo | |
of_chapters (ref long al_ms[], ref string as_titles[]) → long | Preenche os capítulos por ordem — a posição de cada um em ms em al_ms, o título em as_titles — para construir um menu seu; um título pode conter qualquer carácter. Devolve o número, 0 sem capítulos | |
of_picture_in_picture (boolean ab_on) → long | O filme numa janela flutuante própria (true) ou de volta (false); ue_pip_changed segue-se, como quando o utilizador fecha a janela pequena. of_is_pip diz se flutua, of_pip_available se o posto permite. Devolve 0, -2 se não criado | |
of_is_pip ( ) → boolean | Verdadeiro enquanto o filme flutua na sua janela Picture-in-Picture; falso de novo quando o utilizador a fecha | |
of_pip_available ( ) → boolean | Verdadeiro se o motor e o posto permitem o Picture-in-Picture: perguntar antes de oferecer o botão |
Eventos #
| Evento | Quando |
|---|---|
ue_started (long al_duration_ms) | O filme começa realmente; o comprimento quando o ficheiro o diz, 0 caso contrário |
ue_ended (boolean ab_truncated) | O filme terminou por si; ab_truncated verdadeiro quando o limite demo o cortou |
ue_failed (string as_message, string as_reason) | O filme não pôde ser reproduzido. as_reason di-lo numa palavra que o seu código testa: REASON_INSECURE (uma fonte http://), REASON_FORMAT (avi, wmv, flv, ou um formato que o motor declara ilegível), REASON_UNSUPPORTED (ficheiro ausente ou contentor não descodificável), REASON_DECODE, REASON_NETWORK, REASON_NO_SOURCE, REASON_FAILED; as_message é o texto mostrado sobre a imagem. of_play não o levanta para uma fonte recusada de imediato: devolve -5. Uma entrada da lista que não pode tocar levanta-o UMA vez, depois de ue_source_changed |
ue_stopped ( ) | of_stop cortou um filme em curso |
ue_paused ( ) / ue_resumed ( ) | O filme é suspenso, depois retoma — pelo seu código, pela barra ou pelo teclado indistintamente; também quando o componente fica oculto (ib_pause_when_hidden) |
ue_progress (long al_position_ms, long al_duration_ms) | Uma vez por segundo durante a reprodução: o que uma barra de progresso sua precisa, sem timer |
ue_seeked (long al_position_ms) | A posição mudou: o utilizador (barra, setas, marcador) ou o seu código — of_seek, of_step_frames e as funções de capítulo também o lançam, como o gesto |
ue_volume_changed (long al_percent) | O utilizador rodou o volume; nunca ii_volume |
ue_rate_changed (long al_percent) | O utilizador escolheu uma velocidade na barra; nunca ii_rate |
ue_subtitles_changed (string as_lang) | O utilizador percorreu as legendas (CC); vazio = nenhuma |
ue_muted_changed (boolean ab_on) | O utilizador cortou (true) ou repôs (false) o som — o altifalante da barra, a tecla M; nunca ib_muted |
ue_fullscreen_changed (boolean ab_on) | O filme passou a ecrã inteiro, ou voltou: duplo clique, o botão, Escape, Alt+F4, ou of_fullscreen. of_reset nunca o lança |
ue_marker_reached (long al_ms, string as_label) | O filme, A TOCAR, passa um marcador; uma procura durante uma pausa só levanta ue_seeked |
ue_source_changed (long al_index, string as_source) | A lista de reprodução passa a outro filme: sozinha, tendo o anterior terminado, ou por of_next, of_previous e o primeiro of_add_source |
ue_chapter_changed (long al_index, string as_title) | A leitura entra noutro capítulo (of_add_chapter): o seu número (1-based, 0 antes do primeiro) e o título; também quando o utilizador ou o seu código (of_go_chapter, of_next_chapter, of_previous_chapter) salta para lá |
ue_pip_changed (boolean ab_on) | O filme entrou (true) na janela Picture-in-Picture ou saiu dela (false): o utilizador fechou-a, o motor pôs lá o filme por si, ou of_picture_in_picture pediu-o (of_is_pip lê-o) |
ue_subtitles_failed (string as_lang, string as_reason) | Um ficheiro de legendas não pôde ser carregado: um URL https cujo servidor recusa CORS ou responde um erro (REASON_NETWORK, REASON_NOT_FOUND), um URL http:// (REASON_INSECURE). A faixa é retirada, o filme continua. Também um ficheiro do posto que não se encontra (REASON_NOT_FOUND) |
ue_buffering (boolean ab_on) | O filme CORRE mas tem de esperar pelos seus dados mais de um quarto de segundo (true) — uma rede lenta, um salto para longe num filme de um URL: um anel na cor de destaque do tema roda sobre a imagem — depois a espera acaba (false): o filme retoma, ou foi pausado, parado, substituído, ou falhou. of_reset nunca o lança |
ue_watched_completely ( ) | Todas as partes do filme foram REPRODUZIDAS (uma procura não vê nada) — uma vez por filme: um filme de formação visto inteiro |
Ecrã inteiro, marcadores, segmento, imagem a imagem #
- Ecrã inteiro.
of_fullscreen(true), um duplo clique na imagem ou o último botão da barra. A DLL move o controlo para uma janela própria que cobre o monitor; a sua janela PowerBuilder não é tocada, e Escape (ou Alt+F4) devolve o filme. Só fica acima de tudo enquanto é a janela ativa: Alt+Tab para outra aplicação volta a pô-lo entre as outras. Escape sai mesmo quandoib_enabledé falso.ue_fullscreen_changeddiz cada passagem, nos dois sentidos: estes gestos do utilizador comoof_fullscreen. - Marcadores.
of_add_marker(ms, rótulo)põe um traço na barra: o utilizador vê-o, sobrevoa-o (o rótulo), clica-o (o filme salta para lá,ue_seeked), eue_marker_reachedchega quando o filme o passa. Capítulos de uma formação, pontos a controlar, defeitos detetados. - Segmento.
of_play_range(de, a)toca só um excerto; comib_looprepete-o atéof_clear_range. Toda a procura fica no excerto: Início leva ao seu começo, um clique além do seu fim ao seu fim. Em ecrã inteiro a barra mostra-se também pelo teclado (Tab). - Imagem a imagem.
of_step_frames(±n)avança ou recua n imagens aii_fpspor segundo e pausa; as teclas . e , fazem o mesmo. O motor não diz a cadência de um filme: diga-a. - A barra fala. Cada gesto tem o seu evento:
ue_seeked,ue_volume_changed,ue_rate_changed(o botão de velocidade, 0,5× a 2×),ue_subtitles_changed(o botão CC),ue_muted_changed(o altifalante, a tecla M). Uma deslocação pedida pelo seu código lança o mesmo que o gesto:of_seek,of_step_framese as funções de capítulo lançamue_seeked. Um VALOR definido pelo seu código fica mudo, comoSetItem: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)
Lista de reprodução, legendas, retoma, formatos #
- Lista de reprodução.
of_add_sourceempilha filmes; o primeiro torna-seis_source, os seguintes encadeiam-se sozinhos no fim de cada um,ue_source_changednomeia cada passagem.of_nexteof_previousà mão, com o mesmo evento:of_playlist_indexdiz onde está a lista. Comib_skip_failed, a lista que avança sozinha salta um filme que não pode tocar (o seuue_failedé levantado uma vez); a língua de legendas escolhida segue de um filme para o outro quando o seguinte a tem. - O que pertence a um filme. O seu segmento, legendas, marcadores e capítulos: um novo
is_sourcedeixa-os para trás (definidos antes de qualquer filme, esperam pelo primeiro). A lista de reprodução guarda os seus: a legenda dada aof_add_source(filme, legenda)volta com o seu filme. Defina-os pois DEPOIS do filme, ou dê as legendas com ele:of_play(film, subtitle). - Várias faixas de legendas.
of_add_subtitles(idioma, ficheiro)por idioma,of_remove_subtitles(idioma)para retirar uma;is_subtitle_langescolhe, o botão CC da barra percorre-as. Um.srté convertido em WebVTT ao ser servido: nada a converter do seu lado. Uma legenda dada por um URLhttpsé descarregada pelo componente: o seu servidor tem de autorizar CORS, senãoue_subtitles_faileddi-lo e o filme continua sem ela. - Retoma.
ib_remember_position = true: onde um filme é deixado (pausa, paragem) é guardado pelo motor neste posto, por utilizador, e o próximoof_playda mesma fonte retoma aí. Um filme visto até ao fim recomeça do início. Também a cada 5 segundos durante a reprodução; os 200 últimos filmes são guardados. - Formatos. O que o WebView2 descodifica: mp4 (H.264, AAC), webm (VP8, VP9, AV1), mov (o H.264 de um iPhone ou de uma câmara), mkv (uma gravação OBS), e os formatos áudio (mp3, wav, ogg, opus, flac, aac, m4a). Não o H.265/HEVC sem a extensão do Windows (um
.movHEVC acaba emue_failed, que nomeia a extensão), nem AVI, WMV, FLV: o componente recusa-os pelo nome (REASON_FORMAT) em vez de um ecrã negro. Nem HLS nem DASH: uma câmara IP passa por um fluxo mp4 ou webm. Sóhttps: um endereçohttp://de intranet é recusado (REASON_INSECURE) — descarregue primeiro o filme (restclient,of_download) ou sirva-o a partir de uma partilha\\servidor\…. - Várias faixas áudio. O Chromium esconde-as atrás de uma flag: não expostas.
// 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"
Um filme de formação para ver inteiro #
Uma formação obrigatória, uma instrução de segurança: ib_forward_seek = false impede o utilizador de saltar para a frente além do que já viu — a barra, as setas, Fim, um marcador — sem o impedir de voltar atrás. of_watched_ms e of_watched_percent dizem o que foi realmente reproduzido (uma procura não vê nada), ue_watched_completely chega uma vez quando tudo o foi. Em modo demo o filme pára aos 10 segundos, e a percentagem diz o que foi 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()
Vir do controlo Windows Media Player #
Muitas aplicações PowerBuilder incorporam o OCX do Windows Media Player num OLECustomControl — um controlo que a Microsoft classifica como « legado », e que faz cair mais de uma aplicação. u_pbt_video substitui-o membro a membro. Duas diferenças a reter: as posições estão em milissegundos (o WMP conta em segundos) e a velocidade em percentagem (ii_rate = 150 para 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 |
Exemplos #
Um ciclo de apresentação silencioso, sem 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")
Os seus botões e uma barra de progresso #
// 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)
Uma miniatura do filme para um relatório #
// 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())
Boas práticas #
- Um ficheiro do posto em vez de um URL sempre que puder: servido em fluxo pela DLL, arranca de imediato, procura sem recarregar, e
of_capturepode ler os seus píxeis — o que um filme de outro site recusa. - Programe
ue_failedem qualquer filme cujo caminho dependa dos dados: é a sua única rede, e a mensagem já está no ecrã. - Defina
ib_autoplaysó para um ciclo de apresentação: um filme que arranca sozinho com som surpreende o utilizador; noutros casos bastam o cartaz e o botão de reprodução. ue_progresssubstitui um timer: uma vez por segundo, posição e comprimento, só durante a reprodução.
Herdado da base comum #
Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.
| Membros | Função | Detalhado em |
|---|---|---|
of_reset | Repor o componente a zero | 3.6 Repor um componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atalhos de teclado do componente | 3.5 Os atalhos de teclado |
of_is_created · of_is_ready · of_get_last_error | Se nasceu, se está pronto, o que falhou | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar a renderização como imagem | 3.8 Exportar a representação como imagem |
of_set_redraw | Agrupar as alterações num único repinte | 3.10 Boas práticas |
of_preload_icons | Ícones mostrados sem atraso | Apresentação instantânea: of_icon |
of_set_translation | Traduzir uma legenda do componente | 5.2 Adaptar uma etiqueta: of_set_translation |
of_focus_webview | Dar o foco ao componente | 6.4 Teclado e focus |
of_print · of_print_to_pdf | Imprimir, ou escrever um PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar uma propriedade pelo nome | 3.1 O motor de propriedades |
is_accessible_name · is_accessible_description | O nome e a descrição que um leitor de ecrã diz | 3.4 Propriedades e eventos opcionais |