Ciao barnabo, io sto cercando di fare più o meno la stessa cosa che stai facendo tu, ma utilizzando l'eseguibile ffmpeg.
Premetto subito (come presentazione) che non sono un abile sviluppatore Java in quanto mi occupo di altro, ma pensavo fosse una cosa abbastanza semplice da fare.
Ho creato un programmino, distribuito in un JAR. All'interno del Jar ho copiato due versioni, una per Windows e l'altra per Mac, dell'eseguibile ffmpeg.
Ora, quando eseguo il Jar, questo estrae in una directory temporanea l'eseguibile corretto (se mi trovo su Windows: ffmpeg.exe, se mi trovo si Mac: ffmpeg) e poi prova ad eseguire il processo.
Per facilità, quando estraggo l'eseguibile, mi faccio stampare a video il path dello stesso.
Il problema è semplice: se eseguo sotto Windows riesco ad eseguire correttamente l'eseguibile, se provo da Mac non ricevo nessuna risposta (ma neanche nessuna eccezione) da ffmpeg. Ma la cosa più strana è che se tramite altra finestra terminale provo ad eseguire ffmpeg dalla directory temporanea, tutto funziona correttamente.
Posto un pò di codice:
Questo è il main
public static void main(final String[] args)
throws URISyntaxException,
ZipException,
IOException
{
final URI uri;
final URI exe;
String asstio = "";
String osType = "";
try
{
uri = getJarURI();
osType= System.getProperty("os.name");
if(osType.substring(0, 3).equalsIgnoreCase("win"))
{
//if win
exe = getFile(uri, "ffmpeg.exe");
asstio = exe.toString().replaceFirst("file:/C:", "C:");
}
else
{
//if mac
exe = getFile(uri, "ffmpeg");
asstio = exe.toString().replaceFirst("file:", "");
}
System.out.println("");
System.out.println(asstio);
System.out.println("");
}
catch(Exception eex)
{
System.out.print(eex.getMessage());
}
System.out.println("Inserisci nome file video (completo di percorso (INVIO PER FINIRE)");
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
String s;
while ((s = sin.readLine()) != null && s.length() != 0)
{
break;
}
System.out.println("");
try
{
Process child = null;
if(osType.substring(0, 3).equalsIgnoreCase("win"))
{
System.out.println(asstio + " -i \"" + s + "\"");
child = Runtime.getRuntime().exec(asstio + " -i \"" + s + "\"");
}
else
{
System.out.println(asstio + " -i \"" + s + "\"");
child = Runtime.getRuntime().exec(asstio + " -i \"" + s + "\"");
}
System.out.println("");
InputStream lsOut = lsOut = child.getErrorStream();
InputStreamReader r = new InputStreamReader(lsOut);
BufferedReader in = new BufferedReader(r);
String line;
while ((line = in.readLine()) != null)
{
if(line.contains("Duration:"))
{
line = line.replaceFirst("Duration: ", "");
line = line.trim();
System.out.println("DURATA: " + line.substring(0, 11));
break;
}
}
}
catch (Exception e)
{
System.out.println("Command failed! " + e.getMessage());
}
}
Il metodo che estrae l'eseguibile nella directory temporanea:
private static URI extract(final ZipFile zipFile,
final String fileName)
throws IOException
{
final File tempFile;
final ZipEntry entry;
final InputStream zipStream;
OutputStream fileStream;
tempFile = File.createTempFile(fileName, "");
tempFile.deleteOnExit();
entry = zipFile.getEntry(fileName);
if(entry == null)
{
throw new FileNotFoundException("cannot find file: " + fileName + " in archive: " + zipFile.getName());
}
zipStream = zipFile.getInputStream(entry);
fileStream = null;
try
{
final byte[] buf;
int i;
fileStream = new FileOutputStream(tempFile);
buf = new byte[1024];
i = 0;
while((i = zipStream.read(buf)) != -1)
{
fileStream.write(buf, 0, i);
}
}
finally
{
close(zipStream);
close(fileStream);
tempFile.setExecutable(true, true);
tempFile.canExecute();
}
return (tempFile.toURI());
}
Pensavo che fosse una questione di permessi, così ho fatto vari tentativi ad esempio dando 777 al file temporaneo ma il non riesco ancora a farlo funzionare correttamente.
Spero di avere qualche dritta e che ti possa essere utile il codice (mancano alcuni metodi ovviamente, in caso funzionasse ti passo il tutto)
tozoo