我正在尝试找到一种使用 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 作为颜色格式)。
任何人都知道如何使用它,如果它甚至可能或按照它所说的那样做?
虽然
ColorMatrixColorFilter
可用于将像素颜色从RGB转换为YUV,但这本身并不是一个非常有用的功能。
首先,您用来绘图的
Canvas
有 Bitmap
支持。并且位图不支持 YUV 颜色。查看 Bitmap.Config 枚举,我们可以看到 YUV 不是可能的位图配置之一。
其次,当
Canvas
绘制 Bitmap
时,它似乎会生成一个打包图像。但这不是其他组件可以使用的典型图像格式(例如 YV12
或 NV21
)。