我能够成功编码仅包含H.264编码视频的MP4
文件(使用 IMFSinkWriter 界面)。现在,我想向其中添加音频流。
每当我尝试使用以下方法为音频创建接收器编写器时:
MFCreateSinkWriterFromURL(filePath, null, null, &pSinkWriter)
它删除先前的文件并仅写入音频(嗯,根据this link,这是所期望的)。
所以我的问题是:如何将音频流添加到仅包含视频流的现有文件中?
或者,如果我同时拥有音频和视频中的原始数据,该如何将它们都编码为一个媒体文件(我想我必须做一个称为“多路复用”的操作。如果这样,有人可以为我提供有用的参考)吗? / p>
答案 0 :(得分:1)
Sink Writer API从执行IMFSinkWriter::BeginWriting
到创建IMFSinkWriter::Finalize
时从头开始创建媒体文件。您无需将新的流添加到最终文件中(可以,但是可以以不同的方式工作-请参阅下面的最后一段)。
要创建同时包含视频和音频的媒体文件,需要在开始之前添加两个流。两次调用IMFSinkWriter::AddStream
,然后两次调用IMFSinkWriter::SetInputMediaType
,然后开始写IMFSinkWriter::BeginWriting
,并同时提供视频和音频数据IMFSinkWriter::WriteSample
,以提供各自的流索引。
要将新的流添加到现有文件中,您需要创建一个全新的文件。您拥有的一种选择是从现有的文件中读取已压缩的数据,然后使用IMFSinkWriter::WriteSample
方法将其写入新文件,而无需重新压缩。同时,可以写入第二个流进行压缩。这样,您可以通过从现有文件中获取视频并添加/编码其他音轨来创建视频和音频MP4文件。