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

时间:2018-07-10 16:37:42

标签: c++ winapi audio video ms-media-foundation

我能够成功编码仅包含H.264编码视频的MP4文件(使用 IMFSinkWriter 界面)。现在,我想向其中添加音频流。

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

MFCreateSinkWriterFromURL(filePath, null, null, &pSinkWriter)

它删除先前的文件并仅写入音频(嗯,根据this link,这是所期望的)。

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

或者,如果我同时拥有音频和视频中的原始数据,该如何将它们都编码为一个媒体文件(我想我必须做一个称为“多路复用”的操作。如果这样,有人可以为我提供有用的参考)吗? / p>

1 个答案:

答案 0 :(得分:1)

Sink Writer API从执行IMFSinkWriter::BeginWriting到创建IMFSinkWriter::Finalize时从头开始创建媒体文件。您无需将新的流添加到最终文件中(可以,但是可以以不同的方式工作-请参阅下面的最后一段)。

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

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