0

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 によって提供された修正を含むコード サンプルを変更しました。それでも同じエラーが発生します。

4

1 に答える 1

0

アクセス違反は、間違った引数によって引き起こされます。API は、ソース バッファーまたは宛先バッファーのいずれかを超えてメモリにヒットするだけです。

小さくはないが深刻な問題を既に認識してGetBPPいます (コード スニペットをそれぞれ更新する必要があります)。

もう 1 つの問題は、最後のMFCopyImage引数です。幅ではなく高さです。通常、幅は小さいため、バッファ オーバーランが発生する可能性があります。

さらに、最小限のストライドを想定しています。事実上、より大きなものを持っているかもしれません。この場合、コピーされたイメージにスキュー効果が見られますが、アクセス違反は見られません。

于 2012-12-11T12:39:31.423 に答える