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 文件。
我能够成功编码 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 文件。