【问题标题】:ffmpeg Video Scan Progress during Frame Extarction帧提取期间的ffmpeg视频扫描进度
【发布时间】:2013-03-26 14:26:09
【问题描述】:

我使用ffmpegselect 过滤器扫描输入视频以提取某些帧。选择基于复杂的标准,无法预测提取帧的数量(我正在做场景检测,但这可能会有所不同 - 例如选择所有 I 帧等) .

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


我尝试了几种方法来解析控制台输出,就像人们在处理编码时通常所做的那样,但它对扫描进度没有帮助(例如 Can ffmpeg show a progress bar?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

这产生的输出如下:

<..>    
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 标准匹配的新框架时才会更新。所以,如果我有很大一部分视频没有匹配的帧,那么在很长一段时间内进度都不会改变。


总结

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

非常感谢任何想法。

【问题讨论】:

  • 尝试使用统计信息来报告尚未处理的内容以完成百分比。每帧都有一个时间戳。在 init 上,您有 var 的总持续时间。这 2 个变量总是提供进度衡量标准
  • @RobertRowntree,感谢您查看:我如何获得您所指的“报告尚未处理的内容的 tats”?
  • 在 ffmpeg 上用于 BEGIN 输入媒体轨道的标准输出信息包括“持续时间”或以秒为单位的总长度....你能阅读这个或以某种方式得到它吗?然后,将其与每帧上的时间戳一起使用来计算完成百分比。
  • @RobertRowntree ,我可以轻松获得总长度,我的问题是我无法获得 当前解码/扫描 帧号,因为 ffmpeg 仅在以下情况下输出帧统计信息它已经通过了 select 条件(请参阅我的问题中的第一个示例输出)。

标签: video ffmpeg progress ffprobe


【解决方案1】:

你在每一帧上得到什么,比如来自 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]

BEGIN 的收获

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

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

【讨论】:

  • 罗伯特,感谢您的意见。不幸的是,我不知道如何运行 ffprobe 来执行我需要的过滤器 (vf select='gt(scene\,0.2)',showinfo) - 有可能吗?我也对您的“BEGIN”感到有些困惑-它是命令还是执行命令的方式?
  • 回答你的问题:如果我只能以某种方式让 ffmpeg 输出这个,我可以很容易地从 当前解码 帧时间戳计算进度。 (而是打印 currentlycoded 帧)。 IE。我有一个长视频(例如,10000000 帧),最后只有 1 或 2 帧 符合过滤条件 - 所以 ffmpeg 只为这 2 帧输出 2 行当它找到它们时 - 在此之前保持扫描进度未知。
  • 我不知道您的代码使用的接口。我只转发了通过与 ffmpeg、ffprobe 等的 CLI 执行相关的其他接口可用的数据示例。我无法将您指向您正在使用的接口上的方法/函数。
  • 您好罗伯特,感谢您的帮助。抱歉,如果问题不清楚:我正在以下列方式从命令行执行 ffmpeg:ffmpeg -progress sceneProgr.txt -i input.wmv -vsync passthrough -an -vf select='gt( scene\,0.2)',showinfo scene%%05d.png 我的问题是打印到 stder 的统计信息描述了 输出帧(那些,由 选择过滤器并保存到磁盘)而我需要知道**当前从解码器中提取的帧数**(在传递给选择过滤器之前)来计算视频的哪一部分分析到此为止
  • dranger.com/ffmpeg/tutorial05.html 你可能想看看这个。需要使用 c 接口进行“读取帧”,但它确实描述了数据包时间戳周围的编程代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2010-11-07
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多