Bom dia a todos,
criei uma thread para ler um array de videos e converter os vídeos usando o ffmpeg.exe, ela chega a iniciar o processo (ffmpeg.exe) contudo a conversão só termina quando a thread é finalizada, ou seja, o arquivo de saída de vídeo chega a ser criado com alguns KBs mas fica ‘bloqueado’, mesmo colocando a thread para ‘dormir’ o processo não finaliza, só termina quando o laço é finalizado.
chamada da thread
import javax.swing.JOptionPane;
public class Principal {
/**
* @param args
*/
public static void main(String[] args) {
char flag = 'y';
Midia midia = new Midia();
ThreadTeste01 thread = new ThreadTeste01();
while (flag == 'y') {
//Caminho ORIGEM e DESTINO do vídeo.
midia.caminho = JOptionPane.showInputDialog(null,"Insira o caminho do arquivo de entrada").toString();
midia.destino = JOptionPane.showInputDialog(null,"Insira o caminho do arquivo de saída").toString();
//Adiciona o vídeo no array de vídeos a serem executados.
thread.addMidiaPooll(midia);
//confirma
flag = JOptionPane.showInputDialog(null,"Digite Y para continuar ou N para sair").toCharArray()[0];
}
if (flag == 'n')
thread.start();
}
}
thread:
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
public class ThreadTeste01 extends Thread {
List<Midia> midias = new ArrayList<Midia>();
String comandoConvert = null;
public String getComandoConvert() {
return comandoConvert;
}
public void setComandoConvert(String comandoConvert) {
this.comandoConvert = comandoConvert;
}
/**
* Formato AVI
*/
public static final String AVI_FORMAT = "avi";
public ThreadTeste01() {
}
public void addMidiaPooll(Midia midia) {
midias.add(midia);
}
public void run() {
Process process = null;
Midia midiaAProcessar = midias.get(0);
int i = 0;
System.out.println("Teste");
while (!midias.isEmpty()){
if ((!midias.isEmpty()) && (midiaAProcessar != null)){
setComandoConvert(command(midiaAProcessar.getCaminho(), midiaAProcessar.getDestino()));
try {
process = Runtime.getRuntime().exec(getComandoConvert());
midias.remove(0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
System.out.println("Não há videos a serem convertidos!");
}
}
}
/**
* Comando de Conversão
*/
private static final String COMMAND_AVI = "ffmpeg.exe -i {0} -qmin 6 -qmax 26 -ar 22050 -f flv -y {1}";
/**
* String do comando de conversão
* @param videoIn
* @param videoOut
* @return
*/
private static String command(String videoIn, String videoOut) {
String command = "";
String fileName = videoIn.substring(videoIn.lastIndexOf("/") + 1,
videoIn.length());
String extension = fileName.substring(fileName.lastIndexOf(".") + 1,
fileName.length());
// formato AVI
if (extension.equalsIgnoreCase(AVI_FORMAT)) {
command = new MessageFormat(COMMAND_AVI).format(new Object[] {
videoIn, videoOut });
} else {
throw new IllegalArgumentException(
"Formato de arquivo não suportado:" + extension);
}
return command;
}
}
class Midia {
String caminho = null;
String destino = null;
public String getCaminho() {
return caminho;
}
public void setCaminho(String caminho) {
this.caminho = caminho;
}
public String getDestino() {
return destino;
}
public void setDestino(String destino) {
this.destino = destino;
}
}