从FFMPEG获取每个提取帧的日志行

时间:2012-09-05 20:22:53

标签: ffmpeg

我正在使用FFMPEG.exe从各种视频中提取帧。由于这是一个程序化的解决方案并且获得总帧数和/或持续时间可能会很棘手(使用ffprobe),我想我可以使用控制台输出来检测单个帧的时间戳,但我每N帧都会得到一个输出行像这样:

frame=   20 fps=0.0 q=0.0 size=       0kB time=00:00:01.72 bitrate=   0.0kbits/s
frame=   40 fps= 38 q=0.0 size=       0kB time=00:00:04.02 bitrate=   0.0kbits/s
frame=   60 fps= 39 q=0.0 size=       0kB time=00:00:06.14 bitrate=   0.0kbits/s
frame=   70 fps= 38 q=0.0 Lsize=       0kB time=00:00:07.86 bitrate=   0.0kbits/s

是否有命令行选项强制每帧的输出?如果是这样,我可以提取time=部分。这是当前使用的命令行:

ffmpeg.exe -i video.avi -y -threads 0 -vsync 2 %10d.jpeg

理想情况下,将%10d.jpeg替换为写入帧时间戳的其他格式,但我认为这不存在。

2 个答案:

答案 0 :(得分:5)

获取时间戳的错误方法。要获取时间戳,请使用ffprobe -show_packets或ffprobe -show_frames并解析输出。 ffmpeg管道中的时间刚刚每隔几毫秒更新一次,而不是每一帧\

EDIT ffprobe将尽可能快地运行,因为它正在文件上运行。它打印的时间戳是播放文件时帧的实际显示和解码时间戳。

如果你想在ffmpeg运行时加上时间戳,请更改ffmpeg中的代码。有一个名为do_video_stats的函数,其中所有函数都在ffmpeg.c中打印出来。应该能够根据自己的喜好操纵它。

答案 1 :(得分:5)

您可以像这样使用showinfo过滤器:

ffmpeg -nostats -i  input.wmv -vsync passthrough -an -vf showinfo %10d.png

它产生如下输出:

 <..>
    Stream mapping:
      Stream #0:0 -> #0:0 (wmv2 -> png)
    Press [q] to stop, [?] for help    
    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]
    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]
    'n=...' lines are repeated for each of the extracted frames.

比解析流并使用pts_time部分。