问题标签 [samplegrabber]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - DirectShow Sample Grabber 被调用,但回调中的“this”为 NULL
我正在研究 DirectShow filtergraph 的基本实现,以从我的应用程序中的网络摄像头获取图像。我已经阅读了文档并创建了一个简单的实现。我创建了这个图:设备 --> samplegrabber -> nullrenderer。
我正在检查所有可能的结果值,并且我没有从 SDK 中得到任何错误。
问题:
不知何故,我的回调被正确调用了,但是每当我在回调函数中添加任何代码(这对 SampleCB 和 BufferCB 都有效)时,我的应用程序就会静默崩溃。
我在 BufferCB 中添加了一个断点,我看到“this”是 0x0000000 / NULL。因为我在创建图表时检查了所有结果值,所以我的猜测是我的图表设置是正确的,并且这个问题可能与 COM 相关。但这只是一个疯狂的猜测。
因为 Windows 7.0 SDK 不提供包含 ISampleGrabber 接口的接口的 qedit.h,所以我自己创建了这个文件并添加了相关接口(我在谷歌搜索时在帖子的某处找到了内容)。
我从文档中复制了 saveGraph 函数,以便可以在 GraphEdit 中测试图形。添加渲染节点时,我看到 GraphEdit 会自动编辑颜色转换节点。当我使用渲染器运行图表时,我可以看到来自网络摄像头的图像(在 graphedit 中)。
我已经在这个要点中粘贴了所有相关代码(带有调用堆栈跟踪+变量)
有人知道我如何调试这个或这个错误可能是什么?它可能与COM相关吗?
更新:尝试访问我的成员时调用堆栈 ISampleGrabberCB
谢谢
directshow - C# 和 VB.NET 中的 SampleGrabber BufferLen 大小变化
如果从不同的编程语言调用,是否有任何理由说明未设置媒体子类型的 ISampleGrabberCB.BufferCB 中 BufferLen 的大小应该有所不同?
我有一个 C# 应用程序和一个 VB.NET 应用程序,它们都在关闭时钟并且在 SampleGrabber 上没有设置媒体子类型的情况下尽快运行图表。代码是相同的。在 C# 应用程序中,每次样本通过采集器时,BufferLen 的大小都是不同的(如您所料)。在 VB.NET 应用程序中,BufferLen 是一个常量固定值。
例如,当通过图形运行 1280 x 720 视频时,VB 代码中 BufferLen 的大小始终为1,382,400(这是有道理的,因为视频解码器上的输出引脚显示 12 位 NV12 格式)。在 C# 代码中,BufferLen 的大小在低值和高值之间变化很大。
有谁知道为什么会这样?
c++ - 无法在 DirectShow 中显示两个摄像头
我正在使用两个 DirectShow 图表,在不同的线程上运行,以显示流视频(单独使用 VMR 9)并从两个网络摄像头捕获帧(使用 Sample Grabber)。其中一个是内置网络摄像头 (HP TrueVision HD),另一个是连接到 USB 端口的 Creative VF0520。其他 USB 端口均未使用。
问题是 Creative 相机打开(LED 亮起),但没有流通过。即使我禁用了内置网络摄像头,问题仍然存在。但是,如果在只有 Creative cam 连接的摄像头的桌面上运行,Creative cam 可以正常工作。
该程序在每个摄像头是唯一连接的情况下工作(Creative VF0520 在它是唯一连接到桌面的摄像头时工作),但是当连接两个摄像头时,视频显示和抓帧仅适用于内置网络摄像头。
我怀疑这个问题可能来自与捕获过滤器的名字对象绑定。我正在使用来自MSDN的修改代码。这是绑定绰号以捕获多个相机的过滤器的正确方法吗?
然后访问包含名字对象的向量以绑定到捕获过滤器:
c++ - iSampleGrabber,回调方法。代码有效,但可能需要一些爱?
好的。所以我的 isamplegrabber 回调方法可以工作了,我可以将数据输入到 opencv 中。但由于这对我来说是全新的,如果代码“正确”,我只想得到一些反馈,因为它似乎不是一个好的..
起初在我的代码中(来自互联网)我有:
后来,在互联网的大力帮助下,我插入了这个:
我使用:
一切正常,但我想知道。我需要为回调方法创建一个新类吗?我可以看到“#pragma region...”中的所有方法我不能将这些方法用于回调吗?
问题):
一: sampleCB/bufferCB 方法是否需要“fakeCallback”类?或者我可以以某种方式使用第一个代码部分中的方法吗?
二: “virtual”——方法,意思是说这个方法可以“覆盖”?这就是我在使用方法 sampleCB 和 bufferCB 创建类 fakeCallback 时正在做的事情吗?
谢谢!
c++ - ISampleGrabber 可以将视频帧转换为特定的 mediaType 吗?
我在互联网上找到了这个很好的例子,解释了 directshow 的工作原理。
在该示例中,有两个采样器。一种称为 NON-RGB 抓取器,一种称为 RGB-grabber。
第一个:(非RGB)
第二个:(RGB)
方法“setmediatype()”仅在“RGB”版本中使用。但我想知道。在 MSDN 页面上说 setmediatype() 表示在样本采集器过滤器的输入引脚中可用的数据类型。如果可以在不设置媒体类型的情况下使用样本采集器,我为什么要把它设置为任何东西?
问题:
样本采集器是否进行任何类型的媒体转换?
为什么要设置采样器的媒体类型?
如果cam的媒体类型设置为MJPG,并且我在samplegrabber中将媒体类型设置为RGB24,会发生什么?
使用一个比另一个有任何性能差异吗?为了提高软件的性能 (fps),我应该删除其中一个采样器吗?
谢谢!
winapi - How to get the realtime resolution in directshow?
How to get the current resolution of SamleGrabber in DirectShow?
I tried the below code, it doesn't work. The value you get is always 1920x1080, while the source resolution changed from 1920x1080 to 1680x1050.
windows-ce - 我需要使用 DirectShow 制作一个 Windows CE 7 图像采集卡
我需要使用 DirectShow 制作一个 Windows CE 7 图像采集卡。Internet 上的所有示例都指向已弃用但仍然可用的 ISampleGrabber 的自定义实现。我需要任何有效的解决方案。我尝试了此链接中的解决方案,在此处输入链接描述,但没有奏效。在我的带有 Windows CE 7 的 BeagleBoard (Arm 8) 上,ISampleGrabber 根本没有注册。
我应该怎么办?还有其他好的工作示例吗?
另一项要求是尽可能实现响应速度最快的相机捕捉。许多消息来源都指向使用 ISampleGrabber,但它已被弃用。
.net - DirectShow ISampleGrabberCB 在 Ctrl+Alt+Del 后停止
我已经创建并渲染了一个 directshow 图表。图形本身被渲染成 aISampleGrabberCB
并且一切都很好。
但是,如果我按 Ctrl+Alt+Del,就会BufferCB
停止ISampleGrabberCB
调用。我检查了图表,它仍在运行。为什么ISampleGrabberCB
停止工作?
c++ - 使用采样器过滤器的音频/视频同步问题
我正在使用 DirectShow 播放电影。我修改视频/音频数据并在我的应用程序中自己渲染所有内容。因此,我使用的是 SampleGrabber 过滤器和 NULL 渲染器。
当我倒带电影(使用 IMediaSeeking 界面)时出现问题 - 音频明显滞后于视频(滞后几秒钟)。
我了解音视频同步基础知识和时间戳。我确实了解渲染过滤器可能会根据呈现时间丢帧。
但我猜 SampleGrabber 过滤器只是接收所有数据?是否可以在我的 SampleCB 回调中获取已经同步的音频/视频数据?
c# - 使用 DirectShow .NET 从 SampleGrabber 计算 FFT
我正在使用 DirectShow .NET 开发一个项目。我正在尝试集成一个名为“WPF 声音可视化库”的库,该库创建了一个频谱分析仪视觉效果。
为了让视觉效果发挥作用,我需要在我的播放器中实现这两种方法:
GetFFTData(float[] fftDataBuffer) - 将当前 FFT 数据分配给缓冲区。
备注:缓冲区中的 FFT 数据应仅包含实数强度值。这意味着,如果您的 FFT 算法返回复数(和许多人一样),您将运行类似于以下的算法:for(int i = 0; i < complexNumbers.Length / 2; i++) fftResult[i] = Math.Sqrt (complexNumbers[i].Real * complexNumbers[i].Real + complexNumbers[i].Imaginary * complexNumbers[i].Imaginary);
GetFFTFrequencyIndex(int frequency) - 获取给定频率的 FFT 数据缓冲区中的索引。
编辑:我已经添加了 SampleGrabber 并将它的回调与 GetFFTData 集成(尚未测试)。但是如何集成 GetFFTFrequencyIndex 方法呢?
我用可以提供帮助的方法来使用这个类:
太感谢了!