Erro while[RESOLVIDO]

7 respostas
welingtondias

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?

package br.com.ffmpeg;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ProcessBuiderClass {
	public static void main(String [] args) throws IOException, InterruptedException{
	    try {  
	    	String [] comando = new String[3];
	    	comando[0]="D:\Programas\Diversos\bin\ffmpeg.exe";
	    	comando[1]=" -i";
	    	comando[2]="D:\Video\Ben.flv";
	    	
	    	ProcessBuilder pb=new ProcessBuilder(comando);
	    	Process p = pb.start();
	    	InputStream its=p.getInputStream();
	    	InputStreamReader isr = new InputStreamReader(its); 
	    	BufferedReader br = new BufferedReader(isr); 
	    	StringBuffer sb = new StringBuffer();  
            String line;  
            while ((line = br.readLine()) != null) {  
                sb.append(line);
            }
            p.waitFor(); 
          
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
	}
}

7 Respostas

fabin

Se é String line

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:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class VideoTime implements Runnable {
    
    private static String ffmpegApp;
    private static String video;
    private String time;
 
    public static void main(String[] args) {
	
	String ffmpegApp = "D:\Comum\Pessoais\ffmpeg\bin\ffmpeg.exe";
	String video = "D:\Comum\Pessoais\ffmpeg\videoplayback2.flv";
	
        VideoTime vt = new VideoTime(ffmpegApp, video);
	Thread comecar = new Thread(vt);
	comecar.start();
    }
    
   public VideoTime(String ffmpegApp, String video) {
	VideoTime.ffmpegApp = ffmpegApp;
	VideoTime.video = video;
    }
    
    public void run() {
	
	try {
	    String comando = ffmpegApp + " -i " + video;
	    Runtime rt = Runtime.getRuntime();
	    Process process = rt.exec(comando);
	    InputStream stderr = process.getErrorStream();
	    InputStreamReader isr = new InputStreamReader(stderr);
	    BufferedReader br = new BufferedReader(isr);
	    String line;
	    StringBuffer sb = new StringBuffer();
	    
	    while ((line = br.readLine()) != null) {
		sb.append(line);
	    }
	    
	    Pattern pattern = Pattern.compile("Duration: (.*?),");
	    Matcher matcher = pattern.matcher(sb);
	    
	    if (matcher.find()) {
		String time = matcher.group(1);
		int pos = 8;
		StringBuffer buf = new StringBuffer(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 (Exception e) {
	    e.printStackTrace();
	}
    }
    
    public void setFfmpegApp(String ffmpegApp) {
	VideoTime.ffmpegApp = ffmpegApp;
    }
    
    public void setTime(String time) {
	this.time = time;
    }
    
    public void setVideo(String video) {
	VideoTime.video = video;
    }
    public String getTime() {
	return time;
    }
}
Criado 26 de julho de 2011
Ultima resposta 28 de jul. de 2011
Respostas 7
Participantes 5