我在屏幕共享项目中使用 libvpx 库,其中使用 vp9 编码器和 svc 技术对视频进行编码,然后进行解码。我首先使用第三方库捕获屏幕数据(RGB)并将其保存在一个大数组中,然后使用编码器。
现在我需要检测新提供给编码器的图像是否与之前的相同,编码器是否能够检测到它?如果是这样那怎么办?
我计划在这种情况下跳过编码或发送,因为在不利的网络条件下,这会使接收端先前渲染的良好静态图像最终无缘无故地变坏。我也有其他事情的计划。我知道我可以使用可变 kf 距离,但由于某种原因它不起作用,我想避免扫描整个 1920*1080 数组来手动检查前一个数组,而编码器已经在后台执行了此操作以进行处理。
仅仅为了知道两个图像是否具有相同的像素值而修改(并重新编译)libVPX源代码就太过分了。
“我需要检测新提供给编码器的图像是否与之前的相同,编码器是否能够检测到它?如果是,那么如何检测?”
compare_img
函数将return match;
,其中match是一个整数。
例如(伪代码):
#include "./tools_common.h" //this has the function: compare_img
int myResult = compare_img( &img_A, &img_B );
if ( myResult != 1 )
{
//# handle not matching
}
研究这些函数(它们的预期输入、输出整数的含义等),并确保您可以正确地为它们提供预期数据。您应该能够直接调用它们(从而跳过使用
For
循环创建自己的检查的需要)
可能的解决方案:
您在这里可以做的最好的事情是在比较之前将图像大小减半(或者降低 1/4 而不是 1/2)。
这样你就可以将扫描两张图像(@
960 x 540
)与扫描一张图像@1920 x 1080
的成本相同。
否则开始调用 LibVPX 内的一些函数,例如
compare_img
。
可以使用(伪代码)重新创建函数的结果:
int pos = 0;
int result = 0; //# will be -1 if not matching, and 1 if matching
int arrayLength = (1920 * 1080) * 3; // #or use * 4 if you got Alpha channel
int[] myRGB_img_A; //image 1 array
int[] myRGB_img_B; //image 2 array
while( pos < arrayLength)
{
//# if at end of array then assume all pixels are matching
if( pos == (arrayLength-1) ) { result = 1; break; }
if( myRGB_img_A[ pos ] != myRGB_img_B[ pos ] )
{
std::cout << "Images are not equal..." << std::endl;
result = -1; break;
}
pos++;
}
//# Now check result after While loop breaks
std::cout << "Result is: " << result << std::endl;
如果在 RGB 中使用 alpha 通道(因此它实际上是 RGBA 或 ARGB),那么您将获得一个 32 位整数,因此您可以使用
sizeof(uint_32_t)
一次性读取 4 个数组槽作为单个整数。