标签: ms-media-foundation

使用Windows媒体基础

好的,我的新演出是高性能视频(想想谷歌街景而不是电影) - 辛勤工作是所有嵌入式捕捉和图像处理,但是:

我正在寻找新的MS视频产品来显示内容= Windows Media Foundation.

有人真的在用这个吗?

  • 没有关于这个主题的书籍.
  • 唯一的文档是开发人员团队博客,其中包含9个月前的单个条目.
  • 我以为我们已经过去不得不通过监视com控制消息来学习MS api!
  • 它只是围绕同一个旧的activeX控件的另一个包装器吗?

c++ windows video ms-media-foundation

7
推荐指数
2
解决办法
7973
查看次数

如何从Windows 8现代应用程序中的视频流中抓取帧?

我试图从mp4视频流中提取图像.看完后,似乎正确的方法是在C++中使用Media Foundations并打开框架/读取内容.

通过文档和示例的方式很少,但经过一些挖掘,似乎有些人通过将帧读入纹理并将该纹理的内容复制到记忆可读纹理(我甚至不是确定我在这里使用正确的条款).尝试我发现的虽然给了我错误,我可能做了一堆错误.

这是我尝试做的一小段代码(项目本身附在底部).

    ComPtr<ID3D11Texture2D> spTextureDst;
    MEDIA::ThrowIfFailed(
        m_spDX11SwapChain->GetBuffer(0, IID_PPV_ARGS(&spTextureDst))
        );

    auto rcNormalized = MFVideoNormalizedRect();
    rcNormalized.left = 0;
    rcNormalized.right = 1;
    rcNormalized.top = 0;
    rcNormalized.bottom = 1;
    MEDIA::ThrowIfFailed(
        m_spMediaEngine->TransferVideoFrame(m_spRenderTexture.Get(), &rcNormalized, &m_rcTarget, &m_bkgColor)
        );

    //copy the render target texture to the readable texture.
    m_spDX11DeviceContext->CopySubresourceRegion(m_spCopyTexture.Get(),0,0,0,0,m_spRenderTexture.Get(),0,NULL);
    m_spDX11DeviceContext->Flush();

    //Map the readable texture;                 
    D3D11_MAPPED_SUBRESOURCE mapped = {0};
    m_spDX11DeviceContext->Map(m_spCopyTexture.Get(),0,D3D11_MAP_READ,0,&mapped);
    void* buffer = ::CoTaskMemAlloc(600 * 400 * 3);
    memcpy(buffer, mapped.pData,600 * 400 * 3);
    //unmap so we can copy during next update.
    m_spDX11DeviceContext->Unmap(m_spCopyTexture.Get(),0);


    // and the present it …
Run Code Online (Sandbox Code Playgroud)

c++ windows-8 windows-runtime ms-media-foundation winrt-xaml

7
推荐指数
1
解决办法
5126
查看次数

如何使用SilverLight播放H264流?

我有一个H264流(IIS - 流畅的流),我想与SilverLight一起玩.显然SilverLight可以做到,但是怎么做?

注意:
SilverLight可以播放VC-1流,但不能播放H264.

此外,我可以提供流和所需的任何其他信息.H264编码器是Media Foundation(MFT)中的编码器.同样适用于VC-1(虽然不可能为平滑流创建相同的块,因为强制关键帧插入会导致视频不稳定.

编辑:H264的MPEG2VIDEOINFO值:

H264的MPEG2VIDEOINFO值

silverlight video-streaming h.264 smooth-streaming ms-media-foundation

7
推荐指数
1
解决办法
1510
查看次数

DXGI桌面复制:编码帧以通过网络发送它们

我正在尝试编写一个应用程序,它将捕获屏幕的视频流并将其发送到远程客户端.我发现在Windows上捕获屏幕的最佳方法是使用DXGI桌面复制API(从Windows 8开始提供).Microsoft提供了一个简洁的示例,它将重复的帧流式传输到屏幕上.现在,我一直想知道对这些帧进行编码并通过网络发送它们的最简单但又相对快速的方法是什么.

框架来自AcquireNextFrame包含桌面位图的表面和包含已更新的脏区域和移动区域的元数据.从这里,我有几个选择:

  1. 从DirectX表面提取位图,然后使用外部库(如ffmpeg)将一系列位图编码为H.264并通过RTSP发送.虽然直截了当,但我担心这种方法太慢,因为它没有利用任何本机Windows方法.将D3D纹理转换为ffmpeg兼容的位图似乎是不必要的工作.
  2. 从这个答案:将D3D纹理转换为IMFSample并使用MediaFoundation的SinkWriter对帧进行编码.我找到了这个视频编码教程,但我还没有找到一种方法来立即获取编码帧并发送它而不是将它们全部转储到视频文件中.

由于我之前没有做过这样的事,我问我是否朝着正确的方向前进.最后,我希望有一个简单的,最好是低延迟的桌面捕获视频流,我可以从远程设备查看.

另外,我想知道我是否可以使用桌面复制提供的脏区域和移动区域.我可以通过网络发送它们而不是对帧进行编码,并在客户端进行处理,但这意味着我的客户端必须具有DirectX 11.1或更高版本,如果我想要流式传输到移动平台,这是不可能的.

c++ ffmpeg video-streaming dxgi ms-media-foundation

7
推荐指数
1
解决办法
4305
查看次数

DirectShow,Media Foundation,DXVA,什么?

我的任务是修改一个使用DirectShow进行视频渲染的应用程序.旧的应用程序工作正常,但它开始显示年龄.

由于我有游戏背景,我想我应该这样做.在使用不同的技术制作了一堆原型之后,我非常确定我可以提取视频到纹理的渲染并使用DirectX来满足所有客户的请求.

但是,我现在已经到了必须选择一种技术的地步,我不能再迷失了......

  • DirectShow的
  • 媒体基金会
    • 媒体会话(<Windows 8)
    • 媒体引擎(> Windows 8)
  • DXVA1
  • DXVA2
  • DXVA-HD

DirectShow显然是最古老的,但仍然运行良好,也主要是因为可用的大量编解码器.

媒体基金会已经推出了Windows Vista,直到Windows 8还有一个名为"媒体会话"的东西,之后他们推出了"媒体引擎".如果我是正确的编解码器被称为MFT?实际上有哪些网站可以像free-codecs.com一样提供这些网站?

除了这两种技术之外,还有DXVA,它允许您将视频解码卸载到GPU.目前,我遇到了3种不同的类型.DXVA1是自XP以来一直存在的实现,DXVA2是更新的API.但什么是DXVA-HD?它比DXVA2更新还是同等名称?

我真的想转向媒体基金会,开箱即用的编解码器非常适合客户想要使用的格式.我所关心的是为它获取编解码器是多么容易...... Windows 8+默认媒体播放器是否仍然具有DirectShow和MF渲染路径并且可以即时交换它们还是微软完全逐步淘汰DirectShow?

我也无法完全理解DXVA应该如何工作.鉴于我想基本上在游戏中渲染视频,只有让所有渲染实际发生在GPU上并将应用程序逻辑保留在CPU上才有意义,但我真的找不到任何关于如何使用Media的好例子基础.这主要是因为我不知道DXVA2和DXVA-HD之间的区别.Windows 7 SDK附带了所有3个实现的示例......

如果有人能够以粗体回答我的问题,请纠正我的错误信息,并指出我正确的方向(DirectX + Media Foundation + DXVA-无论如何),我将非常感激!它可以像"结合Windows 7 SDK的这3个示例来获得您想要的"一样简单.

整个任务的目标是再次获得顶级形式的应用程序,我想绝对肯定我会选择像DirectShow已经拥有的下一个十年的技术:P

directx video directshow dxva ms-media-foundation

7
推荐指数
1
解决办法
1538
查看次数

与Nvidia相比,Intel H264硬件MFT性能较差

我正在尝试使用Windows10机器上的MediaFoundation H264硬件编码器将NV12样本编码为视频,并在LAN内实时传输和呈现它们。

最初,我在编码器处面临太多缓冲,因为编码器在提供输出样本之前最多缓冲25帧(GOP大小)。经过一些研究,我发现设置CODECAPI_AVLowLatencyMode可以减少延迟,但要花一些质量和带宽。

设置CODECAPI_AVLowLatencyMode属性有点改善了性能,但没有达到实时要求。现在看来,编码器至少在生成样本之前仍至少缓冲15帧(在输出中引入大约2秒钟的延迟)。并且仅当配置了低帧速率时,此行为才明显。在60FPS时,输出几乎是实时的,没有视觉上明显的延迟。

实际上,只有当帧频设置为低于30FPS时,人眼才能看到缓冲。并且,延迟与FPS配置成反比增加,在25FPS时,延迟在几百毫秒内,而当FPS配置为10(恒定速率)时,延迟增加到3秒。我猜想,将FPS设置为大于30(说60FPS)实际上会导致编码器缓冲区足够快地溢出,以产生明显延迟的采样。

但是问题是,如果需要,我希望FPS可以配置为低至10FPS(恒定速率),同时由于我的输入源是台式机并且仅在有台式机的情况下才产生样本,因此还具有实时流式传输的经验。屏幕内容有变化吗?

我的实验:

为了保持恒定的帧速率,并强制编码器产生实时输出,我以30FPS / 60FPS的恒定速率将相同的样本(以前保存的样本)馈送到编码器。我这样做的方式是,最多只能捕获10FPS(或任何所需的FPS),并通过以相同的三次或完全基于EMULATED_FRAME_RATE / ACTUAL_FRAME_RATE的比率(例如:30 / 10、60 / 15)提供相同的样本来伪造30 / 60FPS (例如60/20)以完全恒定的间隔填充空白。例如,如果10秒钟内没有任何变化,我将给编码器提供30 * 10次(30FPS)的相同样本。这将产生近乎实时的输出,但消耗的数据却比我预期的要多,即使我仅将先前保存的样本馈入编码器。

无论屏幕内容以30FPS还是0F​​PS更改,在Intel上,输出比特率似乎一直保持在350KBps至500KBps之间,而在NVidia GTX 1070(具有30FPS和500KB比特率配置)上,输出比特率一直在80KBps至400KBps之间变化。NVidia编码器似乎要好一些。

实际上,编码器消耗的带宽超过了上述带宽。通过设置更大的GOP大小(当前配置的GOP大小为16K),我已经能够减少NVidia机器上的数据消耗。但是,在具有“ 500KB比特率和30FPS”配置的NVidia GTX 1070上,数据消耗在Intel图形620硬件上大约保持300KBps,在NVidia GTX 1070上从50KBps到80KBps,输入样本之间几秒钟没有发生任何变化(我猜英特尔硬件不是完全遵守GOP设置,否则改进不明显)。

通过设置非常低的比特率,我还能够将Intel和Nvidia硬件上的数据消耗分别降低到100KBps和40KBps(当屏幕内容没有变化时),但这仍然是不可接受的,并且还会降低视频质量。

当样本之间没有变化时,是否可以将编码器配置为产生小于10KBps的输出?当没有变化但10KBps可以接受时,我实际上的目标是0KB输出。

更新: 我做了很多尝试。我想,无论是否发生了变化,NVidia编码器仍会产生某种额外的信息或其他信息,从而导致高数据消耗,但比英特尔好几个数量级。我完全不知道可能会有什么额外的数据。并且还认为Intel编码器根本不遵守GOP设置或不擅长压缩,我什至尝试将GOP在256到INT_MAX之间进行更改,似乎在Intel硬件上没有任何改变。

这是Microsoft网站(https://docs.microsoft.com/zh-cn/windows/win32/medfound/codecapi-avlowlatencymode)上的CODECAPI_AVLowLatencyMode的描述

“低延迟模式对于实时通信或实时捕获很有用,应将延迟最小化。但是,低延迟模式也可能会降低解码或编码质量。

由于编码过程中的帧重新排序,预计编码器不会增加任何采样延迟,并且一个输入采样将产生一个输出采样。只要没有在编码器中引入任何帧重新排序,就可以存在B条/帧。”

但是,这不能提供所描述的实时性能。

最近,我还尝试了CODECAPI_AVEncCommonRealTime属性(https://docs.microsoft.com/en-us/windows/win32/directshow/avenccommonrealtime-property)来检查它在降低输入帧速率以避免带宽消耗时是否提高了性能。 ,但该调用失败,并显示 “参数不正确”错误。

编码器配置:

参考:http//alax.info/blog/1586

const int EMULATED_FRAME_RATE = 30;//
const int TARGET_FPS = 10;
const int FPS_DENOMINATOR = 1;
const unsigned long long time_between_capture = 1000 / TARGET_FPS;
const unsigned long …
Run Code Online (Sandbox Code Playgroud)

c++ windows directx video-streaming ms-media-foundation

7
推荐指数
1
解决办法
146
查看次数

使用 C# 的媒体基础

媒体基础是微软推荐的技术,它确实有很多示例和解释支持它,但都是使用本机代码

我在sourceforge 中找到了一个包装器,使我能够将 Media Foundation 与 C# 一起使用,但是当我阅读人们谈论并非所有事情都可以由托管代码完成时

我有一些与 MF 有关的任务:

  1. 捕捉现场视频
  2. 更改分辨率和波特率
  3. 编码视频
  4. 解码视频

我可以在这些任务中使用 .net 还是必须使用本机代码?是否有示例帮助(请不要提及其中的 msdn)?

.net c# video ms-media-foundation

6
推荐指数
1
解决办法
9769
查看次数

检测Microsoft Surface上的相机旋转?

有没有可靠的方法来确定相机是否在Microsoft Surface上旋转?

基本上,我想知道设备中是否内置了特定的摄像头(因为它随后会随设备一起旋转),有没有办法查询?

我的问题是,当用户旋转设备时,我的相机视图被翻转,但我无法假设我应该只旋转读取帧,因为活动相机可能是外部USB相机.

我正在使用Media Foundation API阅读相机.

windows camera ms-media-foundation surface-pro

6
推荐指数
1
解决办法
489
查看次数

MediaFoundation SinkWriter:启用 MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS 会导致 WriteSample 失败并出现 E_FAIL 错误

我正在尝试将 RGB/NV12 样本编码为 h264,并通过实现 IMFByteStream 通过 SinkWriter 通过 WebSocket 流式传输编码的视频。在这个实验中,我使用像素着色器将 RGB32 样本转换为 NV12 样本。输出格式为带有 FMPEG4 容器的 H264。

我也尝试过直接输入 RGB 样本。通过软件方法它对 RGB 和 NV12 样本都可以正常工作,但是当取消注释下面提到的行时,WriteSample 失败并出现 E_FAIL 错误。不过,我正在正确设置 MF_SINK_WRITER_D3D_MANAGER。

COM_CHECK(attribs->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE));
Run Code Online (Sandbox Code Playgroud)

MFtrace 日志:

59980,EB60 10:18:27.65002 ### Exiting: traced process has exited
CMFPlatExportDetours::MFStartup @ Version=0x00020070, dwFlags=0x00000000
59980,EB60 10:18:27.65448 COle32ExportDetours::CoCreateInstance @ Created {60F9F51E-4613-4B35-AE88-332542B567B8} MF Fragmented MPEG4 Sink Class Factory (C:\WINDOWS\System32\mfmp4srcsnk.dll) @04B80148 - traced interfaces:
59980,EB60 10:18:27.65700 COle32ExportDetours::CoCreateInstance @ Created {9A02E012-6303-4E1E-B9A1-630F802592C5} Packed Property Storage Object (C:\WINDOWS\system32\propsys.dll) @012D5FEC - traced interfaces:
59980,EB60 10:18:27.65931 COle32ExportDetours::CoCreateInstance @ …
Run Code Online (Sandbox Code Playgroud)

directx mpeg h.264 ms-media-foundation

6
推荐指数
0
解决办法
352
查看次数

Media Foundation H264 硬件编码器中的锯齿/质量问题,尤其是文本(文本上的锯齿和模糊)

我一直在研究使用硬件加速的 h.264 编码和解码流式传输实时视频,并且我已经能够使用 Windows Media Foundation 使其工作。

我使用 d3d11 视频处理器将帧从 RGB 压缩为 NV12 格式,并使用硬件 MFT 编码为 h.264。

我现在唯一的问题是在解码和渲染视频后,锯齿和光晕效果与文本一起出现在屏幕上。

下面的图片显示了我的问题。

编码前的帧

原图

编解码后的帧

解码图像

经过一番研究,我发现了H.264/AVC 444,其中微软通过引入带有 RDP 10 的全屏 AVC 444 模式解决了这个问题。

在 AVC 444 模式下,通过显着提高帧吞吐量,我们可以使用 4:2:0 硬件编码器/解码器获得 4:4:4 质量的文本。

介绍 AVC 444 模式 在远程桌面场景中使用 AVC/H.264 作为唯一的编解码器的主要挑战是文本显示具有典型 AVC/H.264 实现的光环效果。这是由作为压缩的一部分发生的颜色转换过程引起的,该过程丢弃了一些色度信息,如 4:2:0 格式所示。对于人眼来说,视频内容缺乏色度信息并不那么明显,但是对于主要使用文本的远程桌面场景,这是显而易见的,用户会认为这是模糊的。AVC/H.264 标准定义了使用 4:4:4 格式的能力,在转换过程中不会丢失色度,但是通常这不是大多数 AVC/H.264 硬件编码器和解码器实现的一部分,因此提供一个挑战。

第 444 章

我试图在 Media Foundation 中实现相同的目标,但尚未找到任何资源来破解它。

我发现颜色转换为 NV12 是这个问题背后的原因,我一直在努力解决它,我也尝试过 YUV 444,但找不到支持它的硬件 MFT。我无法使用硬件 MFT 编码除 NV12 之外的任何其他颜色格式

有什么办法可以克服这个问题吗?任何帮助将不胜感激。

directx video-streaming h.264 hardware-acceleration ms-media-foundation

6
推荐指数
1
解决办法
262
查看次数