Articles of directshow

DirectShow ISampleGrabber:样本颠倒,颜色通道反转

我必须使用MS DirectShow从相机捕捉video帧(我只想要原始像素数据)。 我能够构buildgraphics/滤波器networking(捕获设备filter和ISampleGrabber)并实现callback(ISampleGrabberCB)。 我收到适当大小的样本。 但是,它们总是颠倒(垂直翻转,即不旋转),颜色通道是BGR顺序(不是RGB)。 我试图将BITMAPINFOHEADER中的biHeight字段设置为正值和负值,但没有任何效果。 根据MSDN文档,ISampleGrapper :: SetMediaType()忽略video数据的格式块。 这里是我看到的(用不同的相机logging的,不是DS),以及DirectShow ISampleGrabber给我的东西:“RGB”实际上分别是红色,绿色和蓝色: 我正在使用的代码示例略有简化: // Setting the media type… AM_MEDIA_TYPE* media_type = 0 ; this->ds.device_streamconfig->GetFormat(&media_type); // The IAMStreamConfig of the capture device // Find the BMI header in the media type struct BITMAPINFOHEADER* bmi_header; if (media_type->formattype != FORMAT_VideoInfo) { bmi_header = &((VIDEOINFOHEADER*)media_type->pbFormat)->bmiHeader; } else if (media_type->formattype != […]

我可以在没有播放的情况下从DirectShow获取原始video帧吗?

我正在使用媒体基础工作媒体播放器。 我想支持VOB文件播放。 但是,媒体基础目前不支持VOB容器。 因此我希望使用DirectShow。 我的想法是不使用DirectsShowgraphics来替代path,而只是抓取一个video帧,并把它传递给媒体基础中的相同pipe道。 在媒体基础上,我有一个“IMFSourceReader”,它只是从video文件中读取帧。 是否有直接显示的等价物,它只是给我的帧,而不需要创build一个graphics,开始播放循环,然后试图从渲染引脚提取帧? (更清楚的是,DirectsShow是否支持这样的架构,它可以给我原始帧,而不必真正播放video?) 我已经阅读了关于ISampleGrabber,但它不赞成,我认为它不适合我的架构。 我以前没有在DirectShow上工作过。 谢谢,Mots

IGraphBuilder :: RenderFile()与VFW_E_BAD_KEY失败 – 0x800403f2

继续调查embedded式WindowsMediaPlayer问题 ,我试图做一个简单的文件播放通过DirectShow进程内服务器: ::CoInitializeEx(0, COINIT_MULTITHREADED); CComPtr<IGraphBuilder> spGraph; spGraph.CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER); CComQIPtr<IMediaControl> spMediaControl(spGraph); // … later: spGraph->RenderFile(L"c:\\foo.wav", 0); // fails with VFW_E_BAD_KEY spMediaControl->Run(); 有趣的是,当在独立应用程序中进行testing时,这两个系统(Windows XP 32和x64)都能正常运行。 但是,在我的真实使用情况下,这是一个基于NPAPI的浏览器插件,也就是一个加载到Firefox / Chrome / Opera中的DLL。 有没有人有一个想法在这里可能会出错? 或者还有什么想法? 更新:也在微软论坛上提问。 UPDATE2: IGraphBuilder::AddSourceFilter(path,path,&base)已经失败与以下registry调用(在进程监视器中看到): “RegOpenKey”,“HKCU \ Software \ Classes \ c”,“NAME NOT FOUND”,“Desired Access:Query Value,Maximum Allowed” “RegOpenKey”,“HKCU \ Software \ Classes \ Media Type \ […]

Windows:如何获得相机支持的决议?

所以要获取摄像机列表并让用户select一个(C ++,Boost,dshow,windows),我使用这样的代码: #include "StdAfx.h" #include "list.h" #include <windows.h> #include <dshow.h> #include <boost/lexical_cast.hpp> HRESULT CamerasList::EnumerateDevices( REFGUID category, IEnumMoniker **ppEnum ) { // Create the System Device Enumerator. ICreateDevEnum *pDevEnum; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum)); if (SUCCEEDED(hr)) { // Create an enumerator for the category. hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0); if (hr == S_FALSE) { […]

如何检查我的DirectShow渲染器filter是否被使用?

在我的DirectShow项目中,我创build了一个filter(从CBaseVideoRenderer派生)来渲染到一块内存。 这在大多数情况下工作得很好,我添加了filter mGraphBuilder->AddFilter(pInterfaceInfo, MemoryRendererName); 并依靠GraphBuilder来完成剩下的工作。 但是,在某些情况下,graphics构build器和我的filter无法达成共同的格式,并会绕过我的filter创build一个新的ActiveMovie窗口。 我想知道这是什么时候发生的,所以我知道我的filter没有被使用,但不能解决问题。 我列举了我的图中的所有filter,使用以下方法查找我的filter: (编辑:我把我的GraphBuilder对象作为pGraphparameter passing给我时) HRESULT MediaPlayer::CheckFilterGraphFor(IFilterGraph *pGraph, IBaseFilter* pFilterToLookFor) { IEnumFilters *pEnum = NULL; IBaseFilter *pFilter; ULONG cFetched; HRESULT enumeratedFilterCount = 0; FILTER_INFO pRefFilterInfo; pFilterToLookFor->QueryFilterInfo(&pRefFilterInfo); HRESULT hr = pGraph->EnumFilters(&pEnum); if (SUCCEEDED(hr)) { while(pEnum->Next(1, &pFilter, &cFetched) == S_OK) { enumeratedFilterCount–; FILTER_INFO FilterInfo; hr = pFilter->QueryFilterInfo(&FilterInfo); if (SUCCEEDED(hr)) { if(wcscmp(FilterInfo.achName, pRefFilterInfo.achName) […]

虚拟摄像头input为字节stream

我没有摄像头。 我想实现虚拟摄像头(或假设备驱动程序可能),将作为正常的networking摄像头( 虚拟networking摄像头 ),并将内存stream或字节作为input。 我该如何开发? DirectShow可以帮助吗? 我什么都不知道 请帮忙 我发现有很多软件把video文件作为input,但是我想把字节stream作为input。

如何从Wave Out捕获PCM数据

如何以编程方式捕捉audio? 我正在实现一个应用程序,实时在networking上的桌面stream。 video部分完成。 我需要实现audio部分。 我需要一种方法来从声卡获取PCM数据,并将其提供给我的编码器(使用Windows Media格式实现)。 我认为答案与Win32 API中的openMixer(),waveInOpen()函数有关,但我不确定该怎么做。 如何打开必要的频道以及如何从中读取PCM数据? 提前致谢。

如何从相机捕获数据不使用DirectShow?

如何使用DirectShow从摄像头捕获数据? (在Windows的C#中)

DirectShow – 获取video帧

我正在创build一个Windowsvideo捕获应用程序,并使用DirectShow进行捕获。 随着每帧的进入,我想把它作为一个原始的RGB位图到一个缓冲区,在这一点上我的代码将做我需要的任何处理。 我一直在寻找类似于我想要做的样本,并且在我看起来在线的任何地方,人们推荐使用IMediaDet和/或ISampleGrabber接口来进行逐帧捕获。 不幸的是,两者都被弃用,甚至没有在最新版本的Windows SDK中。 在DirectShow中进行逐帧捕获的最佳(现代)方式是什么? 如果没有,我是否应该使用一个不同的库,这将使我逐帧捕获?

DirectShow在Windows上的video捕获的替代品

我正在更新目前使用DirectShow进行video捕获的程序。 虽然DirectShow似乎工作得很好,但我想知道是否还有其他function强大的或最新的SDK或API。 一些有用的function将是: 在捕捉期间提供一致的帧速率(在NTSC之间为33ms)。 使用DirectShow兼容的捕获设备。 不需要在客户的PC上安装额外的许可证。 允许同时预览和硬件编码的video。 能够被集成到一个C ++ / MFC应用程序中。 我已经研究过LeadTools多媒体捕获SDK和VisioForge Capture SDK以及微软媒体基金会 ,但是只是想知道其他人已经成功地使用了什么,然后才投入时间或资金到其中一个替代scheme中。 我不在乎这是一个商业还是开源的产品。 编辑:虽然我很欣赏解决我的特定问题的尝试,但这个问题应该是关于DirectShow的替代scheme。 所以,我删除了所有对我的具体问题的引用。 解决这个问题需要等待另一个问题。