1

我从 ReadSample 调用中收到 E_POINTER 错误,据我所知,没有一个指针是无效的。请参见下面的片段(注意,它是一个 C++/CLI 应用程序):

IMFSample* sample = NULL;
pin_ptr<IMFSample*> pinnedSample = &sample;

LONGLONG timeStamp;

HRESULT hr = mSourceReader->ReadSample(
    (DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM,
    0,
    NULL,
    NULL,
    &timeStamp,
    pinnedSample
    );

我怀疑问题在于 mSourceReader(一个 IMFSourceReader 实例,从 IMFMediaSource 创建)的构造。但是,唉,我不知道如何回溯并找到源,因为创建 mSourceReader 的命令链中的所有 COM 调用都返回了 S_OK。

非常感谢任何提示。

4

1 回答 1

1

获取局部变量的地址时不需要pin_ptr,因为垃圾收集器无论如何都不会移动局部变量。

我猜你传递 NULL 的其他三个参数之一是非可选的,但我需要看看你调用的是什么函数才能确定。

您是IMFSourceReader在同步模式还是异步模式下创建的?文档说:

此方法可以同步或异步完成。如果在创建源阅读器时提供回调指针,则该方法是异步的。否则,该方法是同步的。

我认为这是你的问题:

在同步模式下:

  • pdwStreamFlags 和 ppSample 参数不能为 NULL。否则,该方法返回 E_POINTER。

你已经为 NULL 传递了pdwStreamFlags,这是不允许的。

文档链接:http: //msdn.microsoft.com/en-us/library/dd374665.aspx

于 2011-05-09T04:12:51.077 回答