c++ - 如何使用 vlc-qt 从视频中获取帧

标签 c++ qt vlc vlc-qt

我正在使用 vlc-qt 解码 h264 视频流,但我需要视频(流)中的每一帧进行进一步处理。我找到了描述解决方案的链接:

https://discuss.tano.si/t/how-to-get-frame-from-video/253

我创建了一个继承自 VlcVideoStream 类的类,并重新实现了 frameUpdated() 函数,如下所示:

void MyVideoStream::frameUpdated()  {
qDebug() << "frame" ;
int rows, cols, matType;
// convert to shared pointer to const frame to avoid crash
std::shared_ptr<const VlcYUVVideoFrame> frame = std::dynamic_pointer_cast<const VlcYUVVideoFrame>(renderFrame());

if (!frame) {
    return; // LCOV_EXCL_LINE
}

rows = frame->height + frame->height/2;
cols = frame->width;

}

并将我的类(class)声明为:

MyVideoStream *_stream ;
_stream = new MyVideoStream(Vlc::YUVFormat,ui->video) ;
_stream->init(_player) ;

其中 _player 是 VlcMediaPlayer 对象引用。但是当我运行程序时什么也没发生。我不知道是什么问题。

最佳答案

当您继承 VlcVideoStream 并重新实现 frameUpdated() 时,您可以在每次更新时访问 YUV 帧。 如果您熟悉 Opencv ,只需将这些代码添加到 frameUpdated() 函数中,然后您就可以看到灰色图像:

void MyVideoStream::frameUpdated() 
{
      std::shared_ptr<const VlcYUVVideoFrame> frame= std::dynamic_pointer_cast<const VlcYUVVideoFrame>(renderFrame());

 if (!frame) {
  return; // LCOV_EXCL_LINE
  }

int width = frame->width;
int height = frame->height;

cv::Mat result = cv::Mat(height, width, CV_8UC1,    (void*)frame->frameBuffer.data());
imshow("result", result);
waitKey(2);

}

关于c++ - 如何使用 vlc-qt 从视频中获取帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47830599/

相关文章:

c++ - C++ 中的运算符重载为 int + obj

qt - 改变 QImage/QPixmap 的色调

c++ - Qt QSharedMemory 如何更新共享内存位置

c++ - QTextEdit 和QTextDocument 缓冲问题?

c++ - libvlc 中的视频效果

c++ - 为什么我可以部分特化但不能完全特化 C++ 中的成员模板?

c++ - 被 YAML::NodeType::Undefined 与 yaml-cpp 混淆

c++ - QT:对 qApp 属性更改做一些事情

Linux(Ubuntu)平均负载高于总真实利用率?

c# - wpf 在 activeX 之上