用setpixmap绘图 UI界面总是死掉
for (;;)
{
sockaddr_in from;
socklen_t fromlen = sizeof(from);
int rc = recvfrom(sock, buf, 65536, 0, (sockaddr*)&from, &fromlen);
if (rc > 0) {
//解码
int got;
AVPacket pkt;
pkt.data = buf;
pkt.size = rc;
frame=avcodec_alloc_frame();
int ret = avcodec_decode_video2(dec, frame, &got, &pkt);
if (ret > 0 && got)
{
struct SwsContext *context;
context=sws_getContext(dec->width, dec->height, dec->pix_fmt, dec->width, dec->height, PIX_FMT_RGB24,SWS_FAST_BILINEAR,0, 0, 0);
avpicture_alloc(&pFrameRGB,PIX_FMT_RGB24,dec->width,dec->height);
sws_scale(context,frame->data, frame->linesize,0, dec->height, pFrameRGB.data, pFrameRGB.linesize);
QImage image=QImage((const uchar*)pFrameRGB.data,176,144,QImage::Format_RGB32);
ui->label->setPixmap(QPixmap::fromImage(image));// 将图片显示到label上
fprintf(stderr, "jiema ing6\n");
avpicture_free(&pFrameRGB);
sws_freeContext(context);
av_free(frame);
}
}
}
用这个循环无限接收UDP上的H264流,解码转化都没问题,最后形成的rgb24流的确可以正常转化成png图片;
而且foemat_RGB32只能那么写 写成888就会发生异常,编译可以过,运行时会退出;
UI界面老是死在那,不能显示图片,但后台还在不断运行,没死掉,只是界面死掉了,求解中
[解决办法]
个人觉得,标准的做法是:把UI的操作放在主线程里,把数据接收处理放在另外的线程里,收到后通知UI去处理