从 vp9 编码器(libvpx 库)检测图像变化

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

我在屏幕共享项目中使用 libvpx 库,其中使用 vp9 编码器和 svc 技术对视频进行编码,然后进行解码。我首先使用第三方库捕获屏幕数据(RGB)并将其保存在一个大数组中,然后使用编码器。

现在我需要检测新提供给编码器的图像是否与之前的相同,编码器是否能够检测到它?如果是这样那怎么办?

我计划在这种情况下跳过编码或发送,因为在不利的网络条件下,这会使接收端先前渲染的良好静态图像最终无缘无故地变坏。我也有其他事情的计划。我知道我可以使用可变 kf 距离,但由于某种原因它不起作用,我想避免扫描整个 1920*1080 数组来手动检查前一个数组,而编码器已经在后台执行了此操作以进行处理。

image video encoding fullscreen video-processing
1个回答
0
投票

仅仅为了知道两个图像是否具有相同的像素值而修改(并重新编译)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
的成本相同。

  • 还检查是否有机会使用 GPU 来比较大像素。
  • 检查是否存在“快速”库,以便为用户 CPU 尽快比较两个数组。

否则开始调用 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 个数组槽作为单个整数。

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