更有效地遍历原始视频

Traverse an raw video more efficiently

本文关键字:视频 原始 遍历 有效地      更新时间:2023-10-16

我有一个原始的视频文件,我在qt中制作,一个应用程序,当我按下一个大型raw文件时,按帧读取框架。几乎一秒钟都有很大的延迟。 这是我的代码,该代码从原始文件中返回帧:

 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);
}

您可以直接阅读到所需的缓冲区中 - 问题是:为什么要使用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();
}