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。
看到網(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)題。
