我正在尝试从 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 提供了更正。仍然得到同样的错误。