3

我正在使用 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;

}

并将我的班级声明为:

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

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

4

1 回答 1

0

当您将 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);

}
于 2019-07-28T17:55:39.250 回答