1. 程式人生 > >海康攝像機使用問題

海康攝像機使用問題

因為專案中需要用到海康的私有流解碼顯示,為了效率高,所以直接採用他們提供的解碼庫
碰到的問題

1.顯示:海康顯示是可以直接傳入控制代碼,QT中的控制代碼winId
2.在顯示中點選label的時候,會響應主介面的paintEvent,之後QLabel顯示區域會閃爍,特別是在新增拖動之後
解決方法

1.顯示的時候直接強行轉成HWND,傳入:(HWND)ui.label->winId;

2.為了不影響沒有預覽時候對label的操作,可以在預覽視訊之後將ui.label->setUpdatesEnabled(false),之後對label進行操作都不會引起窗體閃爍,關閉視訊之後ui.label->setUpdatesEnabled(true)

使用rtsp流進行顯示

rtsp://admin:xxxx密碼@10.17.162.101:554/h264/ch1/main/av_stream



bool YV12ToBGR24_FFmpeg(unsigned char* pYUV,unsigned char* pBGR24,int width,int height)
{
    if (width < 1 || height < 1 || pYUV == NULL || pBGR24 == NULL)
        return false;
    //int srcNumBytes,dstNumBytes;
    //uint8_t *pSrc,*pDst;
    AVPicture pFrameYUV,pFrameBGR;

    //pFrameYUV = avpicture_alloc();
    //srcNumBytes = avpicture_get_size(PIX_FMT_YUV420P,width,height);
    //pSrc = (uint8_t *)malloc(sizeof(uint8_t) * srcNumBytes);
    avpicture_fill(&pFrameYUV,pYUV,PIX_FMT_YUV420P,width,height);

    //U,V互換
    uint8_t * ptmp=pFrameYUV.data[1];
    pFrameYUV.data[1]=pFrameYUV.data[2];
    pFrameYUV.data [2]=ptmp;

    //pFrameBGR = avcodec_alloc_frame();
    //dstNumBytes = avpicture_get_size(PIX_FMT_BGR24,width,height);
    //pDst = (uint8_t *)malloc(sizeof(uint8_t) * dstNumBytes);
    avpicture_fill(&pFrameBGR,pBGR24,PIX_FMT_BGR24,width,height);

    struct SwsContext* imgCtx = NULL;
    imgCtx = sws_getContext(width,height,PIX_FMT_YUV420P,width,height,PIX_FMT_BGR24,SWS_BILINEAR,0,0,0);

    if (imgCtx != NULL){
        sws_scale(imgCtx,pFrameYUV.data,pFrameYUV.linesize,0,height,pFrameBGR.data,pFrameBGR.linesize);
        if(imgCtx){
            sws_freeContext(imgCtx);
            imgCtx = NULL;
        }
        return true;
    }
    else{
        sws_freeContext(imgCtx);
        imgCtx = NULL;
        return false;
    }
}