代码之家  ›  专栏  ›  技术社区  ›  Evren Bingøl

Microsoft文件链接MPEG4

  •  1
  • Evren Bingøl  · 技术社区  · 6 年前

    我有两个问题

    1)如何将原始数据写入文件接收器。我在试着静音。 2)如何确保不将插入的数据写入文件,而是写入内存缓冲区

    所以详细地说:

    我尝试使用Windows MPEG-4文件接收器将一些Intel SDK编码的AVC或HEVC写入内存并发送到WebSocket。

    正确的方法是什么?

    我可以将原始HEVC或AVC作为(字节*,长度)馈送到MPEG-4文件接收器吗? 或者我需要将英特尔编码器封装到自定义的Windows Media Foundation编码器(我可以只使用GUID来从英特尔媒体框架中获得英特尔编码器)。如果我错了请纠正我。

    所以我有两个问题,如何将原始数据(avc hevc)写入mp4 sinker(由第三方编码器编码)

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

    或者修改mpeg4 sinker行为,使其不写入文件,而是写入内存

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Rudolfs Bundulis    6 年前

    1)如果将编码的比特流包装在 IMFSample 你可以打电话 IMFStreamSink::ProcessSample . 把它包在 IMFSample ,创建内存缓冲区 IMFMediaBuffer 具有 MFCreateMemoryBuffer ,然后创建 imfSimple 具有 MFCreateSample 并添加缓冲区 IMFSample::AddBuffer . 然后把它传给水槽。此外,如果您可以限制输出位流长度,那么实际上可以使用来自 IMF中介器 通过使用 IMFMediaBuffer::Lock 获取指向底层内存的指针并将其传递给Intel SDK。

    2)创建MPEG-4接收器时,通过 MFCreateMPEG4MediaSink 你通过了 IMFByteStream 实例。您可以创建自己的类来实现这个接口,并将数据直接写入内存或任何需要的地方。如果您不想进行完整的实现,那么 MFCreateMFByteStreamOnStream MFCreateMFByteStreamOnStreamEx 它可以包装一个 IStream 实例转化为 IMFByteStream 但是我从未使用过这些,我也不知道底层的内存语义。您可以创建一个内存备份 IStream 具有 SHCreateMemStream CreateStreamOnHGlobal .

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

    另外,从性能上讲,据我所知,Intel SDK也在Direct3D表面上工作,因此您可以研究 MFCreateDXSurfaceBuffer 使用Direct3D曲面而不是内存缓冲区来包装数据。

    推荐文章