I scan input video to extract certain frames using ffmpeg
's select filter. The selection is based on a complex creteria and the number of extracted frames can't be predicted (I'm doing scene detection, but this can be something different - e.g. selecting all the I frames, etc).
What I need is to display the percentage of scanned (decoded) video (e.g. 10% or 90%).
I tried several ways to do this parsing console output as people usually do when dealing with encoding, but it doesn't help with the progress of scanning (e.g. Can ffmpeg show a progress bar? or ffmpeg Progress Bar - Encoding Percentage in PHP)
ffmpeg -progress sceneProgr.txt -i input.wmv -vsync passthrough -an -vf select='gt(scene\,0.2)',showinfo scene%%05d.png
The output this produces is as follows:
<..>
frame= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A
n:0 pts:16550 pts_time:16.55 pos:4205325 fmt:rgb24 sar:0/1 s:640x480 i:P iskey:1 type:I checksum:95895BC9 plane_checksum:[95895BC9]
frame= 1 fps=0.7 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A
n:1 pts:24591 pts_time:24.591 pos:6685325 fmt:rgb24 sar:0/1 s:640x480 i:P iskey:0 type:P checksum:FF4CC015 plane_checksum:[FF4CC015]
'frame=...' and 'n:...' lines are repeated for each of the extracted frames.
Both frame=...
and n:...
lines refer to the numbers in the output and therefore can't be used to calculate progress the way people usually do this (as I can't predict how many frames will be found beforehead and besides, they are not uniformly spread across the input video).
If I specify -progress progress.txt
parameter, the progress.txt file is as follows:
frame=5
fps=1.2
stream_0_0_q=0.0
total_size=N/A
out_time_ms=43209833
out_time=00:00:43.209833
dup_frames=0
drop_frames=0
progress=continue
frame=6
fps=1.3
stream_0_0_q=0.0
total_size=N/A
out_time_ms=52252200
out_time=00:00:52.252200
dup_frames=0
drop_frames=0
progress=continue
frame=6
fps=1.2
stream_0_0_q=0.0
total_size=N/A
out_time_ms=52252200
out_time=00:00:52.252200
dup_frames=0
drop_frames=0
progress=continue
New portion is written approximately every second and refers to the last extracted frame.
Which is somewhat helpful as out_time
refers to the last extracted frames' position in the input video, so I can calculate the progress of the scan from it as
progress = out_time_ms/total_input_time
But this is not ideal as it will be updated only when the new frame which matches the select
criteria is extracted. So, If I have a large portion of video with no matching frames, the progress won't change for a lot of time.
Wrapping-up:
I am looking for a way to calculate the progress of video scanning when using select filter.
Any ideas are strongly appreciated.