冲洗接收器写入器以防止将所有样本加载到内存中?

Flush sink writer to prevent loading all samples into memory?

是否可以将接收器编写器的当前进度刷新到文件中?类似于 IMFSinkWriter::Finalize,但仍允许写入样本。目前,我必须将所有示例写入 SinkWriter,然后完成。但是,这意味着所有样本都需要加载到内存中。

我正在将压缩的 H264 帧写入 MP4 输出容器。

IMFSinkWriter 使用 MFCreateSinkWriterFromURL 附加到 IMFByteStream。我在每个 IMFSinkWriter::WriteSample 之后都尝试过 IMFByteStream::Flush,尽管这似乎没有任何作用。

媒体基金会接收器不应该将样本加载到内存中,因此标语问题首先是不正确的。对此没有直接的答案,或者,如果需要一个简短的答案,那么答案是“否”。

这一挑战背后的重要部分是生成的数据流(通常是文件)的结构和中断它的能力,然后从中点继续。此行为是特定于格式的,因此将问题缩小到感兴趣的格式很重要。您提到了 MP4,Windows 为 MP4 提供了两个接收器:用于常规 MP4 文件和所谓的碎片化 MP4 文件。两者都不能以次要作品单独播放的方式刷新和继续。

也许解决上述刷新和从新文件恢复任务的最简单方法是实施自定义媒体基础 Media Sink。该软件项目可以通过启动具有真实 MP4 接收器的辅助管道和输出文件来积累数据和“刷新”,或者它可以替代地实现 MP4 相关规范并生成构成 MP4 文件的 boxes/atoms。或者,它也可以嵌入一些第三方API或库来达到类似的效果。