我有一个24小时的视频,并希望为任意帧组织一些元信息的存储(尤其是对象的边界框)。这意味着我必须通过其ID可靠地随机访问帧,实际上以(id_start, id_end)
的方式甚至可以访问帧范围。
再一次,至关重要的是,当我填充元存储时以及以后稍后获取元数据时(通常在另一个环境中-ffmpeg版本,编解码器等),都必须获得相同的帧。否则,我会将边界框放在错误的框架上。
所以我找到了办法
ffmpeg -i in.mp4 -vf select='between(n,x,y)' -vsync 0 frames%d.png
问题是它工作太慢。而且我也不知道复制的可靠性。
ffmpeg -ss pkt_pts_time -i in.mp4 -vframes n output_%03d.png
pkt_pts_time
来自ffprobe -show_frames in.mp4 -select_streams v
的地方
问题是pkt_pts_time根本不清楚。 pkt_pts_time是否引用-ss参数?
实际上问题是-帧(例如h.264)的内部元信息是否包含帧ID?我找不到办法。
现在我想为每个T帧(锚)存储png md5sum。稍后,我将能够使用它们检查一致性。
有人可以提出更好的建议吗?
答案 0 :(得分:2)
帧的内部元信息(例如h.264)是否包含帧ID?我找不到办法。
不。在MP4中,您可以使用时间戳进行搜索。
ffmpeg -ss pkt_pts_time -i in.mp4 -vsync 0 -vframes n output_%03d.png
其中,第一输出帧是具有等于或在-ss
值之后的pts_time的第一输入帧,例如如果存在带有pts_time 4.36的框架,则-ss 4.36
将以该框架开始。但是,如果在4.36处没有帧,而在4.38处有帧,那么带有-ss 4.36
的命令将首先输出4.38
帧。