Microsoft FileSink Mpeg4

问题描述 投票:1回答:1

我有两个问题

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行为,以便它不会将其写入文件但写入内存

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

mp4 ms-media-foundation encoder mpeg-dash muxer
1个回答
1
投票

1)如果你将编码的比特流包装在IMFSample中,你可以调用IMFStreamSink::ProcessSample。要将它包装在IMFSample中,使用IMFMediaBuffer创建一个内存缓冲区MFCreateMemoryBuffer ,然后使用IMFSample创建一个MFCreateSample并使用IMFSample::AddBuffer添加缓冲区。然后将它传递给流水槽。此外,如果您可以约束输出比特流长度,您可以使用IMFMediaBuffer实际使用IMFMediaBuffer::Lock的基础备忘录,以获取指向底层内存的指针并将其传递给英特尔SDK。

2)当通过MFCreateMPEG4MediaSink创建MPEG-4接收器时,你传入一个IMFByteStream实例。您可以创建自己的类来实现此接口,并将数据直接写入内存或您需要的任何位置。如果你不想做一个完整的实现,还有MFCreateMFByteStreamOnStreamMFCreateMFByteStreamOnStreamEx,可以将IStream实例包装到IMFByteStream但我从来没有使用过那些,我不知道底层的内存语义。您可以使用IStreamSHCreateMemStream创建一个支持内存的CreateStreamOnHGlobal

我很久以前就使用过英特尔SDK,但是如果我记得它有一个兼容MFT的编码器,但我总是使用普通的C ++编程器,因此我不确定它们在配置等方面有何不同。但是如果MFT可以工作,那么你可以设置一个合适的管道而不用自己处理比特流样本,如(1)所述,只需处理(2)。

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

© www.soinside.com 2019 - 2024. All rights reserved.