我有2个问题
1)如何将原始数据写入文件接收器。我正在尝试进行多路复用。 2)如何确保接收到的数据不是写到文件而是写到内存缓冲区
因此请详解:
我正在尝试使用Windows MPEG-4 File Sink将一些Intel SDK编码的avc或hevc写入内存,然后将其发送到websocket。
什么是正确的方法?
我可以只将原始hevc或avc作为(字节*,长度)送入MPEG-4 File Sink吗? 还是我需要将英特尔编码器包装到Windows Media Frame工作中的自定义Windows Media Foundation编码器中(好吧,我仍然可以使用GUID来获取英特尔编码器)。纠正我,如果我错了。
所以我有2个问题,如何将原始数据(avc || hevc)写入MP4 Sinker(由第3方编码器编码)
我是否需要实现自定义的Sinker以及自定义的方式。我可以继承MPEG4 Sinker的一部分吗(毕竟我不想为Mp4重新实现完整的容器)
或修改MPEG4 Sinker行为,使其不将其写入文件,而是写入存储器
我知道我觉得自己已经重复了几次。对于那个很抱歉。
答案 0 :(得分:1)
1)如果将编码后的比特流包装在IMFSample中,则可以只调用IMFStreamSink::ProcessSample。要将其包装在IMFSample
中,请使用MFCreateMemoryBuffer 创建一个内存缓冲区IMFMediaBuffer
,然后使用MFCreateSample创建一个IMFSample
并使用{{ 3}}。然后将其传递到流接收器。另外,如果您可以限制输出比特流的长度,则可以实际使用IMFMediaBuffer
中的基础回忆,方法是使用IMFSample::AddBuffer获取指向基础内存的指针,并将其传递给Intel SDK。
2)通过IMFMediaBuffer::Lock创建MPEG-4接收器时,您传入了MFCreateMPEG4MediaSink实例。您可以创建自己的类来实现此接口,并将数据直接写入内存或任何需要的位置。如果您不想执行完整的实现,那么还有IMFByteStream和MFCreateMFByteStreamOnStream可以将MFCreateMFByteStreamOnStreamEx实例包装到IMFByteStream
中,但我从未使用过它们,不了解底层的内存语义。您可以使用IStream和SHCreateMemStream创建由IStream
支持的内存。
我很早以前就使用过Intel SDK,但是如果我记得它有兼容MFT的编码器,但是我总是使用普通的C ++编码器,因此我不确定它们在配置等方面有何不同。一个有效,那么您可以设置适当的管道,而无需按照(1)所述自行处理位流样本,而只需处理(2)。
从性能角度来看,由于据我所知,英特尔SDK也可以在Direct3D表面上工作,因此您可以研究CreateStreamOnHGlobal以使用Direct3D表面而不是用于存储数据的内存缓冲区。