Как получить кадр из видео с помощью 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;
}
и объявил мой класс как:
MyVideoStream *_stream ;
_stream = new MyVideoStream(Vlc::YUVFormat,ui->video) ;
_stream->init(_player) ;
где _player - ссылка на объект VlcMediaPlayer. но когда я запустил программу, ничего не произошло. Я не знаю в чем проблема.
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);
}