【问题标题】:The operation could not be performed because the filter is in the wrong state GetCurrentBuffer无法执行操作,因为过滤器处于错误状态 GetCurrentBuffer
【发布时间】:2014-03-06 16:06:35
【问题描述】:

由于过滤器状态错误,无法执行操作

尝试运行 hr = m_pGrabber->GetCurrentBuffer(&cbBuffer, NULL); 时出现此错误。

奇怪的是 - 它最初在我停止图表时工作,现在它在运行或停止图表时失败。 那么 - 它应该处于什么状态??

我复制的 MSDN 中的示例抓取器代码并没有说明图形是否应该停止或运行以获取缓冲区大小 - 但它呈现图形的方式正在运行。我假设图形应该运行以填充缓冲区,但我没有通过调整缓冲区的大小。

图表没问题,所有过滤器都已连接并根据需要呈现,在可能的应用程序和 GraphEdit 中。

我正在尝试将捕获的静止帧保存到位图文件中,因此我需要缓冲区中的捕获数据。

【问题讨论】:

    标签: directshow


    【解决方案1】:

    缓冲和GetCurrentBuffer 向您展示最后一个已知媒体样本的副本。因此,您可能会遇到“没有可用的媒体样本可供复制”和“由于转换到停止状态而释放最后一个已知媒体样本”的条件。在这两种情况下,相关请求都可能失败。从SampleCB而不是缓冲模式复制数据,这将是百分百可靠的。

    另请参阅:ISampleGrabber::GetCurrentBuffer() returning VFW_E_WRONG_STATE

    【讨论】:

    • 谢谢,似乎每次我开始在 DirectShow 中工作时,都会有另一种更好的方法来做到这一点。非常令人沮丧。
    • 不要责怪 DirectShow。也许您还没有与候补人员取得联系。
    • 谢谢,似乎每次我在 DirectShow 中得到一些东西时,都会有另一种更好的方法来做到这一点。相当令人沮丧。我确实检查了暂停,理论上它应该确保图形状态正常。到目前为止它正在工作,但返回 Invaid 函数。所以我会按照你的建议来看看 SampleCB 。但是,当我只是在寻找尺寸时,为什么它会失败?我想如果它是错误的 stste 它不能告诉所需的缓冲区大小。
    • 我讨厌这个网站 - 它认为它比普通熊更聪明。为什么这次“编辑超时:咬我。
    • 失败是意料之中的:它根本没有缓冲任何样本来让您返回任何结果。还要记住,Sample Grabber 不是“核心 DirectShow”,它只是那些不想涉足编写过滤器的人的辅助工具。因此,总体准确性,但 Sample Grabber 无疑是一个非常受欢迎的组件。
    【解决方案2】:

    在大多数情况下,使用 GetCurrentBuffer 是个坏主意。正确使用样本采集器的方法是在 SampleCB 中设置回调和接收数据。

    【讨论】:

      猜你喜欢
      • 2016-06-30
      • 2016-04-03
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 2019-06-05
      • 2018-11-27
      相关资源
      最近更新 更多