尝试将yuv转换成RGG后播放,但似乎不流畅
一帧一帧地转换,用timer控制,但播起来很慢
请问有什么优化的方法吗?
renderarea::renderarea(QWidget *parent):QMainWindow(parent)
{
length =0;
show_init();
v_height = VIDEOHEIGHT;
v_width = VIDEOWIDTH;
RGBBufferSize = 4*v_height*v_width;
RGBBuffer = (unsigned char*)malloc(RGBBufferSize*sizeof(unsigned char));
img = new QImage ((uchar*)RGBBuffer,v_width,v_height,QImage::Format_RGB32);
p = new QPainter();
movieTimer = new QTimer( this ); // create internal timer
movieTimer->start(40);
connect(movieTimer, SIGNAL(timeout()), this, SLOT(timeover()))
setGeometry (0,0,240,320);
}
void renderarea::timeover()
{
static int display_num = 0;
static int displaylen = 0;
displaylen = 320 * 240 * 3 / 2 * display_num;
if(displaylen >= length)
{ movieTimer->stop(); //当没有新消息时,重新启动定时器
return;
}
else
{
unsigned char * yuv_buffer;
//取出fdm中的一帧
yuv_buffer = (unsigned char * )fdm + displaylen;
display_num++;
//调用转换函数
yuv420_toRGB(v_width, v_height, yuv_buffer, RGBBuffer);
//触发paintEvent
update();
}
}
void renderarea::paintEvent(QPaintEvent *)
{
p->begin(this);
p->drawImage(0,0,*img);
p->end();
}
转换函数
void yuv420_toRGB(int width, int height, unsigned char *buf,unsigned char* RGBBuffer)
{
unsigned char *YBuffer = buf;
unsigned char *UBuffer = buf + height * width;
unsigned char *VBuffer = buf + (int)(height*width*1.25);
int Y, U, V, R, G, B;
int writePos = 0;
int i = 0, j = 0;
int k = 0;
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
Y = YBuffer[j]-16;
k = (int)(j/2);
U = UBuffer[k]-128;
V = VBuffer[k]-128;
R = ((298*Y + 409*V + 128)>>8);
G = ((298*Y - 100*U - 208*V + 128)>>8);
B = ((298*Y + 516*U + 128)>>8);
RGBBuffer[writePos++] = (B<0) ? 0 : ((B>255) ? 255 : B);
RGBBuffer[writePos++] = (G<0) ? 0 : ((G>255) ? 255 : G);
RGBBuffer[writePos++] = (R<0) ? 0 : ((R>255) ? 255 : R);
RGBBuffer[writePos++] = 0xff;
}
YBuffer += width;
if(i%2==1)
{
UBuffer += width/2;
VBuffer += width/2;
}
}
}