使用 ColorMatrix.setRGB2YUV() 将 RGB8888 转换为 YUV420

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

我正在尝试找到一种使用 Android SDK 将 RGB 转换为 YUV 的更快方法,因为像素方法的标准像素在 Java 中非常慢。 ColorMatrices 似乎非常有效,我看到有一个 setRGB2YUV() 方法,但我找不到任何示例,文档只是说“设置矩阵将 RGB 转换为 YUV”,这像往常一样完全没用。

这是我的初始化代码的一部分,由于多线程,数组稍微复杂一些:

cacheBitmaps = new Bitmap[NumberOfThreads];
cacheCanvas = new Canvas[NumberOfThreads];
mRGB2YUV = new ColorMatrix();   
cmfRGB2YUV = new ColorMatrixColorFilter(mRGB2YUV);
pRGB2YUV = new Paint();
pRGB2YUV.setColorFilter(cmfRGB2YUV);
for (int m=0; m< NumberOfThreads; m++) {
   cacheBitmaps[m] = Bitmap.createBitmap(widthX,heightY, Config.ARGB_8888);
   cacheCanvas[m] = new Canvas(cacheBitmaps[m]);
}

后来我用它用指定的油漆将 RGB 绘制到画布上:

cacheCanvas[n].drawBitmap(fb.frames[n].getAndroidBitmap(),0,0, pRGB2YUV);

我还尝试过使用标准矩阵,该矩阵不应对 RGB 值进行任何更改,如下所示:

float[] matrix = { 
0, 1, 0, 0, 0, //red
0, 0, 1, 0, 0, //green
0, 0, 0, 1, 0, //blue
0, 0, 0, 0, 1 //alpha
};
mRGB2YUV.set(matrix);

无论我做什么,我的输出视频要么会出现黑色、绿色或扭曲的帧(使用 JavaCV 和 FFMPEG,并在将最终位图复制到 IplImage 后指定 AV_PIX_FMT_NV21 作为颜色格式)。

任何人都知道如何使用它,如果它甚至可能或按照它所说的那样做?

java android javacv yuv colormatrix
1个回答
0
投票

虽然

ColorMatrixColorFilter
可用于将像素颜色从RGB转换为YUV,但这本身并不是一个非常有用的功能。

首先,您用来绘图的

Canvas
Bitmap
支持。并且位图不支持 YUV 颜色。查看 Bitmap.Config 枚举,我们可以看到 YUV 不是可能的位图配置之一。

其次,当

Canvas
绘制
Bitmap
时,它似乎会生成一个打包图像。但这不是其他组件可以使用的典型图像格式(例如
YV12
NV21
)。

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