Bom dia!
Esstou fazendo um programinha que automatiza os processos de transmissão e conversão de video, bem simples e tal :
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Automat {
public static void main(String[] args) throws IOException
{
int vezes;
File arquivo = new File("log.txt");
arquivo.createNewFile();
String ip,porta,arq;
Scanner scan = new Scanner(System.in);
System.out.println("Por favor, digite o numero de vezes:");
//pede as informacoes
vezes = scan.nextInt();
System.out.println("Informe o Ip:");
ip = scan.next();
System.out.println("Informe a porta:");
porta = scan.next();
System.out.println("De um nome para o arquivo(SEM A EXTENSAO):");
arq = scan.next();
//entra no laco
for(int x = 1;x<=vezes;x++)
{
//grava o primeiro comando
String [] cmdGrava={"bash","-c","cvlc http://"+ip+":"+porta+" --sout "+arq+x+".mp4 vlc://quit"};
//grava o comando que transforma o yuv para mp4
String [] cmdTransforma={"bash","-c","ffmpeg -i "+arq+x+".mp4 "+arq+x+".yuv"};
//grava o comando que gera os dados de comparacao da qualidade do videos transmitido para o video original
String [] cmdCompara={"bash","-c","wine"," psnr 352 288 420 "+arq+x+".yuv "+arq+x+".yuv >> log.txt"};
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmdGrava);
Process process2 = runtime.exec(cmdTransforma);
Process process3 = runtime.exec(cmdCompara);
}//fim loop
} //fim main
}//fim prog
O problema é que ele só executa o primeiro comando, acho que ta faltando alguma coisa que force todos os processos a serem executados, por favor me deem uma luz, seria necessário usar o Processbuilder? Não entendi bem como funciona.
Muito obrigado!
Quando você usa Runtime.exec e não usa “waitFor”, ele tenta deixar o processo rodando. Na prática, é como os três programas fossem disparados ao mesmo tempo, o que não é bom para você (onde você precisa executar primeiramente o cvlc, para então rodar o ffmpeg e por fim executar o psnr - não rodar os 3 ao mesmo tempo).
Como, pelo que vi, você precisa esperar o primeiro comando executar para executar então o segundo e o terceiro, há duas opções:
a) Usar o “waitFor” - procure aqui mesmo no GUJ um exemplo, ou
b) Criar um script bash que execute esses três comandos, e então executar via Java o script. Aí é o bash que se encarrega de esperar que o primeiro comando termine para executar o segundo, e assim por diante.
Opa! Obrigado, tava desconfiado disso =D
Então nesse caso, apos o waitFor o comando é executado e eu poderia usar a mesma instancia do process pra executar os 3 comandos? Ou eu teria que usar o destroy pra associar ao outro comando?
Gente, to tendo muita dificuldade, me ajudem pro favor!
executo os comando certinho, mas o comando do psnr quero jogar em arquivo so um valor, ai no comando uso o awk pra pegar so o numero que quero, para depois usar ele num calculo, mas não dá certo o awk, como posso fazer isso?
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Automat {
public static void main(String[] args) throws IOException,
InterruptedException
{
int vezes;
File arquivo = new File("log.txt");
arquivo.createNewFile();
File arquivo2 = new File("novo.txt");
arquivo2.createNewFile();
String ip,porta,arq;
Scanner scan = new Scanner(System.in);
System.out.println("Por favor, digite o numero de vezes:");
//pede as informacoes
vezes = scan.nextInt();
System.out.println("Informe o Ip:");
ip = scan.next();
System.out.println("Informe a porta:");
porta = scan.next();
System.out.println("De um nome para o arquivo(SEM A EXTENSAO):");
arq = scan.next();
//entra no laco
for(int x = 1;x<=vezes;x++)
{
//grava o primeiro comando
String [] cmdGrava={"bash","-c","cvlc http://"+ip+":"+porta+" --sout arquivo"+x+".mp4 vlc://quit"};
//grava o comando que transforma o yuv para mp4
String [] cmdTransforma={"bash","-c","ffmpeg -i arquivo"+x+".mp4 arquivo"+x+".yuv"};
//grava o comando que gera os dados de comparacao da qualidade do videos transmitido para o video original
String [] cmdCompara={"bash","-c","wine psnr.exe 352 288 420 "+arq+".yuv arquivo"+x+".yuv | awk '{print $10} 2>> log.txt"};
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmdGrava);
process.waitFor();
Process process2 = runtime.exec(cmdTransforma);
process2.waitFor();
Process process3 = runtime.exec(cmdCompara);
process3.waitFor();
}//fim loop
} //fim main
}//fim prog