<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1623字,需瀏覽 4分鐘

           ·

          2022-02-09 17:35

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

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

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

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

          Whu-wxy/Qt-VLC-Demo

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


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

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

          VlcVideoStream(視頻抽幀)

          VlcWidgetVideo(顯示視頻的控件)

          幫助文檔(寫(xiě)的比較簡(jiǎn)略):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的代碼,親測(cè)可行,得到Mat圖片后我們進(jìn)一步可以轉(zhuǎn)為RGB。


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

          看到網(wǎng)上有些資料說(shuō)用公式轉(zhuǎn)換的效果不好,還有文章說(shuō)可以用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)問(wèn)題。

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  三级片无码在线播放 | 8050网午夜 | 欧美操B电影| 豆花网站高清无码18 | 激情五月,五月婷婷 |