我正在尝试从CImage创建一个IMFSample,以便我可以使用SinkWriter从一系列图像中编码视频。 Microsoft在这里有一个如何使用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提供的更正。仍然得到同样的错误。
答案 0 :(得分:0)
访问冲突是由错误的参数引起的。 API只会在源缓冲区或目标缓冲区之外的内存中命中。
您已经知道GetBPP
问题,这个问题不小但很严重(您应该分别更新代码段)。
另一个问题是最后一个MFCopyImage
参数。这是高度,而不是宽度。由于宽度通常较小,因此可能会出现缓冲区溢出。
另外,你假设步幅最小。实际上你可能有一个更大的。在这种情况下,您会看到对复制图像的偏斜效果,而不是访问冲突。