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