1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Qt中使用vlc-qt處理音視頻

        共 1623字,需瀏覽 4分鐘

         ·

        2022-02-09 17:35

        Qt中使用vlc-qt處理音視頻需要下載vlc-qt或者自己編譯(linux配置vlc-qt)。播放視頻或者連接網(wǎng)絡(luò)攝像頭感覺都挺流暢,畫面質(zhì)量很不錯(cuò)。

        此外還看到vlc-qt可以實(shí)現(xiàn)一個(gè)窗口內(nèi)多個(gè)控件顯示視頻的功能,看著非常厲害(這個(gè)我沒有試過,不知道效果如何)。

        那幾天用opencv讀視頻和QtAV,vlc-qt我都嘗試過,感覺vlc-qt性能最佳,并且非常容易使用

        效果如下,這里我是獲取視頻,抽幀之后轉(zhuǎn)RGB圖,在上面畫了一個(gè)綠框。這個(gè)代碼我放到了github,可以了解一下。

        Whu-wxy/Qt-VLC-Demo

        這兩天用了一點(diǎn)點(diǎn)vlc-qt,簡要記錄一下:


        處理視頻時(shí)需要的幾個(gè)類:

        VlcInstance,VlcMedia(連接視頻),VlcMediaPlayer(控制播放)

        VlcVideoStream(視頻抽幀)

        VlcWidgetVideo(顯示視頻的控件)

        幫助文檔(寫的比較簡略):Library Reference - VLC-Qt

        github源碼:vlc-qt/vlc-qt


        視頻抽幀:

        從VlcVideoStream派生一個(gè)類,比如ZNDKVideoStream,實(shí)現(xiàn)virtual void frameUpdated(),但是發(fā)現(xiàn)控件VlcWidgetVideo上就不顯示了,我理解的是圖片被VlcVideoStream截獲,因此不能在VlcWidgetVideo顯示。獲得的圖是YUV格式的,需要轉(zhuǎn)換為RGB才可以方便自定義的圖片處理。


        這里找到一段YUV轉(zhuǎn)cv::Mat的代碼,親測可行,得到Mat圖片后我們進(jìn)一步可以轉(zhuǎn)為RGB。


        How to implement rgb frames? · Issue #230 · vlc-qt/vlc-qt

        看到網(wǎng)上有些資料說用公式轉(zhuǎn)換的效果不好,還有文章說可以用OpenGL轉(zhuǎn),以后有空可以嘗試,這樣就可以完全不依賴于opencv了。

        void ZNDKVideoStream::frameUpdated()
        {
        //獲得幀
            std::shared_ptr pFrame = std::dynamic_pointer_cast(renderFrame());
        
            if (!pFrame) {
                return; //LCOV_EXCL_LINE
            }
        
        //YUV圖轉(zhuǎn)Mat,再轉(zhuǎn)QImage
            int rows = pFrame->height + pFrame->height / 2;
            int cols = pFrame->width;
            int matType = CV_8UC1 ;
        
            cv::Mat myuv(rows,cols,matType,(void*)pFrame->frameBuffer.data());
            cv::Mat mrgb(pFrame->height, pFrame->width, CV_8UC3);
            cv::cvtColor(myuv, mrgb, CV_YUV2RGB_I420);
            QImage img((const unsigned char *)(mrgb.data), mrgb.cols, mrgb.rows, mrgb.cols * 3, QImage::Format_RGB888);
            img.rgbSwapped();
        }

        在這里圖片可以用信號(hào)發(fā)出去:

        emit sendImage(img);


        視頻緩存:

        core vout display error: Failed to set on top libvlc: Failed to set on top · Issue #201 · vlc-qt/vlc-qt

        設(shè)置(也就是VlcMedia) media->setOption(":network-caching=100")

        然鵝好像有點(diǎn)問題。

        瀏覽 20
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美高大丰满少妇xxxx | 超碰日逼 | 91国产精品一区 | 国产少妇啪啪 | 美女日比视频 | 欧美一区二区自拍 | 亚洲午夜精品久久 | 国产一区免费视频 | 亚洲精品三级片 | 免费高清无码在线观看 |