Video 帧提取期间的ffmpeg视频扫描进度

Video 帧提取期间的ffmpeg视频扫描进度,video,ffmpeg,progress,ffprobe,Video,Ffmpeg,Progress,Ffprobe,我使用ffmpeg的过滤器扫描输入视频以提取特定帧。选择基于复杂的creteria,提取的帧数无法预测(我正在进行场景检测,但这可能有所不同-例如,选择所有I帧,等等) 我需要的是显示扫描(解码)视频的百分比(例如10%或90%) 我尝试了几种方法来完成解析控制台的输出,就像人们通常在处理编码时所做的那样,但这无助于扫描的进度(例如,或) 它产生的输出如下所示: <..> frame= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00

我使用
ffmpeg
的过滤器扫描输入视频以提取特定帧。选择基于复杂的creteria,提取的帧数无法预测(我正在进行场景检测,但这可能有所不同-例如,选择所有I帧,等等)

我需要的是显示扫描(解码)视频的百分比(例如10%或90%)


我尝试了几种方法来完成解析控制台的输出,就像人们通常在处理编码时所做的那样,但这无助于扫描的进度(例如,或)

它产生的输出如下所示:

<..>    
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=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\u time
指的是最后提取的帧在输入视频中的位置,所以我可以根据它计算扫描的进度

progress = out_time_ms/total_input_time 
但这并不理想,因为只有在提取与
select
标准匹配的新帧时才会更新。因此,如果我有很大一部分视频没有匹配的帧,那么进度在很长时间内不会改变


收尾

我正在寻找一种方法来计算使用过滤器时的视频扫描进度


非常感谢您的任何想法。

您在每一帧上获得的内容,如ffprobe中的数据

[FRAME]
media_type=video
key_frame=1
pkt_pts=0
pkt_pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
pkt_duration=1
pkt_duration_time=0.040000
pkt_pos=44
width=800
height=542
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
reference=3
[/FRAME]
一开始你会得到什么

I/stderr  ( 7434): Input #0, image2, from '/storage/sdcard0/Pictures/me374658335.jpg':
I/stderr  ( 7434):   Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
I/stderr  ( 7434):     Stream #0:0: Video: mjpeg, yuvj420p, 1296x972 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
I/stderr  ( 7434): Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/sdcard0/PictureComment/1347139284144.3gp':
I/stderr  ( 7434):   Metadata:
I/stderr  ( 7434):     major_brand     : 3gp4
I/stderr  ( 7434):     minor_version   : 0
I/stderr  ( 7434):     compatible_brands: isom3gp4
I/stderr  ( 7434):     creation_time   : 2012-09-08 21:21:41
I/stderr  ( 7434):   Duration: 00:00:17.22, start: 0.000000, bitrate: 67 kb/s
I/stderr  ( 7434):     Stream #1:0(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, s16, 64 kb/s
I/stderr  ( 7434):     Metadata:
I/stderr  ( 7434):       creation_time   : 2012-09-08 21:21:41
I/stderr  ( 7434):       handler_name    : SoundHandle
I/stderr  ( 7434): [libx264 @ 0x5a070910] using SAR=1/1
I/stderr  ( 7434): [libx264 @ 0x5a070910] using cpu capabilities: ARMv6 NEON
I/stderr  ( 7434): [libx264 @ 0x5a070910] profile High, level 3.2

您可以使用帧时间戳和持续时间来计算完成百分比吗?

尝试使用统计数据来报告在完成百分比时尚未处理的内容。每个帧都有一个时间戳。在init上,总持续时间有var。这两个VAR始终提供progress@RobertRowntree,感谢您的关注:我如何获得您所指的“报告尚未处理的内容的tats”?ffmpeg上开始时输入媒体曲目的标准输出信息包括“持续时间”或以秒为单位的总长度。。。。你能读懂这篇文章吗?然后,将其与每帧上的时间戳一起使用,以计算完成百分比。@RobertRowntree,我可以很容易地获得总长度,我的问题是我无法获得当前解码/扫描的帧编号,因为ffmpeg仅在通过选择条件时才输出帧统计(请参阅我问题中的第一个输出示例)罗伯特先生,谢谢你的意见。不幸的是,我不知道如何运行ffprobe来执行我需要的过滤器(vf select='gt(scene\,0.2'),showinfo)-可能吗?我对你的“开始”也有点困惑——它是命令还是执行命令的方式?回答你的问题:我可以很容易地从当前解码的帧时间戳计算进度,如果我只能以某种方式使ffmpeg输出它。(而是打印当前编码的帧)。也就是说,我有一个很长的视频(比如10000000帧),最后只有1或2帧符合过滤标准-因此ffmpeg在找到这2帧时只输出2行-直到那时扫描进度未知。我不知道您的代码使用的接口。我只转发了通过与ffmpeg、ffprobe等的CLI执行相关的其他接口提供的数据示例。我无法为您指出正在使用的接口上的方法/函数。嗨,Robert,谢谢您的帮助。很抱歉,如果问题不清楚:我正在通过以下方式从命令行执行ffmpeg:ffmpeg-progress sceneProgr.txt-I input.wmv-vsync passthrough-an-vf select='gt(scene\,0.2'),showinfo scene%%05d.png我的问题是打印到stder中的统计数据描述了输出帧(由select filter选择并保存到磁盘)而我需要知道当前从解码器**提取的帧**的编号(在传递到select filter之前)要计算到目前为止视频的哪一部分已经被分析过,你可能想看看这个。在这里,我们需要使用c接口来“读取帧”,但它确实描述了数据包时间戳周围的编程代码。
I/stderr  ( 7434): Input #0, image2, from '/storage/sdcard0/Pictures/me374658335.jpg':
I/stderr  ( 7434):   Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
I/stderr  ( 7434):     Stream #0:0: Video: mjpeg, yuvj420p, 1296x972 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
I/stderr  ( 7434): Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/sdcard0/PictureComment/1347139284144.3gp':
I/stderr  ( 7434):   Metadata:
I/stderr  ( 7434):     major_brand     : 3gp4
I/stderr  ( 7434):     minor_version   : 0
I/stderr  ( 7434):     compatible_brands: isom3gp4
I/stderr  ( 7434):     creation_time   : 2012-09-08 21:21:41
I/stderr  ( 7434):   Duration: 00:00:17.22, start: 0.000000, bitrate: 67 kb/s
I/stderr  ( 7434):     Stream #1:0(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, s16, 64 kb/s
I/stderr  ( 7434):     Metadata:
I/stderr  ( 7434):       creation_time   : 2012-09-08 21:21:41
I/stderr  ( 7434):       handler_name    : SoundHandle
I/stderr  ( 7434): [libx264 @ 0x5a070910] using SAR=1/1
I/stderr  ( 7434): [libx264 @ 0x5a070910] using cpu capabilities: ARMv6 NEON
I/stderr  ( 7434): [libx264 @ 0x5a070910] profile High, level 3.2