Keveqiah Posted June 8, 2010 Share Posted June 8, 2010 Hi! A problem would be to avi, flv (ffmpeg), I would like to convert to a progress indicator, which shows that, when it will be ready for conversion. The progress indicator has been "flashing" extends until the process is running. How can I tell where you are in the process? $ffmpeg = @ScriptDir & "\ffmpeg.exe" $running = '"'& $ffmpeg &'" -i "'& $video_helye &'" -vcodec flv -f flv -r 29.97 -s 320x240 -aspect 4:3 -b 300kb -g 160 -cmp dct -subcmp dct -mbd 2 -flags +aic+cbp+mv0+mv4 -trellis 1 -ac 1 -ar 22050 -ab 56kb "'&$milyen_neven&'"' ;~ Run($ffmpeg, "", @SW_MAXIMIZE) $ff_mpeg = Run($running,"",@SW_HIDE, $STDERR_CHILD) ProcessSetPriority($ff_mpeg, 0) $streamcounter = 0 While ProcessExists($ff_mpeg) If 1 <= $streamcounter Then $streamcounter = 0 Else $streamcounter = $streamcounter + 10 EndIf GUICtrlSetData($Progress_konv, $streamcounter) WEnd Link to comment Share on other sites More sharing options...
Tvern Posted June 8, 2010 Share Posted June 8, 2010 First you'll need to read the StdOut stream of ffmpeg in some way. Then you need to determine the full length of the file. Then you need to read the current progress of the encoder. With that data you can do the following: ($Current_progress/$Full_Length)*100 = $progres_Percentage. $progres_Percentage is wat you want to set the progressbar to. Example: Local $line, $fulltime, $lastreturn Local $infile = "1.avi" Local $outfile = "2.avi" Local $ffmpeg = @ScriptDir & "\ffmpeg.exe" GUICreate("My GUI Progressbar", 220, 100, 100, 200) $process = GUICtrlCreateProgress(10, 10, 200, 20) GUISetState() Local $PID = Run($ffmpeg & " -i " & $infile & " " & $outfile, @ScriptDir, @SW_HIDE, 0x08) ;run ffmpeg as stdout child While 1 $line &= StdoutRead($PID) ;read stdout If @error Then ExitLoop ;exit loop when stdout stream ends If Not $fulltime Then ;runs if the total length is unknown $return = StringRegExp($line,"Duration: (\d{2}):(\d{2}):(\d{2})",1) ;get the full length of the file If IsArray($return) Then $fulltime = $return[0]*3600 + $return[1]*60 + $return[2] ;convert the length to seconds. EndIf EndIf $array = StringSplit($line,@CRLF) ;create an array with lines like this: frame= 962 fps=374 q=31.0 size= 2242kB time=40.12 bitrate= 457.7kbits/s $return = StringRegExp($array[$array[0]-1],"time=(\d+)",1) ;grab the amount of seconds from the second to last line. (that one is always complete) If @error Then ContinueLoop If $return[0] <> $lastreturn Then ;if the progress changed this is true $lastreturn = Number($return[0]) GUICtrlSetData($process,Int(($lastreturn/$fulltime)*100)) ;set the processbar EndIf WEnd kritya 1 Link to comment Share on other sites More sharing options...
Keveqiah Posted June 9, 2010 Author Share Posted June 9, 2010 Thank you very much. The StdoutRead () I tried it, but I did not know how to go after him. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now