我即将在C ++中编写一个类似的模拟器。它是一个控制台应用程序,它...模拟东西,并有一个REST-ful套接字API来影响/有助于模拟。为了看看模拟中发生了什么,我有一个很棒的想法来生成一系列反映模拟器状态的图像(位图)。然后简单地将其作为电影流式传输,这样我就可以观看从媒体播放器模拟的模拟器,例如VLC或Windows媒体播放器。或者将视频保存到文件(第二个选项)。或两者兼而有之。
在Windows 7(x64)上,Windows Media Foundation看起来像是用于此的技术。只有我不想成为媒体基金会专家,而是更专注于我的模拟器。
以下是它的工作方式:
我现在觉得困难的是弄清楚如何最好地协调和选择将进行编码的Media Foundation部分。
我认为我必须实现一个自定义IMFMediaSource
COM对象并将其用作管道的开头。但我没有找到如何从管道中获取编码的jpeg图像或一些IMFMediaSink
视频流数据,因此我可以用它来提供我的网络层。
所以,我在媒体基金会专家的帮助下提出了一系列问题:
由于我在COM编程和其他基础知识方面有经验,我真正需要的只是一个快捷方式,所以我不需要与Media Foundation一起学习和反复试验,以了解如何实现这个用例或至少有信息帮助我找到了一个很好的起点。
提前致谢!
这是应用程序如何访问它的草案:
#include <cstdint>
struct SourceFormatDescriptor
{
uint32_t width;
uint32_t height;
uint32_t colorDepth; // Bytes per pixel -> RGB (3 bytes per pixel) | RGBA (4 bytes per pixel)
};
struct IVideoStreamReceiver
{
virtual void Starting() = 0;
virtual void Ending() = 0;
virtual uint32_t MaxChunkSize() = 0; // Somehow network protocol MTU related
// Can/should be directly forwarded to network layer and/or saved to file.
virtual void VideoChunk(size_t chunkSize, const uint8_t* chunk) = 0;
};
// Application object behind which all video rendering voodoo will be implemented.
class VideoRenderer
{
// Is initialized once and fixed while the streaming is done.
SourceFormatDescriptor m_sourceDescriptor;
public:
VideoRenderer(const SourceFormatDescriptor& sourceDescriptor);
void Start();
void Stop();
// Not sure who drives the renderer (Media foundation or external clock?)
void MediaClockTick(); // dummy reminder function
void AddReceiver(IVideoStreamReceiver* receiver);
// Whenever a new frame is rendered it is passed to the video renderer.
void NewFrame(const uint8_t * frameData, size_t frameSize);
};
答案 0 :(得分:1)
我一直在使用并尝试在Windows Media Foundation上处理一段时间,而我还是专家的另一端。根据我对MF的经验,我建议您为位图到视频流逻辑寻找不同的方法。虽然MF可以对H264进行位图编码(如果您要通过网络,您可以这样做),但它只提供与流网络协议的极小集成。据我所知,这仅限于允许基本的RTSP服务器与SourceReader一起使用,但是没有用于网络的功能作为SinkWriter的输出,这正是您所需要的。因此,您必须按照您提到的方式自行完成,但RTP / RTSP堆栈将比您想象的更重要。
可能适合您的一个选项是ffmpeg。通过直接使用其中一个预先构建的exes或使用项目中包含的库。看一下这个SO question。诸如ffmpeg之类的外部库解决方案可能不如使用MF那样干净,但在您的情况下,它会减少您的工作量。 ffmpeg对网络流媒体有更好的支持,包括RTP和RTSP。