问题标签 [directshow]

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.

0 投票
2 回答
1108 浏览

c++ - DirectShow 的 eof 检测

有没有办法检测 DirectShow filtergraph 已经到达其文件的末尾?在其文件末尾,我的意思是带有 SampleGrabber 过滤器的过滤器图将永远不会收到另一个 SampleCB 调用。

以下是一些不起作用的事情:

  • 信任IMediaDet::get_StreamLength(通常说视频中的帧数比实际存在的帧数多)
  • 信任IMediaSeeking::GetDuration(与IMediaDet一致,+/-一帧)
  • 使用IMediaControl::GetState(即使文件中的所有帧都已处理完毕,过滤器图仍会运行)

背景:

我正在做视频处理,我有一个类可以用 SampleGrabber 创建一个过滤器图。每当SampleGrabber::SampleCB被调用时,我都会用互斥锁阻止它,这样我就可以在拉模式下运行过滤器图。当我准备好另一帧时,我在我的主线程中取消阻塞互斥锁并等待SampleGrabber::SampleCB向我发送它已完成的信号。对于某些视频,IMediaDet::get_StreamLength告诉我视频的帧数比实际存在的帧数多。一旦我提取了最后一帧并请求比实际存在的帧多一个,主线程就会永远阻塞,因为SampleGrabber::SampleCB永远不会再被调用。我希望能够检测到SampleGrabber::SampleCB永远不会调用文件源。像 Windows Media Player 这样的应用程序能够以某种方式做到这一点,因为 GUI 报告视频在最后一个真实帧之后结束,所以显然有一种方法可以做到这一点。

编辑:

WaitForSingleObject用来实现主线程阻塞。到目前为止,我一直在使用的解决方法是按照 Greg 的建议:有一个有限的超时。不幸的是,这有点棘手。等待失败的原因有很多,例如真正的 eof、慢速网络文件系统、丢失网络连接、慢速解码器等。

0 投票
5 回答
1968 浏览

c# - 使用指针跨进程传递纹理

很难把它放在标题中,所以让我解释一下。

我有一个应用程序,它使用 Direct3D 显示一些网格并使用 directshow(vmr9 + allocator) 播放一些视频,然后将视频帧作为纹理发送到 Direct3D 部分以应用于网格。该应用程序需要 24/7 全天候运行。至少允许每 24 小时重新启动一次,但不会比这更频繁。

现在的问题是,由于编解码器、视频驱动程序或视频文件本身,directshow 在播放几个小时后似乎出现了问题。此时应用程序只是拒绝播放视频。但是 Direct3D 部分仍然运行良好,网格仍然显示。重新启动应用程序后,一切恢复正常。

所以,我正在考虑将 2 个部分分成 2 个不同的过程。因此,当视频进程无法播放视频时,至少我可以立即重新启动它,而不会丢失 Direct3D 部分。

所以这里出现了实际的问题,是否可以通过传递指针将纹理从视频播放器传递到 direct3d 进程,也就是从指针中检索另一个进程的纹理?由于受保护的内存寻址,我最初的猜测是不可能的。

我在两个进程上都设置了 TCP 通信,此时我们不必担心指针的通信。

这可能是一个疯狂的想法,但它会创造奇迹

0 投票
1 回答
2378 浏览

c++ - 适用于 Windows Mobile 的 DirectShow、视频缩放和图像捕捉

我目前正在开发一个用于实时视频流 (www.livecliq.net) 的应用程序,并且我想添加用于图像捕获和视频缩放的功能。我一直在寻找有关 DirectShow 的教程和资源,但到目前为止,我只找到了一本书“为数字视频和电视编程 Microsoft DirectShow”,它对高级视频处理没有多大帮助。

有谁知道这是否可能以及如何对捕获的视频应用数字变焦以及如何使用设备相机拍摄照片?

谢谢!

0 投票
1 回答
1773 浏览

c++ - 使用 DirectShow 将字幕文件与 MPEG 视频进行帧精确同步

这是我一直在处理的一个问题,并且无法得到一个好的答案(甚至来自微软)。我正在使用通用转储过滤器将硬件压缩的 MPEG 文件写入磁盘。在图中,我还有一个 SampleGrabber 过滤器,它在每一帧都被调用。从 SampleGrabber 回调中,我得到一个字幕以及 DirectShow 时间戳,并将它们写入 SAMI (.smi) 字幕文件。这一切似乎都在工作,因为 SAMI 文件包含每一帧的正确字幕。但是,我有几个问题:

  1. 前几个(通常是 3 或 4 个)DirectShow 时间戳都是 0。如果我从 SampleGrabber 获得回调,这些时间戳不应该递增吗?

  2. 当我开始播放时,显示的第一个时间戳是 SAMI 文件中大约 10-20 个字幕。我假设第一帧将显示文件中的第一个时间戳。

  3. 这可能与#2有关,但字幕未同步到文件中的相应帧。它们有时可能会迟到 40 帧。

我通过 C++ 使用 DirectShow,在 Windows XP SP3 下使用 Hauppauge HVR-1800 捕获(最新驱动程序 09/08/2008),并在 Media Player Classic 6.4.9.0 下播放。欢迎任何想法。

0 投票
3 回答
11734 浏览

c# - 如何多播使用 DirectShow 捕获的流?

我需要构建一个非常简单的流服务器。它需要能够从设备捕获视频,然后通过多播将该视频流式传输到 LAN 上的多个客户端。

由于有人用 DirectShow.Net ( http://www.codeproject.com/KB/directx/directxcapture.aspx )编写的库,这部分的捕获非常容易(在 C# 中)。

我现在的问题是如何多播这个?这是我坚持的部分。我不确定下一步该做什么,或采取什么步骤。

0 投票
1 回答
1796 浏览

c++ - 使用 IAMCameraControl::Set() 在 Windows Mobile 设备上设置缩放

我正在开发一个视频捕捉应用程序,我想实现缩放功能。

使用 DirectShow 我遇到了 IAMCameraControlInterface。它有一个方法::Set(),应该用于设置几个相机参数。

但是我玩了,我什么也做不了。然后我尝试调用 ::GetRange() 方法,该方法应该返回可能的参数值的范围,但它没有返回任何内容。

该设备真的有可能不支持任何选项吗?看起来很奇怪,因为原生相机应用程序支持缩放,但我真的不知道这种奇怪结果的主要问题在哪里。

有没有人有类似应用的经验?有谁知道这里可能出了什么问题或如何有效地使用IAMCameraControlInterface函数?

0 投票
3 回答
2763 浏览

.net - .NET 应用程序中可预测帧捕获的选项

我在 C# 中工作,需要捕获视频文件的各个帧。尽可能快(比实时更快),我希望寻找特定的帧号并将每第 n 帧捕获为图形文件格式,例如 BMP 或 JPEG。非常希望捕获的帧是可预测和可重复的,即不丢帧。

我对 DirectShow 有一些经验,但不知道这种技术是否最适合在现代 Windows .NET 环境中解决这个问题。理想情况下,我想找到一个 .NET 或基于 COM 的库来尽可能地抽象出来。我不需要在屏幕上实际显示视频文件,实际上我更希望没有用于视频播放的 Windows 用户界面。

有人对要研究的技术或特定产品有建议吗?它们需要与基于 MPEG-2 和 MPEG-4 的视频文件兼容,包括 DivX。QuickTime 支持将是一个不错的奖励。

0 投票
1 回答
4123 浏览

c++ - DirectShow - 如何用文本覆盖视频

我正在为 Windows Mobile 编写一个应用程序,我想在屏幕上的视频预览上显示一些文本。

有谁知道如何做到这一点,或者是否有任何关于它的好教程?

谢谢!

0 投票
1 回答
3885 浏览

c# - 使用 C# 在托管 DirectX 中在视频上绘制文本

如何使用 C# 在托管 DirectX 中通过视频绘制文本?

0 投票
1 回答
2272 浏览

c# - DirectShow:图形在 GraphEdit 中工作,而不是在代码中

我在 GraphEdit 中构建了以下图表:Logitech Webcam -> Infinite Tee Pin Filter -> VideoRenderer。这很好用(GraphEdit 会在 TEe 过滤器和 VideoRenderer 过滤器之间自动插入一些中间过滤器)。

我尝试在代码中做同样的事情,但在尝试将 Tee 过滤器连接到 VideoRenderer 时失败。我首先将网络摄像头连接到 tee 过滤器,它可以工作(网络摄像头打开并且我得到 S_OK),然后我尝试将 tee 过滤器的单个输出引脚连接到第一个,但失败了(错误是它可以找不到一组中间过滤器来连接它们)。我尝试将它们与 IGraphBuilder::Connect 以及 ICaptureGraphBuilder2::RenderStream 连接起来,效果相同。要枚举引脚,我使用 hr = _CaptureGraphBuilder.FindPin(theFilter, PinDirection.Input, null, null, true, 0, out thePin); 对于视频渲染器,除了 PinDirection.Output 用于 Tee 过滤器(这是在 C# 中,但构造完全映射到 C++)之外,其他相同。

有任何想法吗?