c++ - 使用 Media Foundation SDK 进行直播

标签 c++ windows ms-media-foundation

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

最佳答案

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

我在考虑 h264。使用 Windows 7 Media Foundation 创建 h264 辅助函数。 您需要创建拓扑。 Source 读取文件,Sink 将解码和编码格式转换为 h264。您只需要一个源和一个接收器。您实际上不需要解码器和编码器。 Topology builder 计算出需要在两者之间插入什么。

有一个 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 传递到接收器。

关于c++ - 使用 Media Foundation SDK 进行直播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8223654/

相关文章:

linux - 获取当前用户的名字

c++ - 在辅助显示器上工作

c++ - openCV 立体匹配算法(stereoBM 和 stereoSGBM)能否与垂直校正图像一起使用

使用 PowerShell 进行 MySQL 转储

c++ - 单击 MFC 气球工具提示的 "X"关闭按钮会发送什么事件?

video - 在播放H264编码的视频期间,Resizer MFT无法处理输出

c++ - 媒体基础多音频流文件解码错误

c++ - 如何使用 Microsoft Media Foundation 的 Sink Writer 播放音频

C++ 将 XOR 实现转换为 8 位(处理器不支持 XOR)

c++ - 尝试将库链接到使用 OpenGL 的文件,而链接器无法找到 GL 相关文件