媒体基础 SinkWriter (MP4 FastStart)

Posted

技术标签:

【中文标题】媒体基础 SinkWriter (MP4 FastStart)【英文标题】:Media Foundation SinkWriter (MP4 FastStart) 【发布时间】:2014-12-27 15:38:15 【问题描述】:

我正在使用 Media Foundation 在经过一系列过滤器后从输入 MP4 创建 MP4 (H264 + AAC) 输出文件。视频的创建工作完美,视频在本地复制没有问题。问题是,当远程执行(通过网络播放器甚至 VLC)时,视频在完全下载之前不会开始播放。

我检查并确认托管该文件的 http 网站支持 Accepts-Ranges 标头字段,一段时间后我发现问题的发生是因为该文件尚未使用允许的“快速启动”标志创建渐进式下载视频。

我试图在网上搜索解决方案,但我一直无法找到一种方法来使用 Media Foundation 的 Sinkwriter 应用该标志。任何的想法? (我不能使用任何外部应用程序来执行此操作,因为此代码将在 Windows 应用商店环境中运行)

【问题讨论】:

【参考方案1】:

渐进式下载要求在 MPEG-4 文件中 moov 框位于 mdat 框之前,这通常需要在生成文件时进行额外的工作,这不是 Media Foundation 的默认行为。

媒体基金会介绍了MF_MPEG4SINK_MOOV_BEFORE_MDAT attribute 来处理这个问题:

mpeg4 媒体接收器的默认行为是在之后写入 'moov' 'mdat' 框。设置此属性会导致生成的文件写入 'mdat' 框之前的'moov'。

为了让 mpeg4 sink 使用这个属性,字节流 传入的不能是slow seek或者remote for。

此功能涉及额外的文件复制/重新混合。

注意最低要求。或者,您需要对文件进行后处理以将moov 框移到开头。

另见:

How to generate "moov before mdat" MP4 video files with Media Foundation

【讨论】:

谢谢,该标志在我的情况下不起作用,我最终编写了一个小型 MP4 解析器并在 MDAT 之前手动移动 MOOV(也更改了 STCO 的偏移量)

以上是关于媒体基础 SinkWriter (MP4 FastStart)的主要内容,如果未能解决你的问题,请参考以下文章

如何将音频添加到使用 SinkWriter 创建的 mp4 文件中?

MF SinkWriter mp4 文件的播放持续时间是添加音频样本时的一半时间,图像的播放速度也快两倍

从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称

MF SinkWriter 写入样本失败

媒体基础 MP4 编码:IMFSinkWriter 不接受 PCM 输入

流媒体开发7ffmpeg基础命令