我有两个问题
1)如何将原始数据写入文件接收器。我正在努力修复。 2)如何确保接收的数据不是写入文件而是写入内存缓冲区
所以详细说明:
我正在尝试使用Windows MPEG-4文件接收器将一些英特尔SDK编码的avc或hevc写入内存并将其发送到websocket。
什么是正确的方法?
我可以将原始hevc或avc作为(byte *,length)提供给MPEG-4 File Sink吗?或者我是否需要将英特尔编码器包装到自定义Windows Media Foundation编码器中(我只能使用GUID来获取英特尔编码器)从Windows Media Frame工作。纠正我如果我错了请。
所以我有2个问题,如何将原始数据(avc || hevc)写入MP4 Sinker(由第三方编码器编码)
我是否需要实现自定义Sinker,以及它的定制方式。我可以继承部分MPEG4 Sinker(毕竟我不想重新实现Mp4的完整容器)
或修改MPEG4 Sinker行为,以便它不会将其写入文件但写入内存
我知道我觉得自己重复了几次。对于那个很抱歉。
1)如果你将编码的比特流包装在IMFSample中,你可以调用IMFStreamSink::ProcessSample。要将它包装在IMFSample
中,使用IMFMediaBuffer
创建一个内存缓冲区MFCreateMemoryBuffer ,然后使用IMFSample
创建一个MFCreateSample并使用IMFSample::AddBuffer添加缓冲区。然后将它传递给流水槽。此外,如果您可以约束输出比特流长度,您可以使用IMFMediaBuffer
实际使用IMFMediaBuffer::Lock的基础备忘录,以获取指向底层内存的指针并将其传递给英特尔SDK。
2)当通过MFCreateMPEG4MediaSink创建MPEG-4接收器时,你传入一个IMFByteStream实例。您可以创建自己的类来实现此接口,并将数据直接写入内存或您需要的任何位置。如果你不想做一个完整的实现,还有MFCreateMFByteStreamOnStream和MFCreateMFByteStreamOnStreamEx,可以将IStream实例包装到IMFByteStream
但我从来没有使用过那些,我不知道底层的内存语义。您可以使用IStream
和SHCreateMemStream创建一个支持内存的CreateStreamOnHGlobal。
我很久以前就使用过英特尔SDK,但是如果我记得它有一个兼容MFT的编码器,但我总是使用普通的C ++编程器,因此我不确定它们在配置等方面有何不同。但是如果MFT可以工作,那么你可以设置一个合适的管道而不用自己处理比特流样本,如(1)所述,只需处理(2)。
此外,性能方面,因为据我所知,英特尔SDK也可以在Direct3D表面上工作,你可以查看MFCreateDXSurfaceBuffer使用Direct3D表面而不是内存缓冲区来包装数据。