我正在尝试从CImage创建一个IMFSample,这样我就可以使用SinkWriter从一系列图像中编码视频。微软在这里有一个如何使用DWORD数组(而不是CIMage)来实现这一点的示例:http://msdn.microsoft.com/en-us/library/windows/desktop/ff819477(v=vs.85).aspx。这样做涉及到使用MFCopyImage(),但我在调用此函数时遇到访问冲突,因此我可能传入了错误的参数。我是C++的新手。
根据他们的样本,这是我得到的:
CImage *img = LoadImage();
IMFSample *pSample = NULL;
IMFMediaBuffer *pBuffer = NULL;
const LONG cbWidth = img->GetBPP() / 8 * img->GetWidth();
const DWORD cbBuffer = cbWidth * img->GetHeight();
BYTE *pData = NULL;
HRESULT hr = MFCreateMemoryBuffer(cbBuffer, &pBuffer);
if (SUCCEEDED(hr))
{
hr = pBuffer->Lock(&pData, NULL, NULL);
}
if (SUCCEEDED(hr))
{
hr = MFCopyImage(
pData,
cbWidth,
(BYTE*)img->GetBits(),
cbWidth,
cbWidth,
img->GetHeight()
); // ACCESS VIOLATION HERE!
}
if (pBuffer)
{
pBuffer->Unlock();
}有人知道为什么这会导致访问违规吗?我是否传递了正确的值,特别是对于步幅?基于这个文档:http://msdn.microsoft.com/en-us/library/windows/desktop/bb970554(v=vs.85).aspx,我不清楚这个参数到底应该是什么。
12月11日更新:更改了由@cha和@roman-r提供的更正的代码示例。仍然得到相同的错误。
发布于 2012-12-11 20:39:31
访问冲突是由错误参数引起的。API只会访问超出源或目标缓冲区的内存。
您已经意识到了GetBPP问题,这个问题不是很小,但很严重(您应该分别更新您的代码片段)。
另一个问题是最后一个MFCopyImage参数。它是高度,而不是宽度。由于宽度通常较小,因此很可能会出现缓冲区溢出。
此外,您假定步幅最小。实际上,你可能会有一个更大的。在这种情况下,您将在复制的映像上看到倾斜效果,而不会出现访问冲突。
https://stackoverflow.com/questions/13812826
复制相似问题