我很多人会建议为什么不使用Bink或使用DirectShow来播放视频甚至ffmpeg。然而,无论如何,电影是什么 - 只是图像与声音放在一起。
我已经创建了一个程序,我将一堆图像放入自定义视频文件中。关于这个很酷的事情 - 我可以轻松地将它放在四边形上。我遇到的问题是我只能从自定义视频文件中提取一个图像。当我有一个以上;我有问题,我完全理解。
我有一个所有图像大小的索引查找表,然后是原始图像。我所遵循的计算是:
offset = NumberOfImages + 1 * sizeof(long).
所以,使用一个图像 - 如果你将执行偏移找到第一个图像将非常容易。在for循环期间,它始终以0开始,并且达到1的图像数。因此,它会像这样翻译:
offset = 1 + 1 * 4 = 8.
所以,现在我知道一个图像的偏移很好。但是,视频中包含大量图像。所以,我一直在想自己......如果有办法达到某一点,那么将读取数据填入矢量。
currentPosition = 0; //-- Set the current position to zero before looping through images in file.
for (UINT i = 0; i < elements; i++) {
long tblSz = (elements + 1) * sizeof(long); // elements + 1 * 4
long off = tblSz + currentPosition; // -- Now let's calculate the offset position inside the file knowing the table size.
// in.seekg(off, std::ios_base::end); //-- Not used.
long videoSz = sicVideoIndexTable[i]; //-- Let's retreive the image size from the index table that's stored inside the file before we process each image.
// in.seekg(0, std::ios_base::beg); //-- Not used.
dataBuf.resize(videoSz); //-- Let's resize the data Buffer vector to fit the image size.
in.seekg(off, std::ios_base::beg); //-- Let's go to the calculated offset position to retrieve the image data.
std::streamsize currpos = in.gcount(); //-- Prototype not used.
in.read(&dataBuf[0], videoSz); //-- Let's read in the data according to the image size.
sVideoDesc.dataPtr = (void*)&dataBuf[0]; //-- Pass what we've read into the temporary structor before pushing it inside a vector to store the collection of images.
sVideoDesc.fileSize = videoSz;
sicVideoArray.push_back(sVideoDesc);
dataBuf.empty(); //-- Now can empty the data vector so it can be reused.
currentPosition = videoSz; //-- Set the current position to the video size so it can recalculate the offset for the next image.
}
我认为这个问题存在于seekg和in.read中,但这只是我的直觉告诉我的。如您所见,当前位置总是在变化。
Buttom line问题是如果我可以加载一个图像那么为什么我不能从自定义视频文件加载多个图像?我不确定我是否正在使用seekg,或者我是否只是获取每个字符,直到它们将内容转储到数据缓冲区向量中。我认为阅读数据块将是答案 - 但我变得非常不确定。
答案 0 :(得分:0)
我想我终于明白了你的代码所做的事情。你真的应该使用更多描述性的变量名。或至少添加每个变量含义的解释。总之...
我相信你的问题就在这一行:
currentPosition = videoSz;
什么时候应该
currentPosition += videoSz;
您基本上不会在文件中前进。
此外,如果您只是按顺序读取图像,则可能需要更改文件格式,以便在开头时不是使用图像大小表,而是直接存储每个图像大小,然后是图像数据。这样您就不需要进行任何偏移计算或寻求。