我正在用x264作为编码器编写视频会议应用程序。我从网络摄像头收到YUY2原始帧,然后根据x264的要求将它们转换为I420。问题是 - 我自己写了转换算法并且它不是那么快(占整个CPU时间的20%,由探查器提供的数据)。我怎样才能让它更快?这是我的代码:
int YUY2ToI420(BYTE *in, BYTE *out){
long pixels = _width * _height;
long macropixels = pixels / 2; // macropixel count
// new size will be w * h * 3/2 -> 12 bits per pixel 4:2:0
long mpx_per_row = info.biWidth / 2;
// for each macropixel
for (int i = 0, ci = 0; i < macropixels; i++){ // ci is chroma index
// get macropixel address, order is Y0 U0 Y1 V0
BYTE *mpAddress = in + i * 4;
// copy luma data
out[i * 2] = mpAddress[0];
out[i * 2 + 1] = mpAddress[2];
// copy chroma data - we skip odd rows because of 4:2:0 sampling
long row_number = i / mpx_per_row;
if (row_number % 2 == 0) {
out[pixels + ci] = mpAddress[1]; // shift by Y vector
out[pixels + pixels / 4 + ci] = mpAddress[3]; // shift by Y and U vector
ci++;
}
}
return pixels * 12 / 8; // I420
}
答案 0 :(得分:2)
我强烈建议您使用ffmpeg项目中的sws_scale。它具有针对大多数CPU和颜色格式的优化功能。你也可以使用opencv我相信,但我没有第一手经验。