问题标签 [dspack]
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.
delphi - 我的 DirectShow 过滤器在通话期间使 Skype 5.x 崩溃。在 4.x、Graph Edit 和其他程序中运行良好
我有一个使用 DSPACK 组件库用 Delphi 6 编写的 DirectShow 推送源视频过滤器。只要使用过滤器的 Skype 客户端不是5.x 或更新版本,过滤器就可以在 Skype 通话期间正常运行。在 5.x 中,Skype 客户端变得非常缓慢,直到它挂起,然后我得到了各种严重的崩溃,包括数据执行保护警告和典型的 Microsoft“这个程序已经崩溃”对话框。有时它会立即崩溃,有时它会在通话大约 30 秒或更长时间后崩溃。
我还可以在以下情况下运行视频过滤器而不会出错:
- 在视频过滤器预览窗口中使用 Skype 5.x,您在选择要与 Skype 一起使用的视频设备时看到该窗口(不是在通话中,而是在视频选项选择对话框页面上)。
- Skype 4.x 客户端(在通话中完美运行)
- 图表编辑
- 一个 DSPACK TVideoWindow 实例
- 使用网络摄像头源的其他程序
我在网上做了一些研究,确实发现了很多关于 Skype 5.x 和崩溃的投诉。我阅读的主题建议下载 5.7 beta。我试过了,但没有帮助。它运行得更好一些,但仍然崩溃。
作为一个简单的测试,我改变了我的 FillBuffer() 方法,只提供一个我在启动时加载的静态位图,而不是我通常中继到 Skype 的外部视频流。它仍然崩溃。此外,我什至尝试运行设置了 FastMM4 的推送源过滤器 DLL,以对每个 FillBuffer() 调用和将媒体样本传递到下游引脚的调用进行全内存扫描。没有任何错误。
由于 Skype 显然可以与其他网络摄像头驱动程序一起使用,否则会在网络上引起强烈抗议,我的过滤器可能会做什么它不喜欢的事情?
更新:经过进一步测试,我遇到了一些奇怪的事情。最初,我的过滤器中的 GetMediaType() 调用有 4 种格式。我将其降低为 1 种格式:24 位,压缩设置为 BI_RGB,因为这是我从外部接收然后传递给 Skype 的。登录后,我立即开始从 Skype 快速失败,它是 DirectShow 过滤器扫描,并且失败发生在我的 GetStreamCaps() 调用期间。由于 Skype 有反调试代码,我煞费苦心地将跟踪消息添加到每行之后的 GetStreamCaps() 调用中,并发现它发生在我第一次尝试访问它的媒体格式变量时(见下文)。看来我无法访问 Skype 传递给我的 DirectShow 过滤器的内存区域。为什么只提供 1 种媒体格式而不是之前的 4 种格式会使故障发生得更快是未知数。
这纯粹是我的猜测,但是否有可能在 Skype 和我的过滤器之间发生某种奇怪的内存区域访问权限错误?事实上,在我开始通话之前,Skype 偶尔会报告数据执行保护错误,以及其他一般崩溃,这让我想知道是否发生了一些奇怪的事情。当您尝试写入标记为代码块的区域时,会发生 DEP 错误。就好像 Skype 传递给我的指针指向某个我无法写入的陌生或受保护的地方。
概括地说,现在每次 Skype 在调用 GetStreamCaps() 时访问我的 DirectShow 过滤器时,在我开始呼叫之前,或者我什至能够访问视频设备选择屏幕之前,错误都会发生 100%。这是相关的代码片段:
更新 2:我的代码有问题,但我不知道是什么。Graph Edit 不像 Skype 那样调用 GetStreamCaps()。我添加了更多跟踪语句,结果发现在上面的代码中,DSPACK CreateMediaType() 调用返回的媒体类型对象有一个 NIL pbFormat 字段,因此可以解释快速失败。如果有人知道我需要做什么才能获得正确配置的 pbFormat 字段,请告诉我。下面是 DSPACK 中执行 CreateMediaType() 操作的代码:
delphi - DSPack:如何将 PushSource 连接到 videocap?
我想使用PushSource
过滤器来捕获,但我需要将它“连接”到“videocap”样本。这个过滤器不是一个独立的过滤器,所以它不能被枚举为捕获设备,我也不希望它像那样转换
delphi - dspack、pushsource怎么用呢?
我看到了一些主题,例如如何使用/安装自定义 Directshow 过滤器来注册过滤器,但没有代码如何使用它。任何人都可以展示如何实际使用该过滤器(pushsource、pushdesktop)保存到 AVI 中的示例吗?
delphi - 如何使用 Delphi/DSPack 捕获帧而不在 TVideoWindow 上显示?
DSpack 有示例代码来播放兼容 DirectShow 的视频设备并同时捕获视频帧。TVideoWindow 附加到 FilterGraph 以显示视频 (Firgure-1)。如果您删除 TVideoWindow,那么操作系统 (Windows) 将自动调出 ActiveMovie 并在单独的窗口中显示视频(图 2)。
有没有办法使用 DSPack 在不使用任何 GUI 组件且不显示视频的情况下捕获视频帧?
DSPack 论坛有一些关于 NullRenderer 过滤器的提及,但没有关于如何使用它的文档或示例。看起来我们可以通过直接在 GraphEdit 中手动将 Video Renderer 替换为 Null Render 来实现(图 3)。
我们如何通过在代码中进行所有操作来获得图 3 所示的结果?DSPack 没有解释如何创建 Null Renderer。
这就是我最终做的(到目前为止)
ReassignSampleGrabberOutput
之前调用以下filterGraph.Play;
delphi - 如何在不使用 TSysDevEnum.GetMoniker 的情况下使用已知的视频捕获源初始化 TFilter?
是否可以在不使用 TSysDevEnum.GetMoniker(...) 的情况下创建/初始化具有已知视频捕获源的 TFilter 对象?
Video Capture Source 的名称和其他详细信息是已知的,可以通过 GraphEdit Filter Browser 获取。目的是加快 TFilter 的初始化并以编程方式将其附加到 FilterGraph。
delphi - 如何通过 DsPack 组件从视频文件中获取帧位图?
是否可以通过 DsPack 组件从视频文件中获取位图?
在这种情况下,我正在使用此代码;但它不能截图图像:
是否可以修复此代码?
delphi - 如何在调整 DSPack TVideoWindow 的大小时防止黑色背景
在播放视频时调整窗口大小时有没有办法防止黑色背景?
我尝试将 TVideoWindow.Color 和 TVideoWindow.Canvas.Color 设置为白色,但每次调整窗口大小时,都会在调整大小操作期间出现黑色背景。
当加载新视频时,这也会在短暂的瞬间发生。
delphi - 如何使用 DSPack 循环播放视频?
我有一个非常简单的程序,它使用 Delphi 2010 中的 DSPack。我有一个带有 TFilterGraph 和 TVideoWindow 的表单。视频播放和渲染很好。我似乎无法弄清楚如何让视频在结束时循环回到开头。
如何使用 DSPack 使视频自动循环播放?
代码
DFM
delphi - 如何使用 DSPack 从 MemoryStream 渲染视频?
我可以在 Delphi 2010 中使用 TFilterGraph 和 TVideoWindow 从文件系统渲染视频。我想从 MemoryStream 渲染视频,而不是直接从文件系统渲染视频。这是概念:
- 将视频存储在数据库 blob 字段中。
- 将 blob(视频)读入 MemoryStream。
- 使用 DSPack 渲染 blob(视频)。
如何告诉 FilterGraph 使用 MemoryStream 而不是文件?
delphi - 使用 DSpack 和 Delphi7 确定视频文件属性
我想确定视频文件(例如 MP4)的各种属性,例如视频的长度等,但我没有使用多媒体的经验谁能帮忙
谢谢
麦克风