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

wpf*_*abe 2 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
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg.exe -i video.avi -y -threads 0 -vsync 2 %10d.jpeg
Run Code Online (Sandbox Code Playgroud)

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

av5*_*501 6

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

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

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


Isa*_*pov 5

您可以使用showinfo过滤器,如下所示:

ffmpeg -nostats -i  input.wmv -vsync passthrough -an -vf showinfo %10d.png
Run Code Online (Sandbox Code Playgroud)

它产生的输出如下:

 <..>
    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.
Run Code Online (Sandbox Code Playgroud)

比解析流并使用pts_time部分。