Просматривайте необработанное видео более эффективно - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть сырой видеофайл, и я создаю в qt приложение, которое читает кадр за кадром из этого файла. При больших сырых файлах, когда я нажимаю кнопку, которая переходит к следующему кадру, возникает большая задержка почти на одну секунду,Вот мой код, который возвращает кадр из необработанного файла:

 void RawVideoReader::getFrame(int offset)
{
    std::cout<<"getFrame"<<std::endl;
   file.seek((unsigned long long int)(((unsigned long long int)width * (unsigned long long int)height) * (unsigned long long int)offset));
   QByteArray array = file.read(width * height);

    const std::size_t count = array.size();

    hex = std::unique_ptr<unsigned char>(new unsigned char[count]);
    std::memcpy(hex.get(), array.constData(), count);
}

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете читать непосредственно в нужный буфер - вопрос в том, почему вы хотите управлять этим буфером памяти, используя unique_ptr?QByteArray уже делает эту работу.Кроме того, вы, вероятно, хотите сохранить один и тот же буфер и не перераспределять его снова и снова.

class RawVideoReader : ... {
  QByteArray frame;
  uint8_t *frameData() const { return frame.size() ? static_cast<uint8_t*>(frame.constData()) : nullptr; }
  size_t frameSize() const { return static_cast<size_t>(frame.size()); }
  ...
};

bool RawVideoReader::getFrame(int frameNo) {
  qDebug() << __FUNCTION__;
  frame.resize(width * height * 1);
  file.seek(qint64(frame.size()) * qint64(frameNo));
  auto const hadRead = file.read(frame.data(), frame.size());
  return hadRead == frame.size();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...