问题标签 [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.

0 投票
0 回答
1680 浏览

visual-c++ - DirectShow:SampleGrabber 和 Null 渲染

我想创建一个过滤器图,它允许我从不应渲染的(网络摄像头)视频流中获取图像样本。

我已经创建了一个过滤器图,它允许我预览我的网络摄像头视频流并从中获取图像样本。所以我只需要不渲染视频流。

据我所知,我应该使用 NullFilter 来处理视频流输出,但我没有成功使用它......

这是我到目前为止所拥有的:

过滤器图初始化:

添加相机:

然后我可以通过以下方式获取我的图像样本:

.

要删除我尝试删除的视频流渲染:

并添加:

但是当我尝试mydata1->pGrabber->GetCurrentBuffer(&pBufferSize, (long*)pBuffer);它失败了......

关于我做错了什么的任何想法?

0 投票
1 回答
882 浏览

c++ - ISampleGrabber::GetCurrentBuffer() returns E_OUTOFMEMORY

I am new to directshow and using DirectShow Sample "FrameGrabberDemo" and facing issue in getting the image. I tried with .avi and .mpg, both are giving same issue.

First issue might be the S_FALSE return value from IMediaControl::Run(). However, it is not an error and states that:

The graph is preparing to run, but some filters have not completed the transition to a running state.

Second observation is ISampleGrabber::GetCurrentBuffer() returns E_OUTOFMEMORY code, which states that "The specified buffer is not large enough." However, the BitmapInfo has biImageSize = 1244160 and also MediaType has ISampleSize = 1244160.

The ::CreateDIBSection is also not returning NULL and buffer also got initialized.

How can this be resolved?

0 投票
1 回答
270 浏览

php - 使用 curl 从 asp 中获取数据

我制作了以下代码以将所有作物价格显示到该站点的一个网页:http ://agmarknet.nic.in/agnew/NationalBEnglish/MarketWiseDailyReport.aspx?ss=1

但我只从西孟加拉邦得到了 Ranaghat(Kalyani) 的价格。但我想获取所有区域的 eventvalidation 和 eventargument 值,有没有办法获取所有区域的两个值并在一页上显示所有区域?

0 投票
0 回答
99 浏览

visual-c++ - 我们可以将采样器过滤器连接到跛脚过滤器以便能够访问缓冲区..?

嗨,我在 Directshow 中使用 Visual C++ 制作了一个程序,使用 LAME ENCODER 将麦克风音频转换为 MP3。现在我想访问缓冲区,以便我可以将编码数据用于进一步的处理。所以我的问题是我可以使用样本采集器来做到这一点。请帮助我,我是 Directshow 编程的新手。

0 投票
1 回答
458 浏览

c++ - 解决 DirectShow 上的像素纵横比 (PAR) 问题的最佳方法是什么?

我正在使用 DirectShow filtergraph 从视频中抓取帧。当前的实现遵循此图:

SourceFilter->SampleGrabber->NullRenderer

这在大多数情况下可以逐帧提取图像以进行进一步处理。但是,我遇到了一些 PAR 不是 1:1 的视频的问题。这些图像在我的处理步骤中出现拉伸。

我现在发现解决这个问题的唯一方法是在无窗口模式下使用 VMR9 渲染器,该渲染器使用 GetCurrentImage() 来提取具有正确纵横比的位图。但是这种方法对于连续抓取上千帧的情况并不是很有用。

我现在的问题是:解决此问题的最佳方法是什么?有没有人也遇到过这个问题?

0 投票
1 回答
1048 浏览

c++ - Sample Grabber 返回的 IMediaSample 具有意外的缓冲区大小

我正在使用 Media Foundation 为 Windows 开发音频/视频捕获库。但是,对于 Windows 8.1 上的某些网络摄像头,我遇到了这篇文章中描述的问题。因此,我决定使用 Directshow 进行另一个实现,以在我的应用程序中支持尚未更新驱动程序的网络摄像头。

该库运行良好,但我注意到一些网络摄像头存在问题,根据在启动摄像头之前设置的格式,返回的样本 (IMediaSample) 没有达到预期的大小。

例如,我遇到格式集的子类型为 MEDIASUBTYPE_RGB24(每像素 3 个字节)且帧大小为 640x480 的情况。应用格式时,biSizeImage(来自 BITMAPINFOHEADER)很好 640*480*3 = 921600。IAMStreamConfig::SetFormat() 方法成功应用格式。

我还将格式设置为 Sample Grabber Interface,如下所示:

我在开始图表之前应用了格式。

但是,在回调 (ISampleGrabberCB::SampleCB) 中,我收到一个大小为 230400 的样本(它可能是大小为 320x240 (320*240*3=230400) 的帧的缓冲区)。

我试图调查使用 IMediaSample::GetMediaType() 方法返回的媒体类型,但媒体类型为 NULL,这意味着根据GetMediaType 方法的文档,媒体类型没有改变(所以我猜,它仍然是我使用 IAMStreamConfig::SetFormat() 函数成功应用的媒体类型)。

为什么在这种情况下返回的样本缓冲区大小不是预期的大小?我该如何解决这个问题?

提前致谢!

0 投票
1 回答
1253 浏览

c++ - 将 SampleGrabber 与 CaptureGraphBuilder2 一起使用的问题

我一直在尝试使用 SampleGrabber 从网络摄像头中抓取一帧并将其保存为位图,但没有任何运气。我使用了 MSDN 上的 Directshow 视频捕获示例,使用了 ICaptureGraphBuilder2 以及示例采集器示例。

我希望我的过滤器图如下所示:

网络摄像头(来源)-> Sample Grabber -> Null Renderer

因为我对预览不感兴趣,所以我认为空渲染器对我来说就足够了。

计划是通过搜索特定的 VID 和 PID (webcamCapture::findWebCam()) 来找到我的网络摄像头,创建我的 samplegrabber,创建空渲染器,然后使用 pGraphBuilder->RenderStream() 将它们连接在一起。因为我只需要一帧,所以我使用了 OneShot 方法,然后使用 GetCurrentBuffer 来检索帧。

问题出现在这一行:

返回的 HRESULT 代码是 E_ABORT。将超时设置为 INFINITE 会导致程序冻结,这可能意味着过滤器永远不会停止。pControl->Run() 中的 HRESULT 为 S_FALSE,这意味着并非所有过滤器都在运行。我不确定为什么会发生这种情况,并且我感觉在构建这些过滤器时出了点问题。

下面是我的来源的转储。我创建了一个类来处理网络摄像头捕获。在使用中,基本上有两件事被调用:

runFilter 将运行过滤器并将帧保存为位图文件。我是directshow的新手,我很确定我错过了一些简单的东西。任何见解将不胜感激!

资源

0 投票
0 回答
203 浏览

c# - 在 C# 中捕获视频非常慢

我正在尝试编写一个能够用文本和图像覆盖视频的视频播放器。现在我正在使用 driectshow 样本采集器过滤器来捕获视频并将其呈现在我的软件上。它运行良好,但在 Atom 等功能较弱的系统上运行速度很慢。我还尝试按照其他人的建议使用 EVR Presenter。我在 Managed DirectX 9 Graphics and Game Programming 上使用了代码项目中的 EVR Presenter(纯 C# 中的 EVR Presenter 和 Direct3D 视频渲染)代码示例,Kick Start 将帧转换为纹理并将转换后的纹理保存到屏幕上,示例代码如下所示:

但是渲染速度仍然很慢,并且需要大量的 cpu 功率。我可以知道是否有一种方法可以更快地捕获视频或将视频帧复制到纹理?

0 投票
2 回答
1134 浏览

c++ - 如何在 vc++ 中使用 samplegrabber?未定义采样器

在视觉社区 2015 中,我有一个 c++ 项目。在cpp文件顶部我有

我在进入项目属性> VC++ 目录时还设置了我添加的这个目录包括:C:\Program Files %28x86%29\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses

问题是当我输入我的代码时:

未定义 CLSID_SampleGrabber。

到目前为止我尝试了什么?下载了 directx sdk 9 和 6 以及 Microsoft sdk 7.1 并在 google 中搜索 qedit.h 但我没有找到该文件。无法弄清楚如何定义 CLSID_SampleGrabber

0 投票
1 回答
261 浏览

c++ - 用于在 UWP 中拆分的抓取器

我需要你的建议。我想使用 Metro 界面开发用于音频/视频分割的应用程序。

通常我使用 DirectShow 使用以下模式:创建一个抓取器,将其添加到 DS 图,通过它捕获音频/视频流并将它们传递给我的 AVstream 驱动程序进行拆分。但在新程序中,我想使用 Media Foundation 并将其插入 UWP。

我如何看待我的新应用。它必须具有用于公共控制的 Metro 接口:源的选择、添加参数、更改模式等。我想使用 MediaCapture 类来捕获流并渲染它们。在这里我没有看到任何问题,MSDN 有很多示例。但我不知道如何在源和渲染之间插入一个抓取器。

抓取器将执行哪些操作:

  1. 从 MediaCapture 接收输入流。
  2. 流转换:YUV -> RGB,添加效果等。
  3. 发送输出流以进行渲染 (MediaCapture) 和我的 AVstream 驱动程序,以便与任何应用程序(Skype、Adobe Flash Player、Edge 等)进行拆分。

如何制作一个抓取器。在 MSDN 中,我发现了三种方法:

  1. 示例 Grabber Sink ( https://msdn.microsoft.com/en-us/library/windows/desktop/hh184779(v=vs.85).aspx )。在 MF dll 中接收/控制/发送流没有问题。但我不知道如何将该 dll 与 MediaCapture 链接?
  2. 源阅读器(https://msdn.microsoft.com/en-us/library/windows/desktop/dd940436(v=vs.85).aspx)。同样的问题,加上源阅读器无法播放。
  3. 自定义 MFT?任何情况下 MediaCapture 都允许通过 AddEffectAsync() 连接到 MFT。

我的环境:MS Windows 10、MS Visual Studio Community 2015。

谢谢你的任何想法。