Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

Java exec hangt

Pagina: 1
Acties:

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 01:10
Hallo,

In Java lees ik een map uit en kijk loop daarna door alle flv bestanden, en roep ffmpeg aan met parameters om het om te zetten naar een .avi.

Maar dit werkt niet helemaal lekker, de output van ffmpeg zet ik in een textarea (niet dat er iets verschijnt?)

Nu is mijn probleem, ffmpeg start, gaat de eerste 100kb oid omzetten van het filmpje, en wacht en doet niets meer. Totdat ik mijn java applicatie afsluit, dan gaat hij ineens vrolijk verder met het converteren van het filmpje.

Hoe kan ik dit oplossen? Ik heb op het internet gelezen dat ik de output moet uitlezen, omdat anders de output verstopt raakt zeg maar. Maar dit helpt ook niets, ook heb ik de waitFor() methode aangeroepen, maar dit doet ook geen verschil.

Mijn code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
Process ffmpegPr;
try {
    ffmpegPr = Runtime.getRuntime().exec("\"" + ffmpegDir + File.separator + "ffmpeg.exe\" -i \"" + theWorkingDir + File.separator + curFile + "\" \"" + theWorkingDir + File.separator + withoutExt + ".avi\"");
    ffmpegPr.waitFor();
    BufferedReader ffmpegBuffer = new BufferedReader(new InputStreamReader(ffmpegPr.getInputStream()));
    String line;
    while((line = ffmpegBuffer.readLine()) != null) {
        gui.text.append(line);
    }
} catch (Exception e) {
    gui.text.append(e.getMessage() + "\n");
}

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 09:22

TeeDee

CQB 241

Ik vermoed dat getRuntime in combinatie met je OS een gelimiteerde buffer voor in/output heeft.

Lees eens: http://www.javaworld.com/...jw-1229-traps.html?page=2 en dan vanaf Why Runtime.exec() hangs

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Marcj
  • Registratie: November 2000
  • Nu online
Je hebt twee InputStreams, er is ook nog een getErrorStream() methode. Waarschijnlijk wordt hier ook naar geschreven.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 17-11 16:12

Robtimus

me Robtimus no like you

Marcj schreef op dinsdag 05 augustus 2008 @ 19:04:
Je hebt twee InputStreams, er is ook nog een getErrorStream() methode. Waarschijnlijk wordt hier ook naar geschreven.
Dat hoeft niet per se, maar zelfs dan moet je de output ervan wel inlezen.

@TeeDee: dat artikel is zo goed dat ik het zelfs gebookmarked heb, om het snel te vinden om aan anderen te laten zien.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • ZpAz
  • Registratie: September 2005
  • Laatst online: 01:10
Ik haal nu ook de errorStream op, welke inderdaad alle output krijgt, en lees het uit in een aparte thread, en dat werkt prima. Bedankt!

(Zet binnenkort het tooltje wel eens in 'welke tools heb jij gemaakt')

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
IceManX schreef op dinsdag 05 augustus 2008 @ 21:29:
[...]

Dat hoeft niet per se, maar zelfs dan moet je de output ervan wel inlezen.
Als je ProcessBuilder gebruikt ipv Runtime.exec(...), dan kan je met redirectErrorStream(boolean) de errorstream door sluizen naar de standaard output en hoef je dus alleen de stdout te lezen via getInputStream().
Pagina: 1