Qt中使用vlc-qt处理音视频

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_38133212/article/details/96289358

Qt中使用vlc-qt处理音视频需要下载vlc-qt或者自己编译(linux配置vlc-qt)。播放视频或者连接网络摄像头感觉都挺流畅。
在这里插入图片描述

这两天用了一点点vlc-qt,简要记录一下:

处理视频时需要的几个类:
VlcInstance,VlcMedia(连接视频),VlcMediaPlayer(控制播放)
VlcVideoStream(视频抽帧)
VlcWidgetVideo(显示视频的控件)
帮助文档(写的比较简略):https://vlc-qt.tano.si/reference/
github源码:https://github.com/vlc-qt/vlc-qt

视频抽帧:
从VlcVideoStream派生一个类,比如ZNDKVideoStream,实现virtual void frameUpdated(),但是发现控件VlcWidgetVideo上就不显示了,可以理解为被VlcVideoStream截获。获得的图是YUV格式的,需要转换为RGB才可以方便自定义的图片处理。

这里找到一段YUV转cv::Mat的代码,得到Mat图片后我们进一步可以转为RGB。https://github.com/vlc-qt/vlc-qt/issues/230 。网上有些资料说用公式转换的效果不好,还有说可以用OpenGL转,以后有空可以尝试,这样就可以完全不依赖于opencv了。

void ZNDKVideoStream::frameUpdated()
{
//获得帧
    std::shared_ptr<const VlcYUVVideoFrame> pFrame = std::dynamic_pointer_cast<const VlcYUVVideoFrame>(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);

视频缓存:
https://github.com/vlc-qt/vlc-qt/issues/201
设置(也就是VlcMedia) media->setOption(":network-caching=100")
然鹅好像有点问题。

展开阅读全文

没有更多推荐了,返回首页