标签: ms-media-foundation

将DirectShow过滤器迁移到Media Foundation MFT的快速方法

我有一些自定义DirectShow过滤器(用于Encoding/Deconding/Mux/Demux).

我想在媒体基金会上将它们用作MFT.

我听到有人说:

"Microsoft声称所有DirectShow过滤器只需添加一些代码即可迁移到MFT"

实际上,我怀疑有一个快速的方法.因为DShow和MediaFoundation之间的方法,API是不同的.

但既然有人告诉我这些信息,我想问一下:

"这是真的吗?我怎么能快速迁移?"

提前致谢.

directshow ms-media-foundation

5
推荐指数
1
解决办法
1709
查看次数

WP8视频流与Media Foundation

我希望将H264视频流式传输到Windows Phone 8应用程序.那么我怎么能用ShardDX做到这一点?(或者也许是Media Foundation的原生功能).

我找到了用于播放视频的MediaEngine类,但我需要"手动"解析帧并将它们转换为解码器或播放器,或其他内容.

media-player h.264 sharpdx ms-media-foundation windows-phone-8

5
推荐指数
1
解决办法
1037
查看次数

DirectX中的整个屏幕捕获和渲染[性能]

我需要一些方法来获取屏幕数据并将其传递到我的应用程序中的DX9表面/纹理,并以1600*900分辨率以至少25fps渲染它,30会更好.

我尝试了BitBliting,但即使在那之后,我的速度为20fps,在将数据加载到纹理并渲染后,我的速度为11fps,远远落后于我的需要.

GetFrontBufferData是不可能的.

以下使用Windows Media API的内容,但我不熟悉它.示例将数据保存到文件中,也许它可以设置为给你单独的帧,但我没有找到足够好的文档来自己尝试.

我的代码:

m_memDC.BitBlt(0, 0, m_Rect.Width(),m_Rect.Height(), //m_Rect is area to be captured
               &m_dc, m_Rect.left, m_Rect.top, SRCCOPY); 
      //at 20-25fps after this if I comment out the rest

//DC,HBITMAP setup and memory alloc is done once at the begining
GetDIBits( m_hDc, (HBITMAP)m_hBmp.GetSafeHandle(),
    0L,             // Start scan line
    (DWORD)m_Rect.Height(),     // # of scan lines
    m_lpData,                   // LPBYTE
    (LPBITMAPINFO)m_bi,     // address of bitmapinfo
    (DWORD)DIB_RGB_COLORS);     // Use RGB for color table
     //at 17-20fps

IDirect3DSurface9 …
Run Code Online (Sandbox Code Playgroud)

c++ directx winapi ms-media-foundation

5
推荐指数
2
解决办法
4752
查看次数

Media Foundation - 如何在MFT中更改帧大小(Media Foundation Transform)

我正在尝试实现一个能够旋转视频的MFT.旋转本身将在变换函数内完成.为此,我需要更改输出帧大小,但我不知道如何做到这一点.

作为起点,我使用了Microsoft提供的MFT_Grayscale示例.我将此MFT作为转换节点包含在部分拓扑中

HRESULT Player::AddBranchToPartialTopology(
    IMFTopology *pTopology,
    IMFPresentationDescriptor *pSourcePD,
    DWORD iStream
    )
{
    ...
    IMFTopologyNode pTransformNode = NULL;
    ...
    hr = CreateTransformNode(CLSID_GrayscaleMFT, &pTransformNode);
    ...
    hr = pSourceNode->ConnectOutput(0, pTransformNode, 0);
    hr = pTransformNode->ConnectOutput(0, pOutputNode, 0);
    ...
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,此代码正在运行.应用灰度mft并按预期工作.无论如何,我想改变这个mft来处理视频旋转.所以我们假设我想将视频旋转90度.为此,必须切换输入框架的宽度和高度.我尝试了不同的东西,但没有一个按预期工作.基于此线程中的第一条注释如何更改Media Foundation Transform输出帧(视频)大小?我开始改变SetOutputType的实现.我在GetOutputType中调用GetAttributeSize来接收实际的frame_size.当我尝试设置新的frame_size时失败(当开始播放时我收到hresult 0xc00d36b4(指定的数据无效,不一致或此对象不支持)

HRESULT CGrayscale::SetOutputType(
    DWORD           dwOutputStreamID,
    IMFMediaType    *pType, // Can be NULL to clear the output type.
    DWORD           dwFlags 
    )
{ ....
    //Receive the actual frame_size of pType (works as expected)
    hr = MFGetAttributeSize(
    pType,
    MF_MT_FRAME_SIZE,
    &width,
    &height
    ));
    ...
    //change …
Run Code Online (Sandbox Code Playgroud)

c++ windows video-processing mft ms-media-foundation

5
推荐指数
1
解决办法
1680
查看次数

使用Media Foundation对Direct X曲面进行编码

我正在尝试使用MediaFoundation API对视频进行编码,但是我在将样本推送到SinkWriter时遇到了问题.

我正在通过桌面复制API获取帧编码.我最终得到的是ID3D11Texture2D,其中包含桌面图像.

我正在尝试创建一个包含此表面的IMFVideoSample,然后将该视频样本推送到SinkWriter.

我尝试过不同的方式:

  • 我调用MFCreateVideoSampleFromSurface(texture, &pSample)了纹理是ID3D11Texture2D,填充在SampleTime和SampleDuration中,然后将创建的样本传递给SinkWriter.
    SinkWriter返回E_INVALIDARG.

  • 我尝试通过传递nullptr作为第一个参数并使用MFCreateDXGISurfaceBuffer自己创建缓冲区,然后将生成的缓冲区传递给Sample来尝试创建示例.
    那也行不通.

  • 我阅读了MediaFoundation文档,但无法找到有关如何使用DirectX纹理创建样本的详细信息.

我没有东西可以试试.
有没有人以前使用过这个API,可以想到我应该检查的东西,或者我可以如何调试这个?

c++ directx-11 dxgi ms-media-foundation

5
推荐指数
1
解决办法
1140
查看次数

MediaFoundation,位图数组为mp4

我把位图作为BYTE数组保存,它以微软CBitmap类的非常相似和可互换的格式保存每个像素的RGB值.所以让我们考虑一下我有一个CBitmaps数组,我想用MediaFoundation Transcode Api将它们转换为mp4,如下例所示:toMp4.但是在此示例中,它们从URL流式传输.

 // Use the source resolver to create the media source
  hr = pResolver->CreateObjectFromURL(pszURL, MF_RESOLUTION_MEDIASOURCE, NULL, &ObjectType, &pSource);
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我的记忆中有我的位图.所以我相信我可以使用这个功能.IMFSourceResolver :: CreateObjectFromByteStream

我不确定这是否可行.总结如何使用转码api将我的CBitmap数组转换为mp4?

c++ video mp4 bitmap ms-media-foundation

5
推荐指数
1
解决办法
698
查看次数

Windows 8 将 Stream 传递给 MFSourceReader

我正在尝试制作一个程序,该程序可以从用户的音乐库中获取 .mp3 文件,并使用 Windows Media Foundation 将其转换IMFSourceReader为包含 PCM 值的数组,用于一些令人兴奋的 DSP 操作。但是,我遇到了问题。

我的解决方案有两个项目;一个包含 UI 代码的 C#/XAML 和一个 C++ 库,其中包含一些与 Media Foundation 和 XAudio2 一起使用的本机代码以及一些public refC# 代码可以与之交互的类。

我无法使用,MFCreateSourceReaderFromURL因为即使您在应用程序清单中具有音乐库功能,它也会返回 ACCESS DENIED HRESULT。所以看起来我将不得不使用MFCreateSourceReaderFromByteStreamMFCreateSourceReaderFromMediaSource。现在,使用Windows.Storage.KnownFolders.MusicLibraryaStream或 anIInputStream以及其他一些流类型来访问音乐文件很容易,但是如何将其转换为 anIMFByteStream或 anIMFMediaSource或仅以某种方式将 mp3 解码为具有 PCM 值的字节数组?

我还考虑了将音乐文件重新保存在应用程序文件夹中的想法,以便我可以使用,MFCreateSourceReaderFromURL或者可以直接绕过与 Media Foundation 的工作,并使用类似Windows.Media.Transcoding的方法转换为 PCM。我不确定这是 Transcoding 命名空间的用途。

我花了几个小时阅读 Media Foundation 文档,我发现了一丝希望MFCreateMFByteStreamOnStream,可以将 COM 转换IStream为字节流,但我需要找到/编写一个包装器来将我的 .net 流转换为 IStream。在我开始这项任务之前,我只想确保我朝着正确的方向前进,或者有更好的方法来做到这一点? …

c++ audio windows-8 windows-runtime ms-media-foundation

4
推荐指数
1
解决办法
2886
查看次数

在 Microsoft Media Foundation 中获取所有支持的相机 FPS 值

我想获得我的网络摄像头支持的所有 FPS 值的列表。

如何设置视频捕获帧速率msdn 文章中,它说我可以查询系统以获取特定摄像机支持的最大和最小 FPS。

它还说:

设备可能支持此范围内的其他帧速率。

MF_MT_FRAME_RATE_RANGE_MIN 中它说:

不保证设备支持此范围内的每个增量。

所以听起来好像没有办法在 Media Foundation 中获得所有支持的 FPS 值,只有最大值和最小值。

我知道在 Linuxv4l2-ctl --list-formats-ext命令上打印更多支持的 FPS,而不仅仅是 min 和 max。

以下是 Linux 中使用不同相机的几个示例:

$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
  Index       : 0
  Type        : Video Capture
  Pixel Format: 'YUYV'
  Name        : YUV 4:2:2 (YUYV)
    Size: Discrete 160x120
      Interval: Discrete 0.033s (30.000 fps)
      Interval: Discrete 0.036s (27.500 fps)
      Interval: Discrete 0.040s (25.000 fps)
      Interval: Discrete 0.044s (22.500 fps)
      Interval: Discrete …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi ms-media-foundation

4
推荐指数
1
解决办法
2706
查看次数

使用 Microsoft Media Foundation 和桌面复制 API 创建视频

我正在使用DDA来捕获桌面图像帧并将它们发送到服务器,这些帧应该用于创建带有MMF 的视频。我想了解,需要与做的事情MMF,如果我将使用源读取器接收器作家,以从捕捉到的帧渲染视频

有两个问题:

1) 嗯,首先,我不能完全理解,如果我已经从DDA接收到视频帧,实际上是否需要带有Media SourceSource Reader?我可以将它们发送到Sink Writer并渲染视频吗?

2)据我所知,首先要做的是,如果仍然需要Source ReaderMedia Source那就编写我自己的Media Source,它将理解用DDA捕获的DXGI_FORMAT_B8G8R8A8_UNORM帧。然后我应该使用带有合适的Decoders \Encoders 的Souce ReaderSink Writer并将媒体数据发送到Media Sinks。您能否更详细地解释一下在这种情况下需要做什么?

video-capture ms-media-foundation desktop-duplication

4
推荐指数
1
解决办法
449
查看次数

以编程方式为应用设置图形性能

Windows 控制面板中有一个选项可以将应用程序设置为“高性能”。控制面板 -> 系统 -> 显示 -> 图形设置。

在那里添加我的应用程序时,我注意到,当使用 Media Foundation 和 H.265 编码时,它使用 NVIDIA gfx 适配器进行编码。在此之前,它使用嵌入式Intel显卡,只能进行H.264编码,因此H.265编码在CPU中慢慢完成。

如何以编程方式在那里添加我的应用程序?这对我的音序器的性能至关重要。

非常感谢。

图形设置

windows directx winapi dxgi ms-media-foundation

4
推荐指数
1
解决办法
1173
查看次数