使用 Microsoft Media Foundation 和 Desktop Duplication 创建视频 API

Video creation with Microsoft Media Foundation and Desktop Duplication API

我正在使用 DDA 捕获 桌面图像帧 并将它们发送到服务器,这些帧应该用于使用 MMF 创建视频。我想了解,如果我要使用 Source ReaderSink,需要用 MMF 做什么编写器 从捕获的帧 渲染视频。

有两个问题:

1) 好吧,首先,我不能完全理解实际上是否需要 Source Reader with Media来源,如果我已经收到来自DDA的视频帧?我可以将它们发送到 Sink Writer 并渲染视频吗?

2) 据我了解,首先要做的是,如果仍然需要 Source ReaderMedia Source,是我自己写的 Media Source,它将理解用 [=19= 捕获的 DXGI_FORMAT_B8G8R8A8_UNORM 帧]DDA。然后我应该使用 Souce ReaderSink Writer 以及合适的 Decoders\Encoders 并将媒体数据发送到 媒体接收器。您能否更详细地解释一下在这种情况下需要做什么?

实施 SourceReader 在您的情况下不是必需的,但您可以继续实施它,它将起作用。

相反,您也可以直接将通过桌面复制捕获的输入缓冲区提供给 SinkWriter。如下所示,

CComPtr<IMFAttributes> attribs;
CComPtr<IMFMediaSink>    m_media_sink;
IMFSinkWriterPtr         m_sink_writer;

MFCreateAttributes(&attribs, 0);
attribs->SetUINT32(MF_LOW_LATENCY, TRUE);
attribs->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE);

IMFMediaTypePtr mediaTypeOut = MediaTypeutput(fps, bit_rate);
MFCreateFMPEG4MediaSink(stream, mediaTypeOut, nullptr, &m_media_sink));
MFCreateSinkWriterFromMediaSink(m_media_sink, attribs, &m_sink_writer);

//Set input media type
mediaTypeIn->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32);
//Set output media type
mediaTypeOut->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264);

IMFSamplePtr sample;
MFCreateSample(&sample);
sample->AddBuffer(m_buffer); // m_buffer is source buffer in R8G8B8A8 format

sample->SetSampleTime(m_time_stamp);
sample->SetSampleDuration(m_frame_duration);
m_sink_writer->WriteSample(m_stream_index, sample);

Here 是一个基于 SinkWriter 的完美示例。它支持网络和文件接收器。它实际上通过 GDI 方法捕获桌面。 DDA也差不多,使用DDA确实可以获得更好的性能。

我也上传了一个示例here,其实是基于桌面复制,直接使用IMFTransform相反,并使用 Live555 将输出视频流式传输为 RTP 流。通过这种方法,我可以达到 100FPS。

如果您决定采用 SinkWriter 方法,则不必担心颜色转换部分,因为它由 SinkWriter 在后台处理。使用 IMFTransform,您将不得不处理颜色转换部分,但您将对编码器进行细粒度控制。

这里有一些更多的参考链接供您参考。

  1. https://github.com/ashumeow/webrtc4all/blob/master/gotham/MFT_WebRTC4All/test/test_encoder.cc
  2. DXGI Desktop Duplication: encoding frames to send them over the network
  3. Encoding a D3D Surface obtained through Desktop Duplication using Media Foundation