我有 2 个问题
1)如何将原始数据写入文件接收器。我正在尝试混合。 2)如何确保下沉的数据不是写入文件而是写入内存缓冲区
详细说明:
我正在尝试使用 Windows MPEG-4 文件接收器将一些 Intel SDK 编码的 avc 或 hevc 写入内存并将其发送到 websocket。
什么是正确的方法?
我可以将原始 hevc 或 avc 作为(字节*,长度)提供给 MPEG-4 文件接收器吗? 或者我是否需要从 Windows Media Frame 工作中将 Intel 编码器包装到自定义 Windows Media Foundation 编码器中(无论如何我都可以使用 GUID 来获取 Intel 编码器)。如果我错了请纠正我。
所以我有两个问题,如何将原始数据(avc||hevc)写入MP4 Sinker(由第3方编码器编码)
我是否需要实现一个自定义的 Sinker ,以及它的自定义程度如何。我可以继承部分MPEG4 Sinker吗(毕竟我不想重新实现一个完整的Mp4容器)
或者修改 MPEG4 Sinker 行为,使其不写入文件而是写入内存
我知道我感觉自己重复了几次。对于那个很抱歉。
最佳答案
1) 如果将编码比特流包装在 IMFSample 中您可以调用IMFStreamSink::ProcessSample 。要将其包装在 IMFSample
中,请使用 MFCreateMemoryBuffer 创建一个内存缓冲区 IMFMediaBuffer
,然后使用 MFCreateSample 创建一个 IMFSample
并使用IMFSample::AddBuffer向其中添加缓冲区。然后将其传递到流接收器。另外,如果您可以限制输出比特流长度,您实际上可以使用 IMFMediaBuffer::Lock 来使用 IMFMediaBuffer
中的底层 memofy。获取指向底层内存的指针并将其传递给英特尔 SDK。
2) 通过 MFCreateMPEG4MediaSink 创建 MPEG-4 接收器时你传入 IMFByteStream实例。您可以创建自己的类来实现此接口(interface)并将数据直接写入内存或任何您需要的地方。如果您不想完全实现,还有 MFCreateMFByteStreamOnStream和 MFCreateMFByteStreamOnStreamEx它可以包裹 IStream实例到 IMFByteStream
但我从未使用过它们,而且我不知道底层的内存语义。您可以使用 SHCreateMemStream 创建内存支持的 IStream
和 CreateStreamOnHGlobal .
我很久以前就使用过英特尔 SDK,但如果我记得它有一个 MFT 兼容编码器,但我总是使用纯 C++ 编码器,因此我不确定它们在配置等方面有何不同。但是如果 MFT一个有效,然后您可以设置适当的管道,而无需按照(1)中所述自行处理比特流样本,而只需处理(2)。
此外,性能方面,据我记得英特尔 SDK 也可以在 Direct3D 表面上工作,您可以查看 MFCreateDXSurfaceBuffer使用 Direct3D 表面而不是内存缓冲区来包装数据。
关于mp4 - 微软 FileSink Mpeg4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54410411/