首页 文章

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

提问于
浏览
1

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

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

MFCreateSinkWriterFromURL(filePath, null, null, &pSinkWriter)

它删除了以前的文件,只写了音频(好吧,根据预期的this link) .

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

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

1 回答

  • 1

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

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

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

相关问题