0

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

4

1 回答 1

0

访问冲突是由错误的参数引起的。API 只是在源缓冲区或目标缓冲区之外命中内存。

您已经意识到GetBPP问题不小但很严重(您应该分别更新您的代码片段)。

另一个问题是最后一个MFCopyImage论点。是高度,不是宽度。由于宽度通常较小,因此您可能会出现缓冲区溢出。

此外,您假设步幅最小。实际上你可能有一个更大的。在这种情况下,您会在复制的图像上看到倾斜效果,而不是访问冲突。

于 2012-12-11T12:39:31.423 回答