【问题标题】:Microsoft FileSink Mpeg4微软文件接收器 Mpeg4
【发布时间】:2019-06-21 22:51:44
【问题描述】:

我有 2 个问题

1)如何将原始数据写入文件接收器。我正在尝试混音。 2)如何确保下沉的数据不是写入文件而是写入内存缓冲区

详细一点:

我正在尝试使用 windows MPEG-4 File Sink 将一些 Intel SDK Encoded avc 或 hevc 写入内存并将其发送到 websocket。

什么是正确的方法?

我可以将原始 hevc 或 avc 作为(字节*,长度)提供给 MPEG-4 文件接收器吗? 或者我是否需要从 Windows Media Frame 工作中将英特尔编码器包装到自定义 Windows Media Foundation 编码器中(好吧,无论如何我都可以使用 GUID 来获取英特尔编码器)。纠正我如果我错了请。

所以我有两个问题,如何将我的原始数据(avc||hevc)写入 MP4 Sinker(由第 3 方编码器编码)

我是否需要实现自定义 Sinker ,以及自定义程度如何。我可以继承MPEG4 Sinker的一部分吗(毕竟我不想为Mp4重新实现一个完整的容器)

或修改 MPEG4 Sinker 行为,使其不将其写入文件而是写入内存

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

【问题讨论】:

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


    【解决方案1】:

    1) 如果您将编码的比特流包装在IMFSample 中,您只需调用IMFStreamSink::ProcessSample。要将其包装在IMFSample 中,请使用MFCreateMemoryBuffer 创建一个内存缓冲区IMFMediaBuffer,然后使用MFCreateSample 创建一个IMFSample,并使用IMFSample::AddBuffer 将缓冲区添加到其中。然后将其传递给流接收器。此外,如果您可以限制输出比特流长度,您实际上可以使用来自IMFMediaBuffer 的底层内存,通过使用IMFMediaBuffer::Lock 来获取指向底层内存的指针并将其传递给英特尔 SDK。

    2) 当通过 MFCreateMPEG4MediaSink 创建 MPEG-4 接收器时,您传入一个 IMFByteStream 实例。您可以创建自己的类来实现此接口并将数据直接写入内存或您需要的任何地方。如果您不想进行完整的实现,还有MFCreateMFByteStreamOnStreamMFCreateMFByteStreamOnStreamEx 可以将IStream 实例包装到IMFByteStream 中,但我从未使用过它们,而且我不知道底层的内存语义。您可以使用SHCreateMemStreamCreateStreamOnHGlobal 创建支持IStream 的内存。

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

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

    【讨论】:

    • 这是完美的。谢谢你。这就是我所需要的。上次我使用 MS 的东西是 DirectShow,它已经有 1000 年的历史了。所以谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2013-01-12
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多