我有一个用例,我从视频中提取
I-Frames
并将其转换为感知哈希以供以后分析。
⠀
我目前正在使用
ffmpeg
来执行此操作,命令类似于:
ffmpeg -skip_frame nokey -i 'in%~1.mkv' -vsync vfr -frame_pts true -vf 'keyframes/_Y/out%~1/%%06d.bmp'
然后从结果图像中读取数据。
⠀
这有点浪费,因为据我了解,
ffmpeg
会隐式进行YUV -> RGB
颜色空间转换,而且我也不必要地将中间数据保存到磁盘。
大多数现代视频编解码器利用 色度二次采样,并在 Y'CbCr 颜色空间中编码帧,其中 Y' 是 luma 分量,Cb Cr 是 蓝差、红差 色度 分量。
类似于
h.264/h.265 视频编解码器中使用的YUV420p
的编码如下:
其中每个 Y' 值都是
8 bits
长并且对应于一个像素。
⠀
无论如何,当我使用灰度数据来生成感知散列时,我想知道是否有一种方法可以简单地将任何给定I-Frame
中的原始Y'值抓取到数组中并跳过所有内容不必要的转换和额外步骤?
-vf 'extractplanes=y'
中遇到了
ffmpeg
过滤器,似乎可能会这样做,但根据 来源: “...'extractplanes'提取的不是(例如)Y平面的原始数据。每个提取的数据都转换为灰度。也就是说,转换后的视频数据具有与原始数据不同的YUV(或RGB)输入。”
chroma这使得它看起来像是在接触
组件并进行一些转换,在测试中应用此过滤器也不会影响 I-Frame
提取的处理时间。
我的脚本目前是用
Python
编写的,但我正在将其迁移到
C++
,所以我更喜欢与后者相关的任何解决方案。ffmpeg
似乎是此任务的理想候选者,但我确实正在寻找能够最快提取数据的解决方案,最好直接保存到
RAM
,因为我将处理大量视频文件并丢弃生成哈希后,I-Frame
luma像素数据。 我还想将每个
I-Frame
与其在视频中相应的帧编号相关联。