hello, i've been looking everywhere on the internet about how to show a progress bar while converting a video i found those answes http://stackoverflow.com/questions/11441517/ffmpeg-progress-bar-encoding-percentage-in-php http://stackoverflow.com/questions/747982/can-ffmpeg-show-a-progress-bar http://stackoverflow.com/questions/3770927/ffmpeg-video-encoding-progress-bar i tried all of them but nothing did work for me i found a php class http://sourceforge.net/projects/ffmpegprogress/ but if full of bugs and errors i use that code' exec('ffmpeg -i office.flv -r 24 output.avi'); Code (markup): to convert flv to avi it works but i need a progress bar i hope someone can help me
Since the conversion is running in an external program, you won't be getting progress data, so you can't run a progress bar. To do that you have to do the conversion in your program, and you have to write the code so it updates the progress bar.
try this function, not a progress bar but... you can use a gem for that... def exec_ffmpeg src_path, dst_path cmd = "ffmpeg -i \"%s\" -acodec libfaac -ac 2 -ab 128k -vcodec libx264 -threads 0 \"%s\" 2>&1" % [src_path, dst_path] puts "%s" % cmd.gsub(/2\>\&1$/,'') puts "press 'q' to quit" progress = nil dur_secs = nil frame_rate = nil frames = 0 dur_str = '00:00:00.000' ostr = '' ffmpeg = IO.popen(cmd) ffmpeg.each("\r") do |line| if dur_secs == nil && line =~ /Duration:\s*(\d*):(\d*):(\d*\.\d*)/ dur_str = $1.to_s + ":" + $2.to_s + ":" + $3.to_s dur_secs = ($3.to_f + ($2.to_i * 60).to_f + ($1.to_i * 360).to_f) puts "Video Duration:" + dur_str end if frame_rate == nil && line =~ /Stream.+\, (\d+\.{0,1}\d{0,3}) fps\,/ frame_rate = $1.to_f frames = dur_secs * frame_rate puts "Total Frames: %i" % frames.to_i puts "Frame Rate: %.3f fps" % frame_rate end if line =~ /frame=(\s.?(\d*))/ cframe = $1.to_i csecs = 0 if line =~ /time=\s*(\d*):(\d*):(\d*\.\d*)/ csecs = ($3.to_f + ($2.to_i * 60).to_f + ($1.to_i * 360).to_f) csecs_str = $1.to_s + ":" + $2.to_s + ":" + $3.to_s elsif line =~ /time=\s*(\d*\.\d*)/ csecs $1.to_f t = Time.at(csecs).gmtime csecs_str = "%0.2i:%0.2i:%0.2i.%3i" % [t.hour, t.min, t.sec, t.nsec] end if line =~ /fps=\s*(\d*)/ cfps = $1.to_i else cfps = 0 end if line =~ /bitrate=\s*(\d*\.\d*kbits)/ br = $1 else br = "???" end ostr = " %3.2f%% ( %s ) @frame:%i fps:%i bitrate:%s" % [((csecs/dur_secs)*100), csecs_str, cframe, cfps, br] print ostr + ("\b" * (ostr.length + 4)) end end print "\n" end Code (markup): My current version of ffmpeg: ffmpeg version 0.10.2 Copyright (c) 2000-2012 the FFmpeg developers built on May 5 2012 07:55:39 with clang 3.1 (tags/Apple/clang-318.0.58) configuration: --prefix=/Volumes/MetaPop/ffmpeg-build/sw/ --enable-gpl --enable-pthreads --enable-version3 --enable-libspeex --enable-libvpx --disable-decoder=libvpx --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-avfilter --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-filters --arch=x86 --enable-runtime-cpudetect --cc=clang --enable-nonfree libavutil 51. 35.100 / 51. 35.100 libavcodec 53. 61.100 / 53. 61.100 libavformat 53. 32.100 / 53. 32.100 libavdevice 53. 4.100 / 53. 4.100 libavfilter 2. 61.100 / 2. 61.100 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 6.100 / 0. 6.100 libpostproc 52. 0.100 / 52. 0.100 If you are using a different version of ffmpeg the output could be different. Adjust the regular expressions for your version of ffmpeg. If you can't figure the regular expressions out, post what the output from your version looks like and I can try and help.
I think the tricky part was that ffmpeg writes its output to stdout and stderr, so the " 2>&1" takes care of that. Here's my latest debugged version of this in Ruby is at: https://github.com/popmedic/ffmpeg-cl-wrappers
yeah this is the trick you should use the stdout to get the total video time and the current time and you can build the progress bar by using those 2
Have you tried this one? It was updated more recently https://sourceforge.net/projects/ffmpegprogress2/