Estou terminando um trabalho TCC sobre o SBTVD e o Ginga, e a parte final dele é um protótipo para TV digital. O protótipo está quase finalizado, faltando somente a legenda para cumprir um dos pré-requisitos para a acessibilidade na TV Digital.
Qual a melhor opção para legenda um arquivo e o que fazer para implementá-la?
Desde já agradeço
Autor: Rodrigo Ribeiro Pereira
2525 comentários
<property name="x-fontUri"/>
<property name="x-fontColor"/>
<property name="x-fontSize"/>
<property name="x-fontAlign"/>
</media>
<link id="lBegingTxt1" xconnector="conEx#onBeginSetN">
<bind component="Filme" role="onBegin"/>
<bind component="form1texto1" interface="x-fontUri" role="set">
<bindParam name="var" value="/usr/local/share/fonts/truetype/vera.ttf"/>
</bind>
<bind component="form1texto1" interface="x-fontColor" role="set">
<bindParam name="var" value="black"/>
</bind>
<bind component="form1texto1" interface="x-fontSize" role="set">
<bindParam name="var" value="12"/>
</bind>
<bind component="form1texto1" interface="x-fontAlign" role="set">
<bindParam name="var" value="right"/>
</bind>
</link>
> de videoclips que estou desenvolvendo no meu tcc (prazo tá quase
> acabando). e se eu usasse esse trabalho, teria que copiar tudo. sei
> lá, fica meio estranho. Isso depende do objetivo do teu trabalho. Se for criar um player SRT para o Ginga realmente copiar o que tem NÃO é uma opção. Contudo, se for outra coisa, e tocar SRT não seja o objetivo principal, mas apenas uma funcionalidade a mais, é possível reutilizar o código (afinal está disponível como creative commons) da aplicação anterior (claro, dando os devidos créditos). De qualquer forma, recomendo você conversar com o teu orientador. Para criar o player SRT, uma alternativa é você escrevê-lo nativamente em C++. A outra alternativa apresentada pela aplicação do Clube NCL de um player escrito em Lua é interessante porque você não fica dependende de nenhuma implementação específica do Ginga. Teu programa vai rodar em qualquer um que siga a norma. > que a legenda já viesse embutida no vídeo, ok, e eu conseguisse
> manipular de alguma forma se ela fica visível ou não. será q é
> possível? a legenda já encodada, e eu manipular se o vídeo roda
> com ela ou não? O player de vídeo teria que dar suporte nativo a isso, o que não é verdade! > rodar dois videos, um com legenda, e outro sem legenda em
> paralelo, não sei se seria uma boa idéia. A performance seria bem ruim! > outra solução seria esquecer os videoclipes, e fazer apenas com
> músicas mp3, e arquivos lrc (lyrics) tb não sei se o ncl suporta. Também não é suportado, porque não faz parte do padrão. Se quiser (e puder) usar esse código, você só precisa dar um set pelo NCL na propriedade visible do nó lua para que ele apareça/desapareça.
> músicas mp3, e arquivos lrc (lyrics) tb não sei se o ncl suporta. Também não é suportado, porque não faz parte do padrão. e eu q estava crente no início do trabalho que minha conclusão seria a favor do ginga ;)... bom, será que é possível eu usar as transições do NCL, barWipe (toptoBottom), em conjunto com parametros de descritores (fit, fill, meet) para fazer a página com as letras irem aparecendo num canto da tela? as frases iam aparecendo, de baixo pra cima, como os arquivos lrc. sei lá, eu teria que redimencionar isso, mas... seria uma imagem de uma página com as frases, apenas subindo e desaparecendo, no intervalo de tempo. Para criar o player SRT, uma alternativa é você escrevê-lo nativamente em C++. mas isso seria reescrever o player que vem na iso do ginga?? e substituir ? seria mais facil fazer isso com um player só mp3 lrc? digo, pq me parece um trabalho de Einstein, e eu sou apenas um estudante boleiro, com um livro de C++ do deitel empoeirado em algum lugar.
> japones, o europeu, e o americano usam todos a combinação xhtml
> - ecmaScript, e o brasil se mete a implementar ncl e lua, bem que
> poderiam planejar um padrão que suportasse. se o .srt não faz
> parte do padrão, o que é que faz? :) tem q haver um meio de
> conseguir esse caption. É... também poderia padronizar PDF, DOC, XLS, ETC. Mas não dá para colocar tudo, senão o padrão fica um monstro e ninguém vai implementá-lo (sem mencionar os royalties). Acho que o porquê das escolhas do padrão brasileiro já foram bem batidas. Faz uma busca na net (ou mesmo aqui no fórum) que você vai encontrar argumentos TÉCNICOS suficientes para as escolhas que foram feitas. P.s. Você também pode utilizar XHTML+Ecmascript no padrão brasileiro, já que pode embutir um nó XHTML na sua aplicação NCL (de forma bem simples, por sinal). Mas enfim, voltemos ao teu problema origianl. A solução mais simples para é você esquecer o SRT e fazer uma aplicação NCL que tem vários nós de mídias txt ou html (cada um sendo uma parte da legenda). Então basta sincronizar cada parte da legenda com uma âncora do teu nó de mídia por meio de elos. O exemplo13 desse tutorial: www.telemidia.puc-rio.br/sites/telemidia.puc-rio.br/files/TutorialNCL3.0-2ed-3rev.pdf é exatamente isso. Veja que você nao precisa criar várias regiões e vários descritores como disse antes, eles são reusados por todos os objetos de mídia que fazem parte da legenda.
> modelo que você está atrás (de usar um arquivo só com todas as
> legendas) pode ser o que o Bruno sugeriu: usar um script Lua que
> interpreta um arquivo SRT e sabe o que mostrar na tela. Neste
> esquema, você teria uma mídia Lua e daria um play nela. O script
> Lua abriria o arquivo SRT, saberia interpretar (através de um
> parser simples) os tempos que devem ser mostrado e com
> drawText mostraria o texto no tempo certo. Isso é exatamente o que a aplicação do Clube NCL faz! > Outra solução que eu pensei é usar uma tabela Lua para guardar
> os tempos e as legendas (poderia até mesmo ficar no mesmo
> arquivo do script), eliminando assim a necessidade do SRT e
> simplificando o processo de fazer parser no SRT. A lógica de
> como mostrar o conteúdo da legenda seria igual. Espero ter
> ajudado! Isso é bem parecido com o anterior só que ao invés de ler o conteúdo do SRT, você pode usar as tabelas Lua (procure algum tutorial de Lua que vc vai descobrir como fazer). A única mudança é que isso retira o trabalho de fazer o parser do SRT. Voltando, sobre usar só o NCL, eu também acho bem trabalhoso criar na mão um monte de links, mas é para isso que servem os computadores. Pq não fazer um código (em qualquer linguagem de programação que você conheça) para gerar o NCL para você, veja que é sempre criar links do tipo onBeginStart e onEndStop para cada par âncora/legenda?
<ncl id="luaExample" xmlns="http://www.telemidia.puc-rio.br/specs/xml/NCL23/profiles"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.telemidia.puc-rio.br/specs/xml/NCL23/profiles
www.telemidia.puc-rio.br/specs/xml/NCL23/profiles/NCL23.xsd"> <head>
<regionBase>
<region id="rgVideo" width="100%" height="100%" top="0" left="0" zIndex="3"/>
<region id="rgBox" width="68.75%" height="20.83%" bottom="5%" left="15.6%" zIndex="4"/>
<region id="rgLua" width="64.75%" height="16.85%" bottom="7%" left="18%" zIndex="5"/>
<region id="rgInfo" width="29.5%" height="6.5%" top="3.1%" right="2.4%" zIndex="6"/>
<region id="rgNot" width="90%" height="70%" top="20%" right="5%" zIndex="8"/>
<region id="rgLeg" width="59%" height="10%" top="4%" right="25%" zIndex="9"/>
</regionBase> <descriptorBase>
<descriptor id="dsVideo" region="rgVideo"/>
<descriptor id="dsBox" region="rgBox">
<descriptorParam name="transparency" value="70%"/>
</descriptor> <descriptor id="dsLua" region="rgLua" focusIndex="ixLua">
<descriptorParam name="transparency" value="70%"/>
</descriptor>
<descriptor id="dsInfo" region="rgInfo"/>
<descriptor id="dsNot" region="rgNot" />
<descriptor id="dsLeg" region="rgLeg" />
</descriptorBase> <connectorBase>
<causalConnector id="onBeginStart">
<simpleCondition role="onBegin"/>
<simpleAction role="start"/>
</causalConnector>
<causalConnector id="onBeginSet">
<connectorParam name="var"/>
<simpleCondition role="onBegin"/>
<simpleAction role="set" value="$var"/>
</causalConnector>
<causalConnector id="onKeySelectionStartNStop">
<connectorParam name="keyCode"/>
<simpleCondition role="onSelection" key="$keyCode"/>
<compoundAction operator="seq">
<simpleAction role="start" max="unbounded"/>
<simpleAction role="stop"/>
</compoundAction>
</causalConnector>
<causalConnector id="onEndStopN">
<simpleCondition role="onEnd"/>
<simpleAction role="stop" max="unbounded"/>
</causalConnector>
</connectorBase>
</head> <body>
<port id="entryPort" component="video"/> <!-- MEDIAS --> <media type="application/x-ginga-settings" id="programSettings">
<property name="service.currentKeyMaster"/>
</media> <media id="video" src="video.mpeg" descriptor="dsVideo">
<area id="interact" begin="1s"/>
<area id="aVideoLegenda01" begin="0s" end="14s"/>
<area id="aVideoLegenda02" begin="10s" end="14s"/>
<area id="aVideoLegenda03" begin="15s" end="19s"/>
</media>
<media id="box" src="3dbox.png" descriptor="dsBox"/>
<media id="lua" src="temp.lua" descriptor="dsLua"/>
<media id="info" src="interativo.png" descriptor="dsInfo"/>
<media id="not" src="novo.png" descriptor="dsNot"/>
<media id="legenda01" src="legenda.srt" descriptor="dsLeg" />
<!-- LINKS --> <link xconnector="onBeginStart">
<bind role="onBegin" component="video" interface="interact"/>
<bind role="start" component="info"/> </link> <link xconnector="onKeySelectionStartNStop">
<bind role="onSelection" component="info">
<bindParam name="keyCode" value="RED"/>
</bind>
<bind role="start" component="lua"/>
<bind role="start" component="box"/>
<bind role="stop" component="info"/>
</link> <link xconnector="onKeySelectionStartNStop">
<bind role="onSelection" component="info">
<bindParam name="keyCode" value="BLUE"/>
</bind>
<bind role="start" component="not"/>
<bind role="stop" component="video"/>
</link> <link xconnector="onBeginSet">
<bind role="onBegin" component="lua"/>
<bind component="programSettings" interface="service.currentKeyMaster" role="set">
<bindParam name="var" value="ixLua"/>
</bind>
</link> <link xconnector="onEndStopN">
<bind role="onEnd" component="lua"/>
<bind role="stop" component="box"/>
</link> <link xconnector="onEndStopN">
<bind role="onEnd" component="video"/>
<bind role="stop" component="lua"/>
<bind role="stop" component="box"/>
</link> <!-- início da legenda 01 --> <link xconnector="onBeginStart">
<bind component="video" interface="aVideoLegenda01" role="onBegin" />
<bind component="legenda01" role="start" />
</link> <!-- término da legenda 01 --> <link xconnector="onEndStopN">
<bind component="video" interface="aVideoLegenda01" role="onEnd" />
<bind component="legenda01" role="stop" />
</link> </body>
</ncl>