使用 Media Foundation SDK 进行直播

Posted

技术标签:

【中文标题】使用 Media Foundation SDK 进行直播【英文标题】:live streaming using Media Foundation SDK 【发布时间】:2011-11-22 08:02:50 【问题描述】:

是否有一种简单的方法来使用我正在使用 Media Foundation 编码的数据并通过网络将其流式传输,而不是将其写入 WMV 文件?

【问题讨论】:

【参考方案1】:

首先,我想,您需要知道您将流式传输的格式(编码为/包含)。

我在想 h264。使用 windows 7 媒体基础创建 h264 辅助函数。 您需要创建拓扑。源读取文件,接收器将解码和编码格式转换为 h264。您所需要的只是源和接收器。您实际上并不需要解码器和编码器。拓扑构建器计算出需要插入的内容。

有一个 CreateTranscodeTopology 函数,但这对您没有帮助,因为它将编码数据写入文件。这就是为什么您需要创建自己的拓扑。

您只需要编写一个实现 IMFByteStream 的类。

您的接收器应采用此字节流的实现。您的实现“写入”函数将写入您要将数据发送到的套接字。因此,也许您可​​以将套接字传递给 IMFByteStream 实现的构造函数或回调函数。

我还建议您将一些打印语句放在您需要在 IMFByteStream 中实现的另一个函数中,因为 SinkWriter 调用某些东西,例如。 GetCapabilities 所以你至少应该返回。

HRESULT STDMETHODCALLTYPE NetworkOutputStream::GetCapabilities(__RPC__out DWORD        *pdwCapabilities)HRESULT hr=S_OK; 
 printf("GetCapabilities\n");

*pdwCapabilities= (MFBYTESTREAM_IS_READABLE|MFBYTESTREAM_IS_WRITABLE|MFBYTESTREAM_IS_SEEKABLE);

return hr;

话虽如此,如果您的客户端上有播放器(“html5 浏览器”),我建议您使用“MFCopy”示例。

创建拓扑主要是为了播放和其他东西。因此,它以移动应该播放的速度对其进行解码和编码。但您所需要的只是对文件进行编码并通过网络发送。 因此,请查看 MFCopy 并实现您自己的 IMFByteStream。而不是创建写入本地文件系统的接收器,而是将您的 IMFByteStream 传递给接收器。

【讨论】:

谢谢 - 我最好以 WMV 格式流式传输(VC-1、Windows Media 9 视频编解码器、Windows Media 音频编解码器)。在那种情况下,这种方法仍然可行吗?

以上是关于使用 Media Foundation SDK 进行直播的主要内容,如果未能解决你的问题,请参考以下文章

使用 Microsoft Media Foundation 从文件播放视频

Windows Media Foundation 枚举音频设备

如何使用 Media Foundation 从 IMFSourceReader 播放音频缓冲区

Media Foundation 捕获的视频是垂直镜像的

Media Foundation 将音频流添加到视频文件

使用 Media Foundation 源阅读器阅读 3D(左右)视频