[Java] resultaat van commandprompt lezen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
Ik ben bezig een tooltje te maken waarmee je de bitrate uit kunt rekenen voor een avchd. Nu leek het me cool als leerprocess om vanuit java de x264 encoder aan te sturen. Met Runtime.getRuntime().exec("cmd.exe /c start"); kan ik het commandpromt venster openen. Daar was ik vrij vlug achter hoe dat moest. Nu kan ik dus achter start bv het volgende gooien:
x264.exe --pass 1 --bitrate 4200 --stats "test.stats" --level 4.1 --bframes 3 --b-pyramid --weightb --subme 7 --partitions p8x8,b8x8,i4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output "test.mkv" "film.avs" 1920x1080

heb het nog niet getest maar volgens mij moet dat gaan want dir met parameters werkte ook.
Maar het probleem is dat ik pass 2 en 3 handmatig moet starten als pass 1 klaar is met encoderen. Maar hoe krijg ik dat voor elkaar? Heb wat zitten kloten maar is niet gelukt.

Wat een optie zou kunnen zijn is telkens het resultaat van cmd door java uit te laten lezen. Als mijn programma dan zie van hij is klaar kan ik 2e cmd openen om 2e pass te starten. Maar het liefst wil ik natuurlijk diezelfde cmd gebruiken. Dus gewoon nieuwe code naar cmd sturen. Maar volgens mij gaat dat niet? Wie kan me helpen om dit probleem op te lossen?

Java skills zijn nog niet zo goed, zit momenteel in 2e jaar Informatica.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 15:57

Haan

dotnetter

Kan je niet met diezelfde Runtime.getRuntime() meteen x264.exe aanroepen? Dus:
Java:
1
Runtime.getRuntime().exec("x264.exe --pass 1 --bitrate 4200 --stats "test.stats" --level 4.1 --bframes 3 --b-pyramid --weightb --subme 7 --partitions p8x8,b8x8,i4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output "test.mkv" "film.avs" 1920x1080");
(dan wel even strings escapen waarschijnlijk)

Wat betreft de console uitlezen:
In C# kan je gewoon Console.Read() doen, misschien dat Java ook zoiets heeft? Ik ken wel System.In, maar weet niet zeker of dat de cmd.exe console uitleest.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • voodooless
  • Registratie: Januari 2002
  • Nu online

voodooless

Sound is no voodoo!

exec() geeft je een Process terug waarvan je gewoon alle streams kan lezen of schrijven. Zo kun je dus prima afvangen wat je proggie naar standaard of error output schrijft.

Do diamonds shine on the dark side of the moon :?


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ten eerste wil je gewoon "x264" of "cmd /c x264" doen, want als je START gebruikt dan krijg je voor ieder gestart proces een nieuwe console window. Daarnaast kun je natuurlijk wel ingewikkeld de output gaan zitten lezen, maar waarom start je de 3 processen niet gewoon na elkaar? Met het Process object kun je wel kijken of een proces geeindigd is. Het nadeel is wel dat als je applicatie een GUI applicatie is, je voor ieder proces een nieuw command window krijgt.

Maar je zou ook kunnen overwegen om een batchfiletje weg te schrijven en die uit te voeren, of nog beter, gewoon 'cmd' starten en de commando's schrijven naar z'n standard input (door de outputstream op te vragen van het process)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
opzich is een batchfile geen slecht idee. Toch wil ik eerst voor elkaar krijgen naar de commandline te schrijven. Ik zit te kloten en te kloten en het lukt me maar niet om er naar toe te schrijven. :(
Zo moet ik iig beginnen maar het schrijven lukt me niet. Er verschijnt gewoon niks in mn commandline.
Java:
1
2
3
4
5
//cmd opstarten
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("cmd.exe /c start");

//schrijven naar cmd


Welke stappen moet ik nu volgen om iets te gaan schrijven? Werkend voorbeeld zou me enorm helpen.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Wat dacht je van de getInputStream, getOutputStream en getErrorStream methodes van Process? Je
weet neem ik aan toch wel hoe je naar een stream moet schrijven? En wat doet die start aan het einde van je commando?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

No offence maar met google zijn kant en klaar werkende voorbeelden te vinden. Ook op het SDN (maar die link geeft google je ook) vindt je ook een volledig werkend voorbeeld terug.

No offence, maar het is wel de bedoeling dat je zelf even opzoek gaat naar docs en voorbeelden voordat je dat hier gaat vragen. Het hier hier geen helpdesk ook al willen sommigen je dat wel doen geloven ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
Dat lukt me dus niet. Heb hier en daar al complete code van internet gebruikt maar ik krijg er niks mee in mn cmd. Uiteraard ga ik eerst zelf puzzelen en proberen en lezen.

Ik moet toch eerst de cmd starten? Als ik zeg maar Process proc = rt.exec("cmd.exe /c dir"); doe dan blijft mn app hangen.

Probleem is denk ik dat ik het idee van de Process en Runtime icm Stream niet goed begrijp.

[ Voor 59% gewijzigd door Twazerty op 17-11-2008 14:38 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Je hoeft die CMD niet eerst te starten, je kan prima direct wat je in je CMD uitvoert ook direct laten uitvoeren en erop wachten. Ik snap dat je op het moment Process en Runtime niet goed begrijpt maar de links die ik je heb gegeven leggen het geheel prima uit. Je zou in staat moeten zijn omdat toch grotendeels te gaan snappen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Twazerty schreef op maandag 17 november 2008 @ 14:08:
opzich is een batchfile geen slecht idee. Toch wil ik eerst voor elkaar krijgen naar de commandline te schrijven. Ik zit te kloten en te kloten en het lukt me maar niet om er naar toe te schrijven. :(
Start eens gewoon cmd op, ipv cmd /c start, want dat laatste slaat nergens op (namelijk een nieuwe command window gebruiken om een nieuwe command window te openen 8)7) en bovendien werkt dat niet met standaard input en output (omdat ie die niet inherit van de parent - met start creëer je een nieuwe console met input en output verbonden aan die console)

[ Voor 15% gewijzigd door .oisyn op 17-11-2008 15:11 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
.oisyn schreef op maandag 17 november 2008 @ 15:06:
[...]

Start eens gewoon cmd op, ipv cmd /c start, want dat laatste slaat nergens op (namelijk een nieuwe command window gebruiken om een nieuwe command window te openen 8)7) en bovendien werkt dat niet met standaard input en output (omdat ie die niet inherit van de parent - met start creëer je een nieuwe console met input en output verbonden aan die console)
Wist ik veel :P .

Waarom blijft mijn proggie hangen terwijl input.close() daar staat?
Java:
1
2
3
4
5
6
7
8
Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec("cmd");
            String line = null;
            BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
            input.close();


In ieder geval krijg ik de tekst terug waarmee cmd opstart. Alleen het sturen van commando's moet ik nog even beter bekijken.

Ik die iets verkeerd maar ik weet niet wat.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
try {
            Runtime rt = Runtime.getRuntime();
            Process process = rt.exec("cmd");
            String line = null;
            BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
            input.close();

            //Als ik hier een breakpoint gooi komt de debugger hier niet aan.
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
            writer.write("cd C:\\");

            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
            
        } catch (Exception ex) {
            Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
        }


Hij komt gewoon nooit aan bij de breakpoint :? Doe ik het schrijven nu wel goed? Of moet ik schrijven in de OutputStreamWriter? Of klopt het helemaal niet meer? Met de gegeven links kom ik niet echt verder.

Deze tekst verschijnt iig in mijn output:
Microsoft Windows [versie 6.0.6000]
Copyright (c) 2006 Microsoft Corporation. Alle rechten voorbehouden.

Meer niet. Verder blijft ie in dit process hangen.

[ Voor 38% gewijzigd door Twazerty op 17-11-2008 16:52 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom sluit je de input stream? Ik zou 'm gewoon open houden, je krijgt immers nog data nadat je een commando hebt gegeven.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
.oisyn schreef op maandag 17 november 2008 @ 16:56:
Waarom sluit je de input stream? Ik zou 'm gewoon open houden, je krijgt immers nog data nadat je een commando hebt gegeven.
Oops ja. Maar hij komt zowieso niet bij die regel. Die word niet eens uitgevoerd want hij blijft daarvoor gewoon hangen.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 15:57

Haan

dotnetter

Blijft ie op deze regel hangen?
Java:
1
while ((line = input.readLine()) != null) {

Kom ik weer met C# ;) maar als je daar een Read() of ReadLine() op de Console doet, moet je wel eerst een keer op enter drukken..

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • voodooless
  • Registratie: Januari 2002
  • Nu online

voodooless

Sound is no voodoo!

Hanger waarop :? Welke regel?

Als ik mag gokken, dan ga ik voor readLine()? Lees eens de api docs van deze methode...

Verder snap ik eigenlijk niet waarom je cmd aanroept, terwijl je doen is om x264.exe te starten. Mis ik iets :?

Do diamonds shine on the dark side of the moon :?


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
Haan schreef op maandag 17 november 2008 @ 17:13:
Blijft ie op deze regel hangen?
Java:
1
while ((line = input.readLine()) != null) {

Kom ik weer met C# ;) maar als je daar een Read() of ReadLine() op de Console doet, moet je wel eerst een keer op enter drukken..
Nou nee volgens mij niet want:
Java:
1
2
3
4
5
6
7
8
9
10
Runtime rt = Runtime.getRuntime();
            Process process = rt.exec("cmd.exe");
            String line = null;
            BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
            writer.write("cd C:\\");
            writer.write("cmd /c dir");
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }

nu word alle code wel uitgevoerd alleen krijg ik niet meer op mijn scherm dan de 2 standaart cmd regels. Als ik /n toevoeg maakt dat geen verschil. Als ik dus dat loopje tussen BufferReader en Writer zet word BufferdWriter niet meer uitgevoerd.

X264.exe is commandline gestuurd ;), ik moet 3 keer x264 starten. Na elkaar en wil tussentijds continue terugkoppeling hebben van cmd.

[ Voor 4% gewijzigd door Twazerty op 17-11-2008 17:20 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 15:57

Haan

dotnetter

Je bent wel bekend met het gebruik van een debugger?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat is idd een blocking read, die wacht gewoon tot er meer output komt. Maar cmd.exe geeft die niet totdat er een commando komt die wat te outputten heeft :). Je moet dus even kijken of er wel bytes beschikbaar zijn in de stream (met available()). Waarschijnlijk moet je dan ook geen BufferedReader gebruiken, maar ik ben verder geen Java guru.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
Haan schreef op maandag 17 november 2008 @ 17:18:
Je bent wel bekend met het gebruik van een debugger?
Jazeker gebruik niets anders al ik er niet uitkom.
.oisyn schreef op maandag 17 november 2008 @ 17:18:
Dat is idd een blocking read, die wacht gewoon tot er meer output komt. Maar cmd.exe geeft die niet totdat er een commando komt die wat te outputten heeft :). Je moet dus even kijken of er wel bytes beschikbaar zijn in de stream (met available()). Waarschijnlijk moet je dan ook geen BufferedReader gebruiken, maar ik ben verder geen Java guru.
ik zie het ja. Blijft hangen op de readline().

[ Voor 54% gewijzigd door Twazerty op 17-11-2008 17:22 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 15:57

Haan

dotnetter

Twazerty schreef op maandag 17 november 2008 @ 17:20:
[...]

Jazeker gebruik niets anders al ik er niet uitkom.


[...]


ik zie het ja. Blijft hangen op de readline().
Ik vroeg het omdat je niet zeker leek te weten waar het programma bleef hangen, als je debugt, zie je dat natuurlijk direct :)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
Haan schreef op maandag 17 november 2008 @ 17:23:
[...]

Ik vroeg het omdat je niet zeker leek te weten waar het programma bleef hangen, als je debugt, zie je dat natuurlijk direct :)
Was nog niet meteen doorgedrongen dat het ook echt daar fout liep. :) Maar hoe los ik het nu op. readline() kan ik dus niet gebruiken. Als ik er ready() neerzet en de readline in de loop zie ik het resultaat van de cmd niet meer?

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Omdat de input mondjesmaat binnenkomt. Je moet dus (als je het op deze manier wilt blijven aanpakken) iets met tijd gaan doen, of de prompt detecteren oid. Maar sowieso hoef je niet éérst te lezen voordat je de commando's kunt schrijven. Je kunt ook alvast alle commando's schrijven, en daarna de input (blocking) blijven lezen. Als je als laatste commando "exit" doet, dan wordt de stream vanzelf geclosed door cmd.exe en stopt je blocking read.

[ Voor 3% gewijzigd door .oisyn op 17-11-2008 17:30 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
Ok dat snap ik dat ik alle commando's achter elkaar kan geven. Als ik in de huidige code als commando notepad.exe doorstuur verschijnt notepad niet? Dat zou dan toch gewoon moeten werken?

Ik word echt knettergek van dat ding.

[ Voor 9% gewijzigd door Twazerty op 17-11-2008 17:49 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Flush je de writer wel?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
Hoe kon ik dat nu vergeten. Hij start nu mooi 2x notepad op en laat hem ook 2x zien in mijn output. Nu heb ik nog 1 probleem. Dat is dat bij button nog blijft hangen. Ofwel de voorwaarde in de while klopt nog niet. Dit heb ik nu:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Runtime rt = Runtime.getRuntime();
            Process process = rt.exec("cmd.exe");
            String line = null;
            InputStreamReader isr = new InputStreamReader(process.getInputStream());
            BufferedReader input = new BufferedReader(isr);
            OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream());
            BufferedWriter writer = new BufferedWriter(osw);
            writer.write("notepad.exe\n");
            writer.write("notepad.exe\n");
            writer.write("exit\n");
            writer.flush();
            
            //hier klopt de while voorwaarde nog niet
            while((line = input.readLine()) != null) {
                line = input.readLine();
                System.out.println(line);
                
            }
            System.out.println("test");
            writer.close();
            input.close();


De genoemde availible() methode heb ik niet gevonden. isr.ready()==false werkt ook niet goed. Wat zou de beste oplossing zijn? Kan tot nu toe niet echt bedenken wat ik als oplossing moet gebruiken. Ben ik de exit vergeten te \n'nen. Zou ik verder zo nog problemen kunnen krijgen? omdat ik deze while voorwaarde heb?

[ Voor 3% gewijzigd door Twazerty op 17-11-2008 18:42 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je kan het geheel ook gewoon in een andere thread stoppen. En anders moet je non-blocking gaan lezen (steeds kijken hoeveel bytes er in de stream staan (dus niet via de reader, maar direct op de stream!) met available(), en dan zoveel bytes lezen en tonen).

.edit: oh wacht, je deed al een exit. Hmm, vaag, als cmd.exe afsluit zou hij gewoon een EOF moeten krijgen en dus zal readLine() null returnen. Dacht ik iig.

[ Voor 25% gewijzigd door .oisyn op 17-11-2008 18:49 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
.oisyn schreef op maandag 17 november 2008 @ 18:46:
Je kan het geheel ook gewoon in een andere thread stoppen. En anders moet je non-blocking gaan lezen (steeds kijken hoeveel bytes er in de stream staan (dus niet via de reader, maar direct op de stream!) met available(), en dan zoveel bytes lezen en tonen).
Iig verschijnt nu maar 1 regel van de 2.
Alleen Copyright (c) 2006 Microsoft Corporation. Alle rechten voorbehouden. Is nu zichtbaar. Overige 3 regels zijn gewoon aanwezig.

Aparte tread ga ik wel doen. Is wel het slimste. Maar hoe moet ik de voorwaarde dan maken. Gewoon oneindig gaan loopen ofzo?

Nu snap ik er weer geen flikker van. x264.exe word nu uitgevoerd. Maar x264.exe blijft in mijn taakbeheer mooi op 0% staan totdat ik mijn java programma kill. Dan begint dat process te lopen. x264.exe en bijbehoorende processen zijn wel gestart. Hoe kan dat?

Oplossing:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Runtime rt = Runtime.getRuntime();
            Process process = rt.exec("cmd.exe");
            String line = null;
            InputStreamReader isr = new InputStreamReader(process.getInputStream());
            BufferedReader input = new BufferedReader(isr);
            
            OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream());
            BufferedWriter writer = new BufferedWriter(osw);
            
            InputStreamReader esr = new InputStreamReader(process.getErrorStream());
            BufferedReader error = new BufferedReader(esr);
            
            writer.write("D:\n");
            writer.write("cd \"X264 test encoder\"\n");
            writer.write("run.bat\n");
            writer.flush();

            String errorline = null;
            while((errorline = error.readLine())!= null){
                System.out.println(errorline);
            }

momenteel draai ik even een bat file maar dat ga ik nog veranderen. Ook moet ik nog wat doen dat ik het encodeerprocess kan killen als ik de app sluit. Lukt het niet kom ik hier weer terug. Iig bedankt voor het meedenken en helpen.

[ Voor 55% gewijzigd door Twazerty op 17-11-2008 20:46 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Waarom doe je eigenlijk zo moeilijk door het via cmd te spelen? Waarom roep je die decoder niet direct aan via exec()?

Verder belangrijk lees voer:
http://www.javaworld.com/...2-2000/jw-1229-traps.html

Waarin waarschijnlijk al je problemen aan bod komen.

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
Remus schreef op maandag 17 november 2008 @ 22:15:
Waarom doe je eigenlijk zo moeilijk door het via cmd te spelen? Waarom roep je die decoder niet direct aan via exec()?

Verder belangrijk lees voer:
http://www.javaworld.com/...2-2000/jw-1229-traps.html

Waarin waarschijnlijk al je problemen aan bod komen.
daarmee loop ik tegen allerlei andere problemen aan. Nu iets geks.
Als ik deze code uitvoer begint ie meteen te encoderen:

x264.exe --pass 1 --bitrate 4200 --stats "test.stats" --level 4.1 --bframes 3 --b-pyramid --weightb --subme 7 --partitions p8x8,b8x8,i4x4 --threads auto --thread-input --progress --no-psnr --no-ssim --output "test.mkv" "film.avs" 1920x1080

en deze code begint pas te runnen als ik mn programma sluit:

x264.exe --pass 1 --bitrate 8000 --stats "test.stats" --level 4.1 --keyint 24 --min-keyint 2 --ref 3 --mixed-refs --bframes 3 --b-adapt 2 --weightb --direct auto --deblock -1:-1 --subme 7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --ipratio 1.1 --pbratio 1.1 --vbv-bufsize 40000 --vbv-maxrate 40000 --qcomp 0.5 --me umh --threads auto --thread-input --progress --no-psnr --no-ssim --output "test.mkv" "film.avs" [1920x1080] --mvrange 511 --aud --nal-hrd --sar 1:1

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 14:01

NetForce1

(inspiratie == 0) -> true

Je moet zorgen dat je al die streams leeg lepelt, want anders blijft Java daar op hangen. Het is het beste om dat in een aparte thread te doen lijkt me.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
NetForce1 schreef op maandag 17 november 2008 @ 23:11:
Je moet zorgen dat je al die streams leeg lepelt, want anders blijft Java daar op hangen. Het is het beste om dat in een aparte thread te doen lijkt me.
Gebeurt ook. Zit nu in een aparte thread. Tenminste volgens mij was het niet meer als extends Thread. Eerste regel code loopt gewoon en zie de output in mn output venster van netbeans. De 2e doet dat niet.Die blijft gewoon hangen. Terwijl ik verder niks aan de code wijzig. Alleen het bat bestandje.

Lijkt er nu niet op dat ik in een aparte thread werk. Want mn button blijft hangen.

[ Voor 7% gewijzigd door Twazerty op 17-11-2008 23:24 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

Verwijderd

Alleen extends Thread is inderdaad niet voldoende, je zult de public void run() methode uit Thread (of de interface Runnable) moeten implementeren.

Simpel gezegd: hetgeen wat in een aparte thread uit moet worden gevoerd, moet in de run methode staan of vanuit de run methode worden aangeroepen.

Via de start() methode van Thread kan je dit vervolgens daadwerkelijk in een nieuwe thread laten uitvoeren.

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
Verwijderd schreef op maandag 17 november 2008 @ 23:26:
Alleen extends Thread is inderdaad niet voldoende, je zult de public void run() methode uit Thread (of de interface Runnable) moeten implementeren.

Simpel gezegd: hetgeen wat in een aparte thread uit moet worden gevoerd, moet in de run methode staan of vanuit de run methode worden aangeroepen.

Via de start() methode van Thread kan je dit vervolgens daadwerkelijk in een nieuwe thread laten uitvoeren.
dat is me nu gelukt met wat hulp van mr google. Maar nog steeds wil het andere bat bestand niet direct runnen. Als ik beide bat files handmatig start doen ze het gewoon. Dus lijkt me geen foutje in mijn bat file.

[ Voor 7% gewijzigd door Twazerty op 17-11-2008 23:56 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 14:01

NetForce1

(inspiratie == 0) -> true

Heb je wel voor beide input streams een aparte thread? Anders gaan ze alsnog op elkaar staan wachten.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Je leest waarschijnlijk alleen de normale inputstream (ofwel de standaard out van de aangeroepen applicatie) uit, en niet de error inputstream (ofwel de error out van de aangeroepen applicatie). (je kan evt de error redirecten naar de standaard).

Dit staat echt allemaal beschreven in het artikel dat ik eerder postte.

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 16:18

Twazerty

AVCHDCoder developer

Topicstarter
NetForce1 schreef op dinsdag 18 november 2008 @ 09:10:
Heb je wel voor beide input streams een aparte thread? Anders gaan ze alsnog op elkaar staan wachten.
Dat heb ik nog niet gedaan.
Remus schreef op dinsdag 18 november 2008 @ 14:23:
Je leest waarschijnlijk alleen de normale inputstream (ofwel de standaard out van de aangeroepen applicatie) uit, en niet de error inputstream (ofwel de error out van de aangeroepen applicatie). (je kan evt de error redirecten naar de standaard).

Dit staat echt allemaal beschreven in het artikel dat ik eerder postte.
Dat was inderdaad het probleem. De normale input stream had ik uitgezet. Gisteren nog opgelost iig. Waarschijnlijk een bug in netbeans want opzich zou mijn andere script niet hebben mogen werken. Nu werkt het iig. Nu kan ik tenminste verder met het bouwen van een GUI. Maar beide input streams in een aparte thread. Mmh lijkt me geen slecht idee.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • voodooless
  • Registratie: Januari 2002
  • Nu online

voodooless

Sound is no voodoo!

Je kunt natuurlijk alles prima in een thread doen zolang je geen blocking methodes gebruikt...

Do diamonds shine on the dark side of the moon :?

Pagina: 1