Ir para o conteúdo

 Voltar a Linguagem Lua
Tela cheia

Leitor de Legendas .srt

17 de Julho de 2012, 17:46 , por Desconhecido - | 1 Pessoa seguindo este artigo.
Visualizado 446 vezes

Prezados,

Venho tentando criar um exibidor de legendas .srt em NCLua, mas estou completamente empacado e acredito que o problema esteja nas minha chamadas ao event.timer(). A primeira legenda vai bem, até que eu inseri um loop repeat-until no código com o objetivo de terminar de ler o arquivo.

Segue o código-fonte. Se alguém puder me ajudar, serei grato.

-- legendas.lua
-- Exibidor de legendas em formato SRT
-- Inicializacao das variaveis
local tempoAcumulado, tempoInicial, duracao, tempoFinal = 0, 0, 0
local dx, dy = canvas:attrSize()
local texto = ''
canvas:attrFont('vera', 24, 'bold')
canvas:attrColor (0,0,0,0)
canvas:drawRect ('fill',0,0,dx,dy)
function finaliza ()
	event.post {
		class  = 'ncl',
		type   = 'presentation',
		action = 'stop'
	}
end
function handler (evt)
	texto = 'Isto eh um teste'
	io.input('Capoeira.srt')
	if io.read() == nil then
		finaliza()
	end
	
	repeat
		--carrega os tempos
		tempos = io.read()
		tempoInicial = (string.sub(tempos, 0, 2) * 3600000) + (string.sub(tempos, 4, 5) * 60000) + (string.sub(tempos, 7, 8) * 1000) + string.sub(tempos, 10, 12)
		tempoFinal = (string.sub(tempos, 18, 19) * 3600000) + (string.sub(tempos, 21, 22) * 60000) + (string.sub(tempos, 24, 25) * 1000) + string.sub(tempos, 27, 29)
		duracao = tempoFinal - tempoInicial
		
		event.timer(tempoInicial-tempoAcumulado, function()
			texto = io.read()
		    ax,ay = canvas:measureText(texto)
		    canvas:attrColor ('black')
		    canvas:drawText (((dx-ax)/2)+1, 11, texto)
		    canvas:attrColor ('yellow')
		    canvas:drawText ((dx-ax)/2, 10, texto)
		    canvas:flush()
		    tempoAcumulado = tempoInicial+(tempoInicial-TempoAcumulado)
		    event.timer(duracao, function()
		    	canvas:attrColor (0,0,0,0)
				canvas:drawRect ('fill',0,0,dx,dy)
				canvas:flush()
				tempoAcumulado = tempoAcumulado+duracao
		    end)
		end)
		io.read()
	until
		io.read() == nil
end
event.register(handler)

Autor: Flávio Pontes


33 comentários

  • 5df5d8eeb3770422cc9c42a466faee62?only path=false&size=50&d=404Roberto Azevedo(usuário não autenticado)
    18 de Julho de 2012, 0:26

     

    Oi Flávio,

    eu acredito que o teu problema esteja na linha:

    texto = io.read()

    Ao agendar a funcao para ser executada no futuro, esse io.read() nao vai mais funcionar (ateh porque um outro jah estah sendo feito mais embaixo). O que voce pode fazer para funcionar eh ler esse texto apenas uma vez antes de agendar a funcao, e passa-lo como parametro para a funcao que estah sendo agendada.

    Apenas algumas observacoes que podem ser uteis: 

    1. Essa forma que você estah fazendo (usando event.timer() ) , embora funcione, não é a mais indicada para um script NCLua que fica atualizando a tela. O ideal seria você ficar postando eventos do tipo "in" para o próprio NCLua e atualizando a tela na medida que seja necessário. Neste texto de minicurso tem uma discussao mais aprofundado na parte de animacao: http://www.telemidia.puc-rio.br/sites/telemidia.puc-rio.br/files/MCNCLua.pdf

    2. Já existe um código NCLua pronto para a exibição de legendas SRT que você pode usar e estah disponivel sob licenca Creative Commons no Clube NCL: http://clube.ncl.org.br/node/131. Ele jah funciona postando evento para si proprio.

     

    • 67cb76598107aa9f7a48b218d9928e7a?only path=false&size=50&d=404Flávio Pontes(usuário não autenticado)
      13 de Agosto de 2012, 11:40

       

      Obrigado, Roberto.

      Já baixei o código NCLua que você indicou e, nesse momento estou examinando. Aos poucos vou entendendo o código e criando uma solução mais adequada às minhas necessidades.

      Tenho uma dúvida, porém. O código NCL declara e atribui valor a uma propriedade "fps" do srt_mediaplayer que não está declarada no código LUA. Essa propriedade é definida pelo exibidor NCL ou é padrão nos objetos lua?

      Seguem os trechos de código:

      <media id="subtitle" src="mediaplayer_srt.lua" descriptor="dsSubtitle">
      <property name="path"/>
      <property name="fps"/>
      <property name="color"/>
      </media>
      <link xconnector="conn#onBeginSet">
      <bind role="onBegin" component="subtitle"/>
      <bind role="set" component="subtitle" interface="path">
      <bindParam name="var" value="media/ASharedCulture211_portugues.srt"/>
      </bind>
      <bind role="set" component="subtitle" interface="fps">
      <bindParam name="var" value="10"/>
      </bind>
      <bind role="set" component="subtitle" interface="color">
      <bindParam name="var" value="white"/>
      </bind>
      </link> 

      • 145ea1662b45b86a90b987f094279123?only path=false&size=50&d=404Guilherme Lima(usuário não autenticado)
        13 de Agosto de 2012, 13:17

         

        Oi Flavio,

        So para esclarecer, as variaveis do script Lua nao tem relacao com o NCL. Toda comunicacao NCL-Lua eh feita atraves de eventos. Quando o NCL atribui valor a uma propriedade da Lua (e.g., atraves de um ), o player chama as funcoes tratadoras no script, passando como parametro o evento em questao. O tratador faz com o evento o que ele quiser, podendo ate mesmo ignora-lo.

        Pode acontecer de a propriedade em questao ter alguma semantica na NCL -- i.e., eh uma propriedade conhecida pela NCL, por exemplo, "top", "left", "width", etc. Nesse caso, o player NCL honra a acao e repassa o evento para o Lua. Por exemplo, quando voce atribui valor a propriedade "width" da Lua, o NCL modifica a largura do objeto Lua e repassa o evento ao script. Observe que o NCL, e nao o script, quem modifica a largura do objeto.

        Quanto ao trecho que voce postou, as propriedades "path", "fps" e "color" nao possuem semantica para NCL. Logo, deve haver uma funcao tratadora no Lua que espera eventos (i.e. tabelas) com a seguinte assinatura:

        {class='ncl', type='attribution', name='path', value=?}, ou
        {class='ncl', type='attribution', name='fps', value=?}, ou
        {class='ncl', type='attribution', name='color', value=?},

        e executa a acao correspondente -- que pode ser, inclusive, atribuir o campo valor a uma variavel homonima no script.

        Espero que isso ajude.

Concurso ITU-T de Aplicações para IPTV 2012

13 de Agosto de 2012, 19:38, por Desconhecido

Gostaríamos de lembrar aos possíveis interessados que o prazo de registro para participação no Concurso ITU-T de Aplicações para IPTV 2012 (IPTV Application Challenge) se encerra nesta semana, dia 15 de agosto de 2012. Já o prazo para a submissão de aplicações se encerra no dia 07 de setembro de 2012.



NCL Eclipse 1.6 disponível

10 de Janeiro de 2012, 21:19, por Desconhecido

Caros membros da Comunidade Ginga,



Concursos de Aplicações Ginga-NCL

22 de Setembro de 2011, 3:22, por Desconhecido

    Gostaríamos de relembra-los de que há dois concursos de aplicações Ginga-NCL com inscrições ainda abertas. O convite é aberto a toda a comunidade de desenvolvedores de aplicações para o Middleware Ginga-NCL, em nível internacional. São os seguintes concursos:



Novas versões: Ginga e Ginga-NCL Virtual Set-top Box (v.0.12.3)

1 de Agosto de 2011, 20:58, por Desconhecido



Algumas Boas Notícias da Comunidade Ginga

28 de Julho de 2011, 21:31, por Desconhecido

Autor: Roberto Azevedo