SinkWriter を使用して一連の画像からビデオをエンコードできるように、CImage から IMFSample を作成しようとしています。Microsoft は、(CIMage の代わりに) DWORD 配列を使用してこれを行う方法のサンプルを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();
}
なぜこれが ACCESS VIOLATION になるのか知っている人はいますか? 特に歩幅について、正しい値を渡していますか? このドキュメントに基づいて: http://msdn.microsoft.com/en-us/library/windows/desktop/bb970554(v=vs.85).aspx、このパラメーターが正確に何を想定しているかは明確ではありませんでした.
12 月 11 日更新: @cha および @roman-r によって提供された修正を含むコード サンプルを変更しました。それでも同じエラーが発生します。