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

Media Foundation add audio stream to video file

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

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

MFCreateSinkWriterFromURL(filePath, null, null, &pSinkWriter)

它会删除之前的文件并只写入音频(好吧,根据 this link 预期)。

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

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

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

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

要向现有文件添加新流,您需要创建一个全新的文件。您拥有的选项之一是从现有文件中读取已压缩的数据,然后使用 IMFSinkWriter::WriteSample 方法将其写入新文件而不重新压缩。同时可以写入第二个流进行压缩。通过这种方式,您可以通过从现有文件中获取视频和 adding/encoding 附加音轨来创建视频和音频 MP4 文件。