【问题标题】:Can't get IAMBufferNegotiation in my code, but GraphStudioNext shows ALLOCATOR_PROPERTIES无法在我的代码中获取 IAMBufferNegotiation,但 GraphStudioNext 显示 ALLOCATOR_PROPERTIES
【发布时间】:2014-07-20 10:39:33
【问题描述】:

我在 C# 中使用 DirectShowLib.net,并且我正在尝试更改我的 ALLOCATOR_PROPERTIES 设置,因为我使用的是实时视频源,并且更改不会“立即”在屏幕上显示。

在 GraphStudioNext 中构建过滤器图时,ALLOCATOR_PROPERTIES 会显示上游和下游引脚,尽管仅在连接之后。

我想使用 IAMBufferNegotiation 设置 ALLOCATOR_PROPERTIES,但是当尝试从我的捕获过滤器(AV/C 磁带录音机/播放器)获取接口时,我收到 E_UNEXPECTED (0x8000ffff) 错误。以下是相关的 C# 代码:

DS.IAMBufferNegotiation iamb = (DS.IAMBufferNegotiation)capturePin;
DS.AllocatorProperties allocatorProperties = new DS.AllocatorProperties();
hr = iamb.GetAllocatorProperties(allocatorProperties);
DS.DsError.ThrowExceptionForHR(hr);

当我使用下游视频解码器输入引脚时,我收到 System.InvalidCastException,因为该接口不受支持。

如何更改 ALLOCATOR_PROPERTIES 的 cBuffers 值?

【问题讨论】:

  • 你有什么延迟?对于 DV 设备,3-5 帧的延迟应该是正常的。在数字视频工作流程中不可能减少延迟。
  • 大约是。 20帧,但最后我发现问题出在过滤器链之外。

标签: c# directshow video-capture latency directshow.net


【解决方案1】:

在这里更改缓冲区的数量对您没有帮助。过滤器之间协商的缓冲区数量基本上不会在外部更改,但是在您的情况下,管道中没有真正的缓冲:一旦视频帧在第一个输出引脚上可用,它就会立即通过并且到达视频渲染器。如果您在那里看到延迟,则意味着 DV 播放器有内部延迟,或者是时间戳帧“延迟”并且视频渲染器必须在呈现之前等待。您可以通过在中间插入 Smart Tee 过滤器并将其预览输出引脚向下连接到视频渲染器来解决后一种情况 - 如果这有帮助,那么问题是源上的帧时间戳。缓冲区的数量不会导致任何呈现延迟。

【讨论】:

  • 嗨!问题不在过滤器链中。我还添加了一个采样器。我将缓冲区内容传递给第三方软件,即使它在不同的线程中,它显然仍然会导致一些滞后。我重构了代码,它现在可以工作了,但我还不知道究竟是什么解决了这个问题。
猜你喜欢
  • 2022-08-20
  • 2021-01-16
  • 2011-04-23
  • 2021-01-02
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多