从 Y'Cb'Cr 编码视频中提取原始 Y' 平面数据的最快方法?

问题描述 投票:0回答:1

我有一个用例,我从视频中提取

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'值抓取到数组中并跳过所有内容不必要的转换和额外步骤?

(因为

luma 组件本质上相当于我生成哈希所需的灰度数据) 我在

-vf 'extractplanes=y'

中遇到了

ffmpeg
过滤器,
似乎
可能会这样做,但根据 来源

“...'extractplanes'提取的不是(例如)Y平面的原始数据。每个提取的数据都转换为灰度。也就是说,转换后的视频数据具有与原始数据不同的YUV(或RGB)输入。”

这使得它看起来像是在接触
chroma

组件并进行一些转换,在测试中应用此过滤器也不会影响 I-Frame 提取的处理时间。

我的脚本目前是用

Python

编写的,但我正在将其迁移到

C++
,所以我更喜欢与后者相关的任何解决方案。

ffmpeg

似乎是此任务的理想候选者,但我确实正在寻找能够最快提取数据的解决方案,最好直接保存到

RAM
,因为我将处理大量视频文件并丢弃生成哈希后,
I-Frame
luma
像素数据。 我还想将每个

I-Frame

与其在视频中相应的帧编号相关联。

    

python c++ ffmpeg video-encoding yuv
1个回答
0
投票

“也就是说,转换后的视频数据具有与输入不同的 YUV(或 RGB)。”它与 YCbCr 到 RGB 转换源不同。但即使对于 30 位文件或 48/64 位文件,数据也是实际的底层有限或全范围数据。

“由于示例输入是 yuv420p 格式,即色度分量被稀疏化。”嗯,是。对于 4:2:0 Y 平面为全尺寸,而 Cb 和 Cr 平面仅为 1/4 尺寸。

参见

https://ffmpeg.org/ffmpeg-filters.html#extractplanes

另外,请参阅此错误(已修复):

https://trac.ffmpeg.org/ticket/9575

© www.soinside.com 2019 - 2024. All rights reserved.