我有一个Delphi 6应用程序,该应用程序可实时将位图发送到直接滚动DLL,每秒25帧. DirectShow dll也是我的代码,也使用Dspack DirectShow组件套件在Delphi 6中编写.我有一个简单的代码块,可以通过位图中的每个像素修改图像的亮度和对比度,如果设置了某个标志,否则将位图推出了DirectShow dll dll dll未修改(推源视频过滤器).代码曾经在主应用程序中,然后我将其移至DirectShow DLL中.当它在主要应用程序中时,它运行良好.我可以按预期看到位图的变化.但是,现在代码位于DirectShow dll中,它有以下问题: 当下面的代码块处于活动状态时,DirectShow DLL确实很慢.我有一个四核i5,这真的很慢.我还可以看到CPU消费量很大.相比之下,在主应用程序中运行的相同代码在旧的单核P4 上运行良好.它确实在那台旧机器上明显触及了CPU,但是视频很顺畅,没有问题.图像只有352 x 288像素. 我看不到可见
以下是关于 directshow 的编程技术问答
我正在使用视频resizer dsp 视频Resizer DSP 调整我的视频大小. 我与Lazarus Free Pascal和Dspack一起工作. 本网站说明如何使用: http://alax.info/blog/1371 P> cocreateinstance DSP作为DMO,并将其添加到DMO包装器过滤器 使用iwmresizerprops :: setfullcropregion初始化dsp 连接输入引脚 通过ImediaObject :: SetOutputType 设置输出类型 igraphbuilder ::连接导向输出销 我写这篇文章: //Create Resizer DMO hr := CoCreateInstance(CLSID_DMOWrapperFilter, NIL, CLSCTX_ALL, IID_IBaseFilter, FResizerDMO); if FAILED(hr) then EXIT; //CLSID_CVid
我有一个小型Python程序,可以使用带有FFMPEG的子过程来捕获Linux的网络摄像头(至少适用于具有内置网络摄像头的笔记本电脑)的简短视频. 现在,我正在尝试编写相同的程序来捕获Windows中的网络摄像头,而且我知道我不能使用Linux中很好地工作的通用"/dev/video0",但我认为像命名它一样"集成的相机"应该足够,但失败了. 这是我的Linux代码(可行): import sys from subprocess import call from datetime import datetime def record_webcam(seconds): cam = '/dev/video0' timestamp = datetime.now().strftime('%Y%m%d-%H%M%S') filename = timestamp + 'something.mkv' #g
我正在使用DirectShow访问视频流,然后使用SampleGrabber过滤器和接口从每个帧中获取样品以进行进一步的图像处理.我正在使用回调,因此在每个新帧后都会被调用.我基本上只是从PlayCap示例应用程序中工作,并在图中添加了样本过滤器. 我遇到的问题是我正在尝试在其他OpenCV窗口上显示抢劫的样品.但是,当我尝试将信息投入缓冲区至iPlimage时,我会得到一堆像素的混乱. BufferCb调用的代码不在下面,没有任何适当的错误处理: STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen) { AM_MEDIA_TYPE type; g_pGrabber->GetConnectedMediaType(&type); VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER *)type.pbFormat; BITMAPINFO*
我正在尝试通过Firewire将视频(Sony HVR-Z1E)传输到我的计算机.传入的图片/流应通过某些期望CVMAT格式(来自OPENCV)的功能进一步处理. 好吧,我的问题是我不知道如何抓住流. OK OPENCV 2.1为我提供了一些方法(CVCaptureFromCam),但是无论我给他哪个参数,它总是从笔记本电脑的网络摄像头而不是从Firewire获取流.我听说我需要在DirectShow API(使用Windows SDK)中切换主凸轮.但是我实际上也不知道该怎么做. 所以有什么建议如何做? 解决方案 请参阅我的相关答案在这里. OpenCV本地无法从Firewire摄像机中捕获视频.您要么需要使用CMU1394驱动程序,要么需要使用Sony驱动程序(如果可以使用SDK)来捕获该相机的视频,然后将其传递给OpenCV. 其他解决方案 几年前,我使用DirectShow做了这样的事情.主要限制是事实,该图像通过DShow获得的图像是标准的PAL分辨率.高清图像
我有一个视频 Engine2.avi 我想阅读和显示OpenCV.这是我的代码: #include #include #include using namespace cv; int main(int argc, char** argv) { string filename = "D:\\BMDvideos\\engine2.avi"; VideoCapture capture(filename); Mat frame; if( !capture.isOpened() ) throw "Error when reading steam_avi"; namedWindow("w", 1); for( ; ; ) { capture >> frame;
我已经开发了一个Windows应用程序,该应用程序使用DirectShow从外部设备捕获视频.图像分辨率为640x480,而没有压缩的视频尺寸很大(约27MB每秒). 我的目标是尽可能降低此尺寸,因此我正在寻找一个编码器,这将使我可以实时压缩视频.可能是H.264,MPEG-2或其他任何东西.它必须允许我将视频保存到磁盘上,如果我还可以通过网络实时流式传输磁盘(Wi-Fi,因此大小应大约为每秒1MB或更少).重大质量损失将是不可接受的. 我发现,为此任务获得适当的直接滤波器非常困难.可以假定客户端机器是合理的现代(快速2核CPU),并且可以使用CUDA/OPENCL.有一些应用程序允许使用CUDA编码视频并提供良好的性能,但是我没有找到适当的DirectShow过滤器或可用于开发一个的API. nvidia nvcuvenc.dll似乎具有私有API,因此我无法直接使用它.我发现的任何基于CPU的编码器都无法满足我的要求,但也许我错过了一些. 任何人都可以向我推荐一个解
我正在扩展一个应用程序,以在对话框中的控件上播放几个视频之一.从无窗的示例开始,尽管视频必须与主要可执行文件单独的文件. 从包装的角度来看,理想的情况是将视频包含在可执行文件中.我为此做了一些谷歌搜索,并且有很多"有人应该这样做",还有几个指针是异步样本,尽管尚不清楚如何从那里到达我想要的地方. 有人知道这样做的简单方法吗?似乎这不是一个角案,我有点惊讶这不在框中. 解决方案 寻找 异步过滤样品 在DirectShow SDK中,它具有称为cmemstream的内容,可以从内存中流数据(读取:媒体). 其他解决方案 为什么不从EXE/DLL中提取视频并将其存储在温度路径中?然后播放临时文件.
我正在尝试通过FFMPEG从Windows 10流式传输系统音频,但是当我运行ffmpeg -list_devices true -f dshow -i dummy 时,我的内置音频输出设备(Realtek)不会显示 但是Realtek音频设备可以正常工作,并且还显示在Graph Studio Next中注册,直接显示设备浏览器: OS:Windows 10,64位 FFMPEG:4.3.2(最新) 有什么想法? 解决方案 您需要启用Loopback设备.它通常以"立体混音"开头. 转到控制面板 - >声音 - >录制.右键单击并确保显示所有设备.启用"立体声混合".
我正在尝试在我的应用程序中从4K摄像头(BRIO)预览视频流.该应用程序使用DirectShow打开相机并接收帧.过滤器配置如下图所示. 问题是高分辨率(即4096x2160).使用4096x2160分辨率,当我预览视频流时,GraphEdit和我的应用程序都会延迟. 我正在Windows 10上进行测试.请注意,Windows 10预装的相机应用程序可与此分辨率完美.我还使用MediaCapture API在UWP示例中尝试了相同的操作,但是问题是相同的. 我缺少什么? 解决方案 Windows 10预装的相机应用程序不使用DirectShow,使用了基于Media Foundation API的完全不同的代码路径,总体而言,尤其是JPEG减压效率更高.也就是说,您无法将基于直接节目的图形直接比较Windows Store Camera应用程序. 在您的情况下>是与此分辨率不兼容的过时的软件,并且是瓶颈.还需要具有 . 表演明智的明智,我建议在媒体基金会
我有Delphi 6中编写的DirectShow应用程序.我想将渲染器的缓冲区大小从当前的500 ms值减少到较小的东西.问题是,其输入引脚不支持Iambuffernegotiation,这很奇怪,因为渲染器是我VoIP手机上的耳朵,显然需要较小的缓冲尺寸以避免在电话中延迟不愉快. 我尝试了将VoIP手机的捕获过滤器(麦克风)连接到渲染器(EAR片)的图表编辑中的环回测试.我知道缓冲区的大小为500毫秒,因为这是渲染器属性的图表编辑显示的内容.但是,当我在Skype呼叫中使用VoIP手机时,延迟要短得多,我期望的是50-100毫秒. 因此,Skype知道如何更改渲染器的默认缓冲区大小.我该如何做同样的技巧? 解决方案 输出引脚通常负责设置分配器,并且IAMBufferNegotiation通常在输出引脚上可用.您只想在Capture Filter的输出引脚处降低缓冲区尺寸,并且它将生成小型缓冲区,这些缓冲区将通过该图传播,仍然是小型缓冲区和小块数据,因此不需要减少中间
我正在使用优秀 gmfbridge directshow fillers 非常效果,让我关闭视频录制图并打开一个新的录制图,没有数据损失. 我的原始源图是从标准视频和音频输入中捕获实时视频. GMFBridgeController滤波器上有一个无证件的方法,名为SetLiveTiming().从名称来看,我认为如果我们从A live 图(不是从文件中)捕获的,则应将其设置为true.我将此值设置为true,一切都按预期工作 相同的捕获硬件使我能够捕获实时电视信号(在我的情况下为ATSC),因此我使用BDA架构过滤器创建了该图的新版本,以调整目的.一旦数据从MPEG Demuxer流出,该图的其余部分几乎与我的原始图相同. 然而,在此操作上,我的muxing图(在桥的另一侧)不起作用.数据从BridgeSource过滤器(视频和音频)流过,并达到了MP4 Muxer滤波器,但是 没有来自muxer输出馈送A FileWriter过滤器的数据. 几个小时后,我将
我正在研究项目,我需要阅读USB摄像机的输入,对其进行一些影响,然后将该数据发送到虚拟摄像机,以便可以通过Skype等访问. . 我已经编译并使用了 vcam filter .我还能够对FillBuffer方法进行一些更改.我现在需要知道可以从另一个应用程序将数据发送到VCAM过滤器,或者我需要编写另一个过滤器. 解决方案 您当前作为模板的VCAM项目是其他视频消费应用程序(例如Skype)的接口,那些使用DirectShow API访问视频捕获设备并与您的过滤器中的平台/位匹配. 您有责任开发其余所谓的过滤器:您要么直接访问过滤器中的真实设备(大大简化了任务,这是您填充FillBuffer的内容,即从另一个来源生成视频的代码) ,或者您要实现分解通信,以便FillBuffer实现可以从另一个应用程序传输数据. Nethier VCAM或任何标准DRIECTSHOW样本提供涵盖分解通信的功能,您可能还需要处理其他并发症:一个应用程序和多个过滤器以消费视频,平台
我正在开发一个Windows应用程序,该应用程序能够显示高质量的视频供稿,记录下来或从中拍摄照片,并以后将其编辑(最多4K,在不久的将来可能是8K). 我目前有使用WPF(C#)的工作产品.为了捕获和显示视频,我使用了aforge.net库. 我的问题是该应用程序真的很慢,主要性能来自视频渲染.显然,这样做的唯一方法是从Aforge库中进行回调,每次可用时都会提供一个新的框架.然后将该框架作为图像放置在Image元素中.我相信您可以看到性能的来源,尤其是对于高分辨率图像. 我在WPF和这些庞大的图书馆方面的经验使我重新考虑了我想如何编程;我不想制作不好的软件,从而占用每个人的时间(我是指手工网络),以获取有关"为什么?"的更多信息. 问题是,摄像机捕获和显示在WPF C#中是地狱,但是我似乎在其他任何地方都没有更好的选择(在Windows上,就是).一个选择是我主要使用C ++和DirectShow.这是一个很好的解决方案,但在性能方面感觉过时,并且建立在Microso