Media Foundation 将音频流添加到视频文件

Posted

技术标签:

【中文标题】Media Foundation 将音频流添加到视频文件【英文标题】:Media Foundation add audio stream to video file 【发布时间】:2018-07-10 16:37:42 【问题描述】:

我能够成功地对仅包含 H.264 编码视频的MP4 文件进行编码(使用 IMFSinkWriter 接口)。现在我想给它添加一个音频流。

每当我尝试使用以下方法为音频创建接收器编写器时:

MFCreateSinkWriterFromURL(filePath, null, null, &pSinkWriter)

它删除了之前的文件,只写入了音频(嗯,根据this link这是预期的)。

所以我的问题是:如何将音频流添加到仅包含视频流的现有文件中?

或者,如果我同时拥有来自音频和视频的原始数据,我如何将它们都编码到一个媒体文件中(我想我必须做一些称为多路复用的事情。如果是这样,有人可以为我提供有用的参考)吗?

【问题讨论】:

【参考方案1】:

当您执行IMFSinkWriter::BeginWriting 时,Sink Writer API 从头开始​​创建一个媒体文件,直到您执行IMFSinkWriter::Finalize 时最终完成。您不会向最终文件添加新的流(好吧,您可以这样做,但它的工作方式不同 - 请参阅下面的最后一段)。

要创建包含视频和音频的媒体文件,您需要在开始之前添加两个流。两次调用IMFSinkWriter::AddStream,然后是两次IMFSinkWriter::SetInputMediaType,然后您开始编写IMFSinkWriter::BeginWriting,并同时提供视频和音频数据IMFSinkWriter::WriteSample,提供各自的流索引。

要向现有文件添加新流,您需要创建一个全新的文件。您拥有的选项之一是从您拥有的现有文件中读取已经压缩的数据,并使用IMFSinkWriter::WriteSample 方法将其写入新文件,无需重新压缩。同时可以写入第二个流进行压缩。这样,您可以通过从现有文件中获取视频并添加/编码额外的音轨来创建视频和音频 MP4 文件。

【讨论】:

以上是关于Media Foundation 将音频流添加到视频文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Media Foundation 将音频从文件播放到扬声器

在 Windows Media Foundation 中使用 Sink Writer 添加到视频的音频示例

Windows Media Foundation 枚举音频设备

使用 IMFSourceReader 进行音频流式传输(Microsoft Media Foundation)

如何使用 Media Foundation 从 IMFSourceReader 播放音频缓冲区

如何使用 Microsoft Media Foundation 将原始 48khz/32 位 PCM 编码为 FLAC?