Как получить кадр из видео с помощью 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. но когда я запустил программу ничего не произошло. Я не знаю, в чем проблема.


person Pouya Ahmadvand    schedule 15.12.2017    source источник


Ответы (1)


когда вы создаете подкласс 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);

}
person atefe    schedule 28.07.2019