Microsoft FileSink Mpeg4

时间:2019-01-28 21:16:24

标签: mp4 ms-media-foundation encoder mpeg-dash muxer

我有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行为,使其不将其写入文件,而是写入存储器

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

1 个答案:

答案 0 :(得分:1)

1)如果将编码后的比特流包装在IMFSample中,则可以只调用IMFStreamSink::ProcessSample。要将其包装在IMFSample中,请使用MFCreateMemoryBuffer 创建一个内存缓冲区IMFMediaBuffer,然后使用MFCreateSample创建一个IMFSample并使用{{ 3}}。然后将其传递到流接收器。另外,如果您可以限制输出比特流的长度,则可以实际使用IMFMediaBuffer中的基础回忆,方法是使用IMFSample::AddBuffer获取指向基础内存的指针,并将其传递给Intel SDK。

2)通过IMFMediaBuffer::Lock创建MPEG-4接收器时,您传入了MFCreateMPEG4MediaSink实例。您可以创建自己的类来实现此接口,并将数据直接写入内存或任何需要的位置。如果您不想执行完整的实现,那么还有IMFByteStreamMFCreateMFByteStreamOnStream可以将MFCreateMFByteStreamOnStreamEx实例包装到IMFByteStream中,但我从未使用过它们,不了解底层的内存语义。您可以使用IStreamSHCreateMemStream创建由IStream支持的内存。

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

从性能角度来看,由于据我所知,英特尔SDK也可以在Direct3D表面上工作,因此您可以研究CreateStreamOnHGlobal以使用Direct3D表面而不是用于存储数据的内存缓冲区。