Estou a fazer uma classe que executa um programa (ffmpeg) pra tirar informações de um video. Após debugar o programa percebi que ele não exibe nenhuma msg de erro mas para de executar qdo chega no while. Alguém poderia me informar aonde posso estar errando?
tenta utilizar o while ((line.equals( br.readLine())) != null)
JoaoBluSCBR
Você tem certeza que deve usar br.readLine() para ler arquivos de video.
Lembre que arquivos de video não tem linha definida.
São binários, uma longa sequencia de bytes. No mínimo a línha seria
única e muito, muito grande.
Creio que seja preciso usar algo diferente.
Vou pesquisar, se encontrar algo te aviso.
R_chieck
Ola, é que vc está usando uma atribuição de valores no escopo.
JoaoBluSCBR
Não tem nada a ver com a atribuição, ela é natural.
Ele está atribuindo e depois fazendo a comparação.
A atribuição não interessa para o while, interessa o != null que vem depois.
O problema é que arquivos de video não abrem em linhas.
Eles precisam de codecs e dlls para serem abertos.
Por incrivel que pareça ninguem teve coragem no GUJ de abrir topico
sobre isso, deve ser muito complexo.
ViniGodoy
Mas no caso ele não está lendo o arquivo de vídeo, e sim, a saída do processo. E a saída de um processo normalmente é um texto, que termina com quebras de linha.
O que pode estar acontecendo:
a) O seu processo não está gerando qualquer saída. Certifique-se que sua chamada ao processo está correta.
b) A saída não está no outputstream, e sim, no error stream;
c) A saída não é mesmo textual (caso que o Joao está salientando).
Uma idéia seria usar uma classe que faça a leitura tanto do OutputStream quanto do ErrorStream numa thread separada, como essa aqui:
Essa classe também faz a leitura de maneira binária, o que evita o problema que o Joao está citando.
welingtondias
ViniGodoy vou analisar o tópico informado e vc esta certo estou tentando ler é a saída do processo mesmo. Qualquer coisa eu aviso.
welingtondias
Galera aqui funcionou assim:
importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassVideoTimeimplementsRunnable{privatestaticStringffmpegApp;privatestaticStringvideo;privateStringtime;publicstaticvoidmain(String[]args){StringffmpegApp="D:\Comum\Pessoais\ffmpeg\bin\ffmpeg.exe";Stringvideo="D:\Comum\Pessoais\ffmpeg\videoplayback2.flv";VideoTimevt=newVideoTime(ffmpegApp,video);Threadcomecar=newThread(vt);comecar.start();}publicVideoTime(StringffmpegApp,Stringvideo){VideoTime.ffmpegApp=ffmpegApp;VideoTime.video=video;}publicvoidrun(){try{Stringcomando=ffmpegApp+" -i "+video;Runtimert=Runtime.getRuntime();Processprocess=rt.exec(comando);InputStreamstderr=process.getErrorStream();InputStreamReaderisr=newInputStreamReader(stderr);BufferedReaderbr=newBufferedReader(isr);Stringline;StringBuffersb=newStringBuffer();while((line=br.readLine())!=null){sb.append(line);}Patternpattern=Pattern.compile("Duration: (.*?),");Matchermatcher=pattern.matcher(sb);if(matcher.find()){Stringtime=matcher.group(1);intpos=8;StringBufferbuf=newStringBuffer(time.length()-1);buf.append(time.substring(0,pos)).append(time.substring(pos+3));setTime(buf.toString()!=null?buf.toString():"");System.out.println(getTime());}else{System.out.println("Tempo do video não encontrado");}}catch(Exceptione){e.printStackTrace();}}publicvoidsetFfmpegApp(StringffmpegApp){VideoTime.ffmpegApp=ffmpegApp;}publicvoidsetTime(Stringtime){this.time=time;}publicvoidsetVideo(Stringvideo){VideoTime.video=video;}publicStringgetTime(){returntime;}}