Tag: ms media foundation

如何在c#中从网络摄像头抓取恒定的位图图像流

我们有ac#应用程序,可以对video流进行处理。 这是一个以Bitmap格式接收每个帧的低级应用程序,所以基本上我们每秒需要25个图像。 此应用程序已经适用于我们的一些媒体源,但我们现在需要添加网络摄像头作为输入设备。 因此,我们基本上需要连续捕获网络摄像头中的位图图像,以便我们可以将所有这些帧作为“流”传递给我们的应用程序。 访问网络摄像头的最佳和最简单的方法是什么?直接从网络摄像头读取实际帧作为单独的图像? 我还在起跑线上。 有许多库允许人们访问网络摄像头,在Windows面板上预览网络摄像头的内容,然后使用屏幕捕获再次捕获此图像。 不幸的是,当每秒捕获25帧时,这不会给我们提供必要的性能。 IVMRWindowlessControl9 :: GetCurrentImage已被提及作为另一种选择,但这似乎再次针对的是一个不常见的快照,而不是一个恒定的图像流。 Directshow.Net被许多人称为一个很好的候选人,但目前还不清楚如何简单地从网络摄像头抓取图像。 此外,许多消息来源表示担心微软不再支持Directshow。 此外,我已经看到的实现需要ImageGrabber,显然也不再支持 。 MS的新替代品似乎是媒体基金会,但我的研究还没有找到任何可以实现的实例(我不确定这是否会在旧版本的Windows上运行,如XP)。 DirectX.Capture是一个很棒的库( 参见一个很好的实现 ),但似乎缺乏直接获取video图像的filter和方法。 我也开始研究滤镜和滤镜图,但这看起来非常复杂,感觉有点像“重新发明轮子”。 总的来说,上面简要提到的所有解决方案似乎都相当陈旧。 有人可以指点我一步一步的指导,让网络摄像头在C#中工作,并从中每秒抓取几张图像? (我们还必须在某些时候做音频,因此不排除video的解决方案将是最有帮助的)。

为什么MediaElement有时会无声地失败,我该如何纠正呢?

在我的WPF项目中,我创建了一个包含多个MediaElements播放video的视图。 有时,在一个或所有MediaElements之间的任何地方都无法播放分配给它们的video,而是显示黑色矩形,或根本不显示。 发生这种情况时,不会发生MediaFailed事件。 即使不播放video,MediaOpened事件也会在所有MediaElements上出现。 我已经为我的显卡安装了最新的驱动程序,这对此问题没有任何影响。 是否有一个程序可以用来确保每个MediaElement一直播放? 示例源代码如下。 包含video文件的完整示例项目位于github, url为https://github.com/duggulous/MediaElementIssueExample MainWindow.xaml MainWindow.xaml.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace VideoDemo { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window […]

MF SinkWriter写入示例失败

我正在尝试使用MediaFoundation将ID3D11Texture2D编码为mp4。 以下是我目前的代码。 初始化Sink Writer private int InitializeSinkWriter(String outputFile, int videoWidth, int videoHeight) { IMFMediaType mediaTypeIn = null; IMFMediaType mediaTypeOut = null; IMFAttributes attributes = null; int hr = 0; if (Succeeded(hr)) hr = (int)MFExtern.MFCreateAttributes(out attributes, 1); if (Succeeded(hr)) hr = (int)attributes.SetUINT32(MFAttributesClsid.MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 1); if (Succeeded(hr)) hr = (int)attributes.SetUINT32(MFAttributesClsid.MF_LOW_LATENCY, 1); // Create the sink writer if (Succeeded(hr)) […]

将AAC转换为WAV

我已经在使用Media Foundation API(感谢MFManagedEncode, http://blogs.msdn.com/b/mf/archive/2010/02/18/mfmanagedencode.aspx )将wav转换为aac。 我还没有完全了解它是如何工作的,但它确实有效 – 谢天谢地。 现在我发现很难以其他方式进行转码,即使它有一个MF编解码器(AAC解码器)。 我找不到如何使用这个的例子,我发现它的MSDN文档至少可以说是含糊不清的; 谁有运气呢? AC#wrapper for是理想的。 TIA。

当将H.264帧复用到MP4时,Media Foundation IMFSinkWriter :: Finalize()方法在Windows 7下失败

我正在用C#编写一个工具,将H.264帧复用到MP4文件中,我正在使用Media Foundation的带有接收器编写器的媒体接收器来完成这项工作。 在Win8下,事情运行良好,但在Windows 7下,同样的代码在调用接收器编写器的Finalize方法时引发exception,HResult:0xC00D36E6(MF_E_ATTRIBUTENOTFOUND)。 结果,生成的MP4文件未正确关闭,并且(当然)不可播放。 mftrace日志显示Windows 7下的故障发生在IMFSinkWriter :: PlaceMarker内部调用之后(或期间)。 在Windows 8下,日志中的相应行后面紧跟着“Finalized”语句。 以下是muxing代码的示例,后面是mftrace日志: // pFrames contains the H264 frames as binaries public void Mux(List pFrames) { // Start Media Foundation: MFHelper.MFStartup(); // Calculate average frame duration, in HNS, given a 10fps input: double duration = (1 / 10F) * 10000000; _frameDuration = (ulong)duration; // Set up […]