微软 FileSink Mpeg4

Microsoft FileSink Mpeg4

我有 2 个问题

1)如何将原始数据写入文件接收器。我正在尝试混合。 2)如何确保下沉的数据不是写入文件而是写入内存缓冲区

详细信息:

我正在尝试使用 windows MPEG-4 文件接收器将一些 Intel SDK 编码的 avc 或 hevc 写入内存并将其发送到 websocket。

什么是正确的方法?

我可以将原始的 hevc 或 avc 作为(字节*,长度)提供给 MPEG-4 文件接收器吗? 或者我是否需要将 Intel 编码器包装到自定义 Windows Media Foundation 编码器中(我可以使用 GUID 来获取 Intel 编码器)来自 Windows Media Frame 工作。纠正我如果我错了请。

所以我有 2 个问题,如何将我的原始数据 (avc||hevc) 写入 MP4 Sinker(由第 3 方编码器编码)

我是否需要实现一个自定义的 Sinker ,它是如何自定义的。我可以继承 MPEG4 Sinker 的一部分吗(毕竟我不想为 Mp4 重新实现一个完整的容器)

或者修改 MPEG4 Sinker 行为,使其不写入文件而是写入内存

我知道我觉得自己重复了几次。对于那个很抱歉。

1) 如果将编码比特流包装在 IMFSample you can just call IMFStreamSink::ProcessSample. To wrap it in the IMFSample, create a memory buffer IMFMediaBuffer with MFCreateMemoryBuffer , then create an IMFSample with MFCreateSample and add the buffer to it with IMFSample::AddBuffer. And then pass it to the stream sink. Also, if you can constrain the output bitstream length you can actually use the underlying memofy from IMFMediaBuffer by using IMFMediaBuffer::Lock 中以获得指向底层内存的指针并将其传递给英特尔 SDK。

2) 通过 MFCreateMPEG4MediaSink you pass in an IMFByteStream instance. You can make your own class which implements this interface and writes the data directly to memory or wherever you need. If you do not want to do a full implementation there are also MFCreateMFByteStreamOnStream and MFCreateMFByteStreamOnStreamEx which can wrap an IStream instance into a IMFByteStream but I have never used those and I am not aware of the underlying memory semantics. You can create a memory backed IStream with SHCreateMemStream and CreateStreamOnHGlobal.

创建 MPEG-4 接收器时

我很久以前就使用过 Intel SDK,但如果我记得它有一个 MFT 兼容的编码器,但我总是使用普通的 C++ 编码器,因此我不确定它们在配置等方面有何不同。但是如果MFT 有效,然后您可以设置适当的管道,而无需按照 (1) 中所述自行处理比特流样本,只需处理 (2)。

此外,性能方面,据我所知英特尔 SDK 也适用于 Direct3D 表面,您可以查看 MFCreateDXSurfaceBuffer 以使用 Direct3D 表面而不是内存缓冲区来包装数据。