Qt中使用vlc-qt处理音视频
共 1623字,需浏览 4分钟
·
2022-02-09 17:35
Qt中使用vlc-qt处理音视频需要下载vlc-qt或者自己编译(linux配置vlc-qt)。播放视频或者连接网络摄像头感觉都挺流畅,画面质量很不错。
此外还看到vlc-qt可以实现一个窗口内多个控件显示视频的功能,看着非常厉害(这个我没有试过,不知道效果如何)。
那几天用opencv读视频和QtAV,vlc-qt我都尝试过,感觉vlc-qt性能最佳,并且非常容易使用
效果如下,这里我是获取视频,抽帧之后转RGB图,在上面画了一个绿框。这个代码我放到了github,可以了解一下。
Whu-wxy/Qt-VLC-Demo这两天用了一点点vlc-qt,简要记录一下:
处理视频时需要的几个类:
VlcInstance,VlcMedia(连接视频),VlcMediaPlayer(控制播放)
VlcVideoStream(视频抽帧)
VlcWidgetVideo(显示视频的控件)
帮助文档(写的比较简略):Library Reference - VLC-Qt
github源码:vlc-qt/vlc-qt
视频抽帧:
从VlcVideoStream派生一个类,比如ZNDKVideoStream,实现virtual void frameUpdated(),但是发现控件VlcWidgetVideo上就不显示了,我理解的是图片被VlcVideoStream截获,因此不能在VlcWidgetVideo显示。获得的图是YUV格式的,需要转换为RGB才可以方便自定义的图片处理。
这里找到一段YUV转cv::Mat的代码,亲测可行,得到Mat图片后我们进一步可以转为RGB。
看到网上有些资料说用公式转换的效果不好,还有文章说可以用OpenGL转,以后有空可以尝试,这样就可以完全不依赖于opencv了。
void ZNDKVideoStream::frameUpdated()
{
//获得帧
std::shared_ptr pFrame = std::dynamic_pointer_cast(renderFrame());
if (!pFrame) {
return; //LCOV_EXCL_LINE
}
//YUV图转Mat,再转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();
}
在这里图片可以用信号发出去:
emit sendImage(img);
视频缓存:
core vout display error: Failed to set on top libvlc: Failed to set on top · Issue #201 · vlc-qt/vlc-qt设置(也就是VlcMedia) media->setOption(":network-caching=100")
然鹅好像有点问题。