我有一些自定义DirectShow过滤器(用于Encoding/Deconding/Mux/Demux).
我想在媒体基金会上将它们用作MFT.
我听到有人说:
"Microsoft声称所有DirectShow过滤器只需添加一些代码即可迁移到MFT"
实际上,我怀疑有一个快速的方法.因为DShow和MediaFoundation之间的方法,API是不同的.
但既然有人告诉我这些信息,我想问一下:
"这是真的吗?我怎么能快速迁移?"
提前致谢.
我希望将H264视频流式传输到Windows Phone 8应用程序.那么我怎么能用ShardDX做到这一点?(或者也许是Media Foundation的原生功能).
我找到了用于播放视频的MediaEngine类,但我需要"手动"解析帧并将它们转换为解码器或播放器,或其他内容.
media-player h.264 sharpdx ms-media-foundation windows-phone-8
我需要一些方法来获取屏幕数据并将其传递到我的应用程序中的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) 我正在尝试实现一个能够旋转视频的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) 我正在尝试使用MediaFoundation API对视频进行编码,但是我在将样本推送到SinkWriter时遇到了问题.
我正在通过桌面复制API获取帧编码.我最终得到的是ID3D11Texture2D,其中包含桌面图像.
我正在尝试创建一个包含此表面的IMFVideoSample,然后将该视频样本推送到SinkWriter.
我尝试过不同的方式:
我调用MFCreateVideoSampleFromSurface(texture, &pSample)了纹理是ID3D11Texture2D,填充在SampleTime和SampleDuration中,然后将创建的样本传递给SinkWriter.
SinkWriter返回E_INVALIDARG.
我尝试通过传递nullptr作为第一个参数并使用MFCreateDXGISurfaceBuffer自己创建缓冲区,然后将生成的缓冲区传递给Sample来尝试创建示例.
那也行不通.
我阅读了MediaFoundation文档,但无法找到有关如何使用DirectX纹理创建样本的详细信息.
我没有东西可以试试.
有没有人以前使用过这个API,可以想到我应该检查的东西,或者我可以如何调试这个?
我把位图作为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?
我正在尝试制作一个程序,该程序可以从用户的音乐库中获取 .mp3 文件,并使用 Windows Media Foundation 将其转换IMFSourceReader为包含 PCM 值的数组,用于一些令人兴奋的 DSP 操作。但是,我遇到了问题。
我的解决方案有两个项目;一个包含 UI 代码的 C#/XAML 和一个 C++ 库,其中包含一些与 Media Foundation 和 XAudio2 一起使用的本机代码以及一些public refC# 代码可以与之交互的类。
我无法使用,MFCreateSourceReaderFromURL因为即使您在应用程序清单中具有音乐库功能,它也会返回 ACCESS DENIED HRESULT。所以看起来我将不得不使用MFCreateSourceReaderFromByteStream或MFCreateSourceReaderFromMediaSource。现在,使用Windows.Storage.KnownFolders.MusicLibraryaStream或 anIInputStream以及其他一些流类型来访问音乐文件很容易,但是如何将其转换为 anIMFByteStream或 anIMFMediaSource或仅以某种方式将 mp3 解码为具有 PCM 值的字节数组?
我还考虑了将音乐文件重新保存在应用程序文件夹中的想法,以便我可以使用,MFCreateSourceReaderFromURL或者可以直接绕过与 Media Foundation 的工作,并使用类似Windows.Media.Transcoding的方法转换为 PCM。我不确定这是 Transcoding 命名空间的用途。
我花了几个小时阅读 Media Foundation 文档,我发现了一丝希望MFCreateMFByteStreamOnStream,可以将 COM 转换IStream为字节流,但我需要找到/编写一个包装器来将我的 .net 流转换为 IStream。在我开始这项任务之前,我只想确保我朝着正确的方向前进,或者有更好的方法来做到这一点? …
我想获得我的网络摄像头支持的所有 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) 我正在使用DDA来捕获桌面图像帧并将它们发送到服务器,这些帧应该用于创建带有MMF 的视频。我想了解,需要与做的事情MMF,如果我将使用源读取器和接收器作家,以从捕捉到的帧渲染视频。
有两个问题:
1) 嗯,首先,我不能完全理解,如果我已经从DDA接收到视频帧,实际上是否需要带有Media Source的Source Reader?我可以将它们发送到Sink Writer并渲染视频吗?
2)据我所知,首先要做的是,如果仍然需要Source Reader和Media Source,那就编写我自己的Media Source,它将理解用DDA捕获的DXGI_FORMAT_B8G8R8A8_UNORM帧。然后我应该使用带有合适的Decoders \Encoders 的Souce Reader和Sink Writer并将媒体数据发送到Media Sinks。您能否更详细地解释一下在这种情况下需要做什么?
Windows 控制面板中有一个选项可以将应用程序设置为“高性能”。控制面板 -> 系统 -> 显示 -> 图形设置。
在那里添加我的应用程序时,我注意到,当使用 Media Foundation 和 H.265 编码时,它使用 NVIDIA gfx 适配器进行编码。在此之前,它使用嵌入式Intel显卡,只能进行H.264编码,因此H.265编码在CPU中慢慢完成。
如何以编程方式在那里添加我的应用程序?这对我的音序器的性能至关重要。
非常感谢。