我正在使用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为写入帧时间戳的其他格式,但我认为这不存在.
获取时间戳的错误方法.要获取时间戳,请使用ffprobe -show_packets或ffprobe -show_frames并解析输出.在ffmpeg管道中的时间刚刚每隔几毫秒就更新一次不是每一帧
编辑ffprobe将尽可能快地运行,因为它在文件上运行.它打印的时间戳是播放文件时帧的实际显示和解码时间戳.
如果你想在ffmpeg运行时加上时间戳,请更改ffmpeg中的代码.有一个名为do_video_stats的函数,其中所有函数都在ffmpeg.c中打印出来.应该能够根据自己的喜好操纵它.
您可以使用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部分。
| 归档时间: |
|
| 查看次数: |
4226 次 |
| 最近记录: |