2

我有 2 个问题

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

所以详细地说:

我正在尝试使用 windows MPEG-4 File Sink 将一些 Intel SDK Encoded avc 或 hevc 写入内存并将其发送到 websocket。

什么是正确的方法?

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

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

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

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

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

4

1 回答 1

2

1)如果您将编码的比特流包装在IMFSample中,您可以调用IMFStreamSink::ProcessSample。要将其包装在 中,请使用MFCreateMemoryBufferIMFSample创建一个内存缓冲区,然后使用 MFCreateSample 创建一个使用IMFSample::AddBuffer将缓冲区添加到其中。然后将其传递给流接收器。此外,如果您可以限制输出比特流长度,您实际上可以使用底层内存,通过使用IMFMediaBuffer::Lock获取指向底层内存的指针并将其传递给英特尔 SDK。IMFMediaBufferIMFSampleIMFMediaBuffer

2) 通过MFCreateMPEG4MediaSink创建 MPEG-4 接收器时,您传入一个IMFByteStream实例。您可以创建自己的类来实现此接口并将数据直接写入内存或您需要的任何地方。如果您不想执行完整的实现,还有MFCreateMFByteStreamOnStreamMFCreateMFByteStreamOnStreamEx可以将IStream实例包装到 aIMFByteStream但我从未使用过它们,而且我不知道底层的内存语义。IStream您可以使用SHCreateMemStreamCreateStreamOnHGlobal创建内存。

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

此外,在性能方面,因为据我记得英特尔 SDK 也可以在 Direct3D 表面上工作,您可以查看MFCreateDXSurfaceBuffer以使用 Direct3D 表面而不是内存缓冲区来包装数据。

于 2019-01-29T09:32:46.130 回答