更有效地遍历原始视频
Traverse an raw video more efficiently
我有一个原始的视频文件,我在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();
}
相关文章:
- 将浮动的heightmap数组导出为16位原始值
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 如何在c++中录制具有精确帧时间戳的视频
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何使用OpenCV-C++编写*.mp4视频?
- 开放 CV 中的动态内存分配,用于视频处理
- 如何将原始字节附加到 std::vector?
- 从堆栈分配的原始指针构造智能指针
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 将unique_ptr分配给原始指针
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- FFmpeg原始视频大小参数
- 将原始视频图像转换为VPX编码器的I420
- 更有效地遍历原始视频
- Windows媒体基础使用原始图像对视频进行编码
- 在C++中通过Windows视频将4:2:0YUV原始数据写入AVI文件
- 正在C++中读取原始RGB视频文件
- 在视频解码器抽象层嗅探 H.264 原始流