mp4 - 微软 FileSink Mpeg4

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

我有 2 个问题

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

详细说明:

我正在尝试使用 Windows MPEG-4 文件接收器将一些 Intel SDK 编码的 avc 或 hevc 写入内存并将其发送到 websocket。

什么是正确的方法?

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

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

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

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

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

最佳答案

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

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

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

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

关于mp4 - 微软 FileSink Mpeg4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54410411/

相关文章:

c++ - Media Foundation 捕获的视频是垂直镜像的

audio - Windows Media Foundation中的EVR的自定义演示者

ffmpeg - ffmpeg 编码后,AVPacket pts 和 dts 为 AV_NOPTS_VALUE

java - 使用编码器和操纵杆直线驱动机器人

PHP 文件上传不适用于 mp4

ubuntu - 使用 Ubuntu 将所有视频编码为 MP4 并降低分辨率

c++ - 在 Windows 7 上使用 Windows Media Foundation 将原始音频文件转换为 AAC

java - 如何使用 OWASP 编码器项目规范化内容

php - ffmpeg 编码 mpeg

android - 如何使用我的 Android 应用程序的 Intent 播放视频 mp4?这个有可能?