ffmpeg
我使用的选择过滤器扫描输入视频以提取某些帧。选择基于复杂的标准,无法预测提取帧的数量(我正在做场景检测,但这可能会有所不同——例如选择所有I帧等)。
我需要的是显示扫描(解码)视频的百分比(例如 10% 或 90%)。
我尝试了几种方法来解析控制台输出,就像人们在处理编码时通常所做的那样,但它对扫描进度没有帮助(例如,ffmpeg 可以显示进度条吗?或ffmpeg 进度条 - PHP 中的编码百分比)
ffmpeg -progress sceneProgr.txt -i input.wmv -vsync passthrough -an -vf select='gt(scene\,0.2)',showinfo scene%%05d.png
这产生的输出如下:
<..>
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.
frame=...
和行都n:...
指输出中的数字,因此不能像人们通常这样做的那样用于计算进度(因为我无法预测会预先找到多少帧,此外,它们并没有均匀分布在输入视频)。
如果我指定-progress progress.txt
参数,progress.txt文件如下:
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
新部分大约每秒写入一次,并且指的是最后提取的帧。参考输入视频中最后提取的帧的位置,这有点帮助out_time
,因此我可以从中计算扫描进度
progress = out_time_ms/total_input_time
但这并不理想,因为只有在提取出符合条件的新帧时才会更新它。select
所以,如果我有很大一部分视频没有匹配的帧,那么在很长一段时间内进度都不会改变。
总结:
我正在寻找一种在使用选择过滤器时计算视频扫描进度的方法。
任何想法都非常感谢。