3

我正在使用 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为写入帧时间戳的其他格式,但我认为这不存在。

4

2 回答 2

6

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

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

如果您想要 ffmpeg 运行时的时间戳,请更改 ffmpeg 中的代码。有一个名为 do_video_stats 的函数,所有这些都打印在 ffmpeg.c 中。应该能够根据自己的喜好对其进行操作。

于 2012-09-06T06:55:48.073 回答
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部分。

于 2013-04-04T12:37:41.740 回答