使用DirectShow从内存中进行渲染
我是DirectShow的新手,我正在寻找一种使用DirectShow.net渲染已加载到内存中的视频的方法.我怎样才能做到这一点?即使您给我这条路的亮点,我也会很感激. 解决方案 没有从内存数据播放的标准组件,但是 应用程序以指定的速率将文件读取到内存中,并播放文件. 请注意,过滤器需要期望您的C ++开发. 另请参见: 在异annc滤清器样品上/a> 从内存流播放视频文件 您是否获得了直接节目来播放资源的视频?
0 2024-04-14
编程技术问答社区
有效地从视频中抓取像素
我正在寻找一种从视频文件中获取图像数据的有效方法.我目前正在从Interop.QuartzTypeLib库中测试FilgraphManagerClass.GetCurrentImage().这做了我需要的东西,但痛苦慢.我需要处理每个视频的所有帧.我有什么更好的选择? 要求 必须是准确的. 让我访问解码的像素缓冲区(int或byte[]的数组),理想情况下是RGB24或RGB32. 可以实时或更快地抓取缓冲区.我不需要显示视频,我只需要分析像素. 处理MP4文件(H264/AAC).如果需要,我可以通过avisynth重新包装或框架服务,但不涉及重新编码. 欢迎任何建议. 按要求的一些代码: FilgraphManagerClass graphClass = new FilgraphManagerClass(); graphClass.RenderFile(@"C:\tmp\tmp.avs"); int sz = (graphClass.Width *
0 2024-04-14
编程技术问答社区
在另一个线程中调用一个函数 C#
我不知道该怎么做,但我会尽力而为. 我有一个Windows表单应用程序,该应用程序使用网络摄像头拍摄了工作正常的用户照片,我正在使用此处找到的DirectShownet库 http://directshownet.sourceforge.net/并使用了DXSNAP样品拍摄照片. 应用程序的下一部分使用RFID标签读取器,一旦扫描标签,它就称为拍照方法.这就是问题所在的地方,因为RFID侦听方法是在GUI线程的单独线程中运行的,因为它是无限的,而循环. 用于拍摄图片的类以图片框控件为其构造函数的参数,该构造器是在主线程中创建的,我认为这是问题的位置. 应用程序的每个部分都可以单独工作正常,但是当我尝试调用该方法以从侦听器线程中拍摄照片时,所有地狱都会松动,应用程序崩溃. 有人知道我如何调用从侦听器线程中初始线程(拍摄照片)中初始化的对象的方法? 我尝试了委托并调用,但由于我不想直接操纵控件而无法弄清楚,而是让对象在主线程中进行. 这是一些代码:
0 2024-04-14
编程技术问答社区
从网络摄像头拍摄照片 c#
我正在使用DirectShowlib将视频流到我的窗口表单.例如,当我按"保存"按钮时,我也想保存图像.如何使用DirectShowlib方法或Win32 API方法从网络摄像头获取图片? 解决方案 directshow.net样品在那里: 样品\ vmr9 \ vmr9snapper ---------------------------------------------------------------------------------------------------------------- 该示例显示了如何捕获VMR9的位图. 与其他渲染器一起使用可能需要修改小型代码. 这个问题还在MSDN论坛和CodeProject上进行了多次讨论.
0 2024-04-14
编程技术问答社区
如何使用directshow在多个显示器上同步播放多个视频?
我已经成功地使用了一个带有多个流的视频窗口来使用DirectShowlib进行C#进行同步播放多达8个视频.问题是视频窗口仅在单个屏幕上播放 - 当我尝试将其跨越许多屏幕上时,它不起作用.应用窗口跨越正确,但是视频仅在一个屏幕上播放.有什么想法吗? 预先感谢. 解决方案 我假设您正在使用多个输入引脚的VMR. VMR将渲染到一个表面,该表面需要在一个显示上.您应该能够将流渲染到多个VMR,每个VMR都放在最大化窗口中的单独显示上. 听起来好像您在一个图中都有所有流.您可以将它们分为不同的图形,每个图具有一个源和一个渲染器.在同步中启动图表意味着使用imediafilter :: run而不是imediacontrol :: run: 选择一个图形作为主. 确保主有时钟.这通常是在活动时完成的,但是您可以通过在图表上调用setDefaultsyncsource来强迫它发生. 查询IMediaFilter的图形,使用getSyncsource从主图中获取时钟,然
0 2024-04-13
编程技术问答社区
Directshow过滤器访问线程
我使用DirectShowlib-2005在C#中制作了电视播放器. 现在,我制作了一种搜索可用频道的方法. 我希望此方法在其他线程中运行,以便我的GUI不会冻结,但是当我尝试在方法中设置通道时,我会遇到错误.它在我的图中找不到IAMTVTUNER界面,我知道它在那里. 如果我不使用其他线程,该方法可以正常工作(但是我的GUI冻结了一段时间) 我知道它必须使用公寓做点事 解决方案 这个问题是因为应该从中访问DirectShowLib中的某些com类或接口,就像它在上创建的线程相同. 因此,解决此问题的解决方案是实施 例如,如果您需要在多线程模式下使用DirectshowLib中内部使用某些类或方法的类中的类方法,则必须检查使用InvokeRequired是否需要调用是否需要必须通过Invoke方法访问它. 为了演示如何实现ISynchronizeInvoke接口,这里是我以前在C#2.0 中开发的代码的摘要 public abstract class Medi
0 2024-04-13
编程技术问答社区
如何在C#中从一个图片目录中创建一个视频?
我有一个位图的目录,这些目录都是相同的维度.我想将这些位图转换为视频文件.我不在乎视频文件(编解码器)是WMV还是AVI.我唯一的要求是我指定帧速率.这不需要是跨平台,Windows(Vista和XP).我已经阅读了有关使用Windows Media SDK或DirectShow的一些内容,但它们都没有明确提供代码示例. 任何人都可以提供一些见识或一些宝贵的资源,可以帮助我在C#? 中做到这一点. 解决方案 冒着投票的风险,我会提供可能的替代选择 - 缓冲的位图动画. double framesPerSecond; Bitmap[] imagesToDisplay; // add the desired bitmaps to this array Timer playbackTimer; int currentImageIndex; PictureBox displayArea; (...) currentImageIndex = 0; playbackT
0 2024-04-12
编程技术问答社区
C# + DirectShow.NET = 简单的WebCam访问?
我找到了一个示例用于访问C#中的网络摄像头.该示例使用我想访问每个帧并将其放入位图对象中.我该如何确定何时到达新框架?如何将此新框架捕获到位图对象中? 如果您知道directshow.net的方式,这可能很容易回答. 解决方案 您需要使用接口在网上有许多有关如何使用它的C ++示例,它将为您提供RGB RAW格式的数据,您可以将其输入bitmap类. 还有一个开源库,称为其他解决方案 请务必查看这篇文章 - httpp ://www.codeproject.com/articles/125478/versatile-webcam-c-library ;它基于无触摸的网络摄像头捕获组件(但没有来自无触摸SDK的其他部分). 其他解决方案 如果您发现无触摸有用,但是想使用最新的DirectX SDK,请尝试在更改31008之后获得最新的源,at http://touchless.codeplex.com/sourcecontrol/listdownloadabl
0 2024-04-11
编程技术问答社区
作为字节流的虚拟网络摄像头输入
我没有网络摄像头.而且我想实现虚拟网络摄像头(或假设备驱动程序),该网络摄像头可以作为普通网络摄像头(虚拟网络摄像头)工作,并将内存流或字节作为输入.我该如何发展? DirectShow对此有帮助吗?我什么都不知道.请帮助 我发现有许多软件以视频文件为输入,但我想将字节流作为输入. 解决方案 您去这里: DirectShow source filter使用dekstop window作为源 /li> 编写直接表演源过滤器 从一堆生成视频的方式图像? 编写一个虚拟网络摄像头? in C ++ 虚拟摄像头驱动程序 更多在MSDN论坛上: 如果您喜欢跳过编程并仅安装碰巧没有可用的虚拟摄像机,则可以安装虚拟直接摄像机由放在互联网上的IP摄像头后支持,然后继续您的DirectShow体验.
0 2024-04-10
编程技术问答社区
Directshow视频捕获过滤器IAMBufferNegotiation::GetAllocatorProperties返回E_FAIL
我正在尝试检查音频/视频捕获过滤器的分配属性.我使用IAMBufferNegotiation::GetAllocatorProperties,并连接捕获过滤器的输出引脚.它可以与音频捕获过滤器一起使用,但不能使用视频捕获过滤器. 使用音频捕获过滤器: hresult:s_ok CBUFFERS:4 cbbuffer:88200 cbalign:1 cbprefix:0 带有视频捕获过滤器: HRESULT:E_FAIL(0x80004005),该文档未指定.他们说可能的值是:s_ok,e_pointer,vfw_e_not_connected(那为什么呢?为什么我可以获取视频捕获过滤器的IAMBufferNegotiation接口,甚至可以成功调用SuggestAllocatorProperties(返回S_OK),但会失败,而GetAllocatorProperties? 解决方案 使用音频,此接口用于将首选项应用于音频缓冲,在视频框架大小的情况下,请通
0 2024-04-09
编程技术问答社区
从ISampleGrabberCB更新一个文本框
我当前有一个工作程序,该程序显示了我网络摄像头的预览并使用IsampleGrabbercb接口. 使用SampleCB我的程序将图像转换为位图,然后处理条形码的图像,然后将其解码.当我使用MessageBox显示结果时,这很好地工作了,但是当我希望在主表单上编辑此结果时,我在启动程序时会遇到一些错误. 我正在尝试使用ISampleGrabberCB接口中的以下代码更新文本框: public int SampleCB(double sampletime, IMediaSample sample) { if (sample == null) { return -1; } try { int length = sample.GetActualDataLength(); IntPtr buffer;
2 2024-03-31
编程技术问答社区
像素修改代码在主程序中运行很快,在Delphi 6 DirectShow过滤器中非常慢,还有其他问题
我有一个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像素. 我看不到可见
0 2024-03-31
编程技术问答社区
DirectShow-获取视频帧
我正在创建一个Windows视频捕获应用程序,并且正在使用DirectShow进行捕获.随着每个帧的进来,我想将其作为RAW RGB位图捕获到缓冲区中,这时我的代码将执行我需要的任何处理. 我一直在寻找与我想做的类似的样品,无论我在网上查找的地方,人们都建议使用 imediadet 和/或 iSampleGrabber 接口进行frage-by-frame捕获.不幸的是,两者都被弃用,甚至不在Windows SDK的最新版本中. 在DirectShow中进行逐帧捕获的最佳(现代)方法是什么?如果没有,我应该使用的库是否会给我逐帧捕获吗? 解决方案 Sample Grabber几年前被弃用,这是直接节开发实际停止的几年.也就是说,在您阅读时使用Sample Grabber,并且它将对您有用. 您唯一需要的是复制定义在您的源代码上,请参阅详细信息: li>
0 2024-03-31
编程技术问答社区
如何在C++中把yuy2转换为BITMAP
我正在使用安全摄像机DLL从相机中重新删除图像. dll称我的程序的函数将图像缓冲区作为参数传递,但图像以YUY2格式.我需要将此缓冲区转换为RGB,但是我尝试了在互联网上发现的每个公式,但没有成功.我尝试的每个示例(包括 http://msdn. microsoft.com/en-us/library/aa904813(vs.80).aspx#yuvformats_2 )给了我错误的颜色. 我只能使用像素的Y组件将缓冲区转换为BW图像,但是我确实需要颜色图片.我调试(仅组装)在屏幕上显示图像的DLL,并使用DirectDraw来执行此操作. 解决方案 使用 Microsoft "> Microsoft "> Microsoft "> Microsoft "> microsoft "> microsoft,链接在问题中: for (int i = 0; i
0 2024-03-31
编程技术问答社区
如何用DirectShow捕获RGB的实时摄像机帧
我正在通过DirectShow实施实时视频捕获,以进行实时处理和显示. (增强现实应用程序). 我可以很容易地访问像素,但是看来我无法让SampleGrabber提供RGB数据.设备(ISIGHT-在VMware中运行VC ++ Express)仅报告MediaSubType_yuy2. 经过大量的谷歌搜索,我仍然无法弄清楚直接投资是否应该为这种事情提供内置的色彩空间转换.一些网站报告说,内置没有YUV RGB转换,其他人报告您只需要使用RGB子类型在IsampleGrabber上调用SetMediatype. 任何建议都非常感谢,我对此很生气.下面提供的代码.请注意 代码有效,除了它不提供RGB数据 我知道我可以实现自己的转换过滤器,但这是不可行的,因为我必须预料到所有可能的设备格式,这是一个相对较小的项目 // Playback IGraphBuilder *pGraphBuilder = NULL; ICaptureGraphBuilder2 *
0 2024-03-19
编程技术问答社区
在我的DirectShow过滤器的渲染过程中,尽管输出文件是 "平滑的",但却出现了卡顿。
我使用DSPACK组件库在Delphi 6中编写了一个直接保险应用程序.我有两个相互配合的过滤图. primary 过滤图具有此结构: 带有100 ms缓冲尺寸的捕获过滤器. (连接到)样品抓滤器. "辅助"过滤图具有此结构. 自定义推动源过滤器,该过滤器直接接受音频到IT管理的音频缓冲区. (连接到)渲染过滤器. 推源过滤器使用事件来控制音频的传递.它的fillbuffer()命令在事件上等待.当将新的音频数据添加到缓冲区中时,该事件会发出信号. 运行过滤器图时,我会在音频中听到微小的"间隙".通常,我将这种情况与不正确构建的音频缓冲区相关联,这些音频缓冲区未填充或存在"差距".但是,作为测试,我添加了一个Tee滤波器,并连接了一个WAV DEST滤波器,然后是文件编写过滤器.当我检查输出WAV文件时,它是完全平滑且连续的.换句话说,我从说话者那里听到的差距在输出文件中并不明显. 这将表明,尽管捕获过滤器中的音频成功地传播了,但是音频缓冲区
0 2024-03-19
编程技术问答社区
记录直接显示音频设备到文件
我已经偶然发现了一些代码来枚举我的麦克风设备(带有一些帮助),并且能够从每个设备中获取"友好名称"和" CLSID"信息. 我已经对graphed.exe进行了一些修补,以弄清楚我如何从DirectShow中获取音频并将其写入文件(我目前不关心格式,WAV应该很好),并且可以't似乎找到了正确的组合. 我读过的一篇文章之一链接到此Windows SDK示例,但是当我检查代码时,我最终对如何使用该代码,即感到非常困惑.设置输出文件,或指定要使用的音频捕获设备. 我还遇到了 Codeguru文章它的音频录音机很好,但是它没有选择音频设备的界面,我似乎无法要查找静态选择要使用的录制设备的位置. 我认为我最有兴趣弄清楚如何使用Windows SDK样本,但是对这两种方法中的任何一种说明都很棒. 编辑:我应该提到我作为Win32 COM程序员的知识和能力在规模上非常低,因此,如果这很容易,请像我五岁那样向我解释一下. 解决方案 将音频记录到文件中需要直接归档,
0 2024-03-19
编程技术问答社区
Directshow RenderStream "该参数不正确"
我正在尝试遵循Windows Dev Center上的DirectShow示例,以制作我自己的应用程序,可以捕获屏幕和音频到视频:将视频捕获到AVI文件 下面的代码运行时,它会在第一个RenderStream调用中失败,并带有错误: + errmsg 0x09910db8"参数不正确." wchar_t* 有人有任何线索如何找出哪个参数不正确? void AudioVideoBuilder::AVBuilder::MakeVideo() { IGraphBuilder *pGraph = NULL; ICaptureGraphBuilder2 *pBuild = NULL; // Create the Filter Graph Manager. HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBu
0 2024-03-19
编程技术问答社区
从DirectShow中从麦克风接收到的原始数据中获取响度等级
我如何从直接节目中的麦克风收到的原始数据获得响度水平? imediasample将数据保存在字节中.以及我如何阅读此字节并得到一些东西? 解决方案 响度是一种听觉质量,而不是物理公式.有很多定义. 这也是一个时间值.结果,此值在此期间发生变化. 我记得几年前见过的最简单的实现,只是在振幅的最大值上放了一段时间.但是振幅的对数肯定是更好地近似耳朵灵敏度. 您也可以考虑信号的功能(信号 *信号...但是还有更多的定义考虑了频谱组件...). 是厨房食谱.选择最简单的. 编辑:看来我的答案太快又模糊,我可能会误认为音量和响度. 这篇Wikipedia文章指出有衡量响度的单位. sone 和 phon . 其他解决方案 您需要处理数据以从原始字节中计算出响度.其中一种方法是在 bs.1770:算法中测量音频程序的算法响度和真实的音频级别规范并描述了所涉及的算法.
2 2024-03-19
编程技术问答社区
ffmpeg音频帧来自directshow sampleCB imediasample
我使用IsampleGrabber samplecb回调获取音频示例,我可以从imediasample获得缓冲区和缓冲长度,并且我使用avcodec_fill_audio_frame(frame,ost-> enc-> ency-> chinderels,ost-> cannelels,ost-> ency-> ency-> exp-> sample_fmt,(uint8_t *)buffer, ,长度,0)制作一个AvFrame,但是此框架在我的MUX文件中没有发出任何音频!我认为长度比frame_size小. 每个人都可以帮我吗?或给我一些例子,如果可能的话. 谢谢你 这是我的SampleCB代码: HRESULT AudioSampleGrabberCallBack::SampleCB(double Time, IMediaSample*pSample){ BYTE *pBuffer; pSample->GetPointe
4 2024-03-19
编程技术问答社区