Articles of directshow

如何处理与消息发送第二个事件循环?

我正在研究一个基本上是单线程的程序,它唯一的线程是主要的事件循环线程。 因此,它的所有数据结构基本上都不受关键区域的保护。 事情工作正常,直到它最近集成了一些基于DirectShow API的新function。 一些DirectShow API打开第二个事件循环,在第二个循环内部调度消息(即不可预知地调用其他事件处理callback)。 因此,当调用第二个事件处理函数时,可能会损害调用DirectShow API的函数正在访问的数据结构。 我有一些内核编程的经验。 我脑海里想到的是,对于一个单线程的程序来说,它应该如何处理它的数据结构,就好像内核应该如何处理每个CPU的数据结构一样。 而在内核中,当一个函数访问每个CPU的数据时,它必须禁止中断(就像在第二个事件循环中调度消息一样)。 但是,我发现有没有简单的方法来避免调用DirectShow API或阻止在其中创build第二个事件循环,有什么办法吗?

为什么IGraphBuilder :: RenderFile找不到ffdshowvideo解码器?

当我以pipe理员身份安装K-Lite Codec Pack(5.90 Basic)时,运行一个调用IGraphBuilder :: RenderFile作为标准用户的应用程序,结果graphics没有ffdshowvideo解码器filter。 但是,当我作为(原始安装)pipe理员运行该应用程序的ffdshowvideo解码器在图中。 安装编解码器时是否有错误? –bong

接受VIDEOINFOHEADER2的DirectShow ISampleGrabber

如http://msdn.microsoft.com/en-us/library/dd377544(VS.85).aspx中所述 ,ISampleGrabber仅接受具有VIDEOINFOHEADER结构的video,但不接受VIDEOINFOHEADER2。 是否有任何替代ISampleGrabber,或任何示例代码的filter,可以做类似的工作? 我已经尝试过使用IBasicVide,但在屏幕上呈现video,我想避免。 谢谢。

多次将相同的滤镜添加到DirectShowgraphics

如果没有先解释我正在做什么,我的问题就有点难以解释了,所以我将从此开始。 我正尝试使用Directshow中的Sample Grabber + Null Renderer滤镜组合来抓取多个videostream中的样本。 input源可以是从networking摄像机到video文件到url的任何内容。 我知道如何做一个单一的input源,获取input源的IBaseFilter,然后使用CoCreateInstance()来获取样本采集器和null渲染器的IBaseFilter指针: HRESULT hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&sample_grabber_filter); if(FAILED(hr)) { printf("(Fatal) Error setting up Sample Grabber.\n"); return hr; } hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&null_renderer); if(FAILED(hr)) { printf("(Fatal) Error seeting up Null Renderer.\n"); return hr; } 然后,我可以使用FilterGraph :: AddFilter()函数来添加所有3个filter,并使用另一个接口,如CaptureGraphBuilder2来呈现stream。 但是当我想同时从多个源渲染时会发生什么? 我可以将所有源filter添加到graphics中,但Sample Grabber和Null Rendererfilter如何完成每个videostream的graphics呢? 我可以做些什么: […]

有没有任何帮助工具创build“即时”(编程)的graphedit文件

我注意到,avisynth只能通过包含该源代码的graphedit文件接受作为input的“live directshow源”。 是否有任何帮助工具在那里创build一个dynamic的graphedit文件,给你知道一个捕获来源名称(和/或从该针脚输出格式)? ref: http : //betterlogic.com/roger/2012/05/avisynth-live-capture graphedit文件语法在这里描述: http : //msdn.microsoft.com/en-us/library/windows/desktop/dd388788 (v=vs.85) .aspx (虽然它没有提到如何发现正确的值放在那里)。

DirectShowgraphics中的video延迟

我正在看到一个引人注目的video,导致我正在testing的采集卡的audio/video同步closures。 我的graphics拓扑如下。 Video Source -> Sample Grabber -> Null Renderer Audio Source -> Sample Grabber -> Null Renderer video采样使用H264进行压缩,并使用FAAC对audio进行压缩。 这个拓扑结构和应用程序代码适用于我以前使用过的采集卡。 但是我看到了我正在testing的当前卡的延迟。 当然,我认为这是关系到卡本身。 所以我查了一下,发现使用Open Broadcaster,VLC或GraphEdit中的同一个图表来捕获这张卡片时,没有video/audioasynchronous。 这表明这个问题与我如何构build图表有关。 然后,我尝试使用IAMBufferNegotiation和SetStreamSyncOffset调整缓冲区大小,但没有成功。 如果我将500毫秒的延迟应用于video(例如videoTimeStamp = videoTimeStamp – 500 ),则同步几乎是完美的。 这很奇怪,因为我期望在video中看到更多的audio延迟。

包括DirectShow库到Qt中的video缩略图

我试图在Qt上实现http://msdn.microsoft.com/en-us/library/dd377634%28v=VS.85%29.aspx ,为video文件生成一个海报帧/缩略图。 我已经安装了Windows Vista和Windows 7 SDK。 我放: #include "qedit.h" 在我的代码(注意也有一个在C:\ QT \ 2010.04 \ mingw \ include),我添加: win32:INCLUDEPATH += $$quote(C:/WindowsSDK/v6.0/Include) 到我的* .pro文件。 我编译并得到“错误:sal.h:没有这样的文件或目录”。 在VC ++中find这个我添加 win32:INCLUDEPATH += $$quote(C:/Program Files/Microsoft Visual Studio 10.0/VC/include) 现在有1400个编译错误。 所以,我放弃了,只是添加: win32:LIBS + = C:/WindowsSDK/v7.1/Lib/strmiids.lib 到我的* .pro文件,并尝试运行(不包括任何标题): IMediaDet mediadet; 但后来我得到“错误:IMediaDet:没有这样的文件或目录”。 #include "qedit.h" 给我同样的错误(它看起来像是指向Qt版本)和 #include "C:/WindowsSDK/v6.0/Include/qedit.h" 回到生成1000年的编译错误。 唉,这么多麻烦,应该是10行代码… 感谢您的意见和帮助

直接显示捕捉filter“包装”

我需要编写一个DirectShow捕获filter来包装“真实”video设备(filter)并对捕获的video进行去隔行处理。 从接口的angular度来看,这必须是一个在枚举器中可用的独立video设备,当它被select时,它连接到一个真实的video设备,并在video设备输出引脚和它自己的输出引脚之间插入一个变换滤波器(去隔行)。 我的问题是 – 我的方法是否正确? 我想简单地开发一个DShow捕捉videofilter,实例化一个转换filter,并从我的filter自动连接引脚。 有没有更好的方法来注入一个真正的video设备和使用它的应用程序之间的转换filter? 问候 Dominik Tomczak

DirectShow USB摄像头LED闪光灯访问

我正在使用C ++,需要访问USB摄像头的LED闪光灯function。 我目前正在使用DirectShow以其他方式与相机连接(实时预览stream,抓取样本等)。 我在MSDN上find了CameraControl_Flash枚举元素,但它似乎仅适用于Windows Embedded CE 6.0和Windows Mobile: http://msdn.microsoft.com/en-us/library/aa925325.aspx 这是行不通的,因为我使用Windows 7。 在DirectShow中是否还有其他标准方法,或者与LED闪光灯function进行接口? 任何人都可以提供任何其他的意见吗?

在桌面应用中显示stream媒体video

我有一个Windows原生桌面应用程序(C ++ / Delphi),我成功地使用Directshow从“本地”video捕获设备中显示实时video。 接下来我想要做的是从“远程”捕捉设备显示video,通过局域网进行stream式传输。 为了stream式传输video,我想我可以使用诸如Expression Encoder或VLC之类的东西,但我不确定接收/解码streamvideo的最简单方法是什么。 插入一个ActiveX的VLC或Flash播放器可能是一种select(虽然许cocoa能是一个问题),但我想知道是否有任何方式来实现这与Directshow … 应用程序需要在XP上运行,video解码理想的是免费的。 build议,请!