Media Foundation 将音频流添加到视频文件
Posted
技术标签:
【中文标题】Media Foundation 将音频流添加到视频文件【英文标题】:Media Foundation add audio stream to video file 【发布时间】:2018-07-10 16:37:42 【问题描述】:我能够成功地对仅包含 H.264 编码视频的MP4
文件进行编码(使用 IMFSinkWriter 接口)。现在我想给它添加一个音频流。
每当我尝试使用以下方法为音频创建接收器编写器时:
MFCreateSinkWriterFromURL(filePath, null, null, &pSinkWriter)
它删除了之前的文件,只写入了音频(嗯,根据this link这是预期的)。
所以我的问题是:如何将音频流添加到仅包含视频流的现有文件中?
或者,如果我同时拥有来自音频和视频的原始数据,我如何将它们都编码到一个媒体文件中(我想我必须做一些称为多路复用的事情。如果是这样,有人可以为我提供有用的参考)吗?
【问题讨论】:
【参考方案1】:当您执行IMFSinkWriter::BeginWriting
时,Sink Writer API 从头开始创建一个媒体文件,直到您执行IMFSinkWriter::Finalize
时最终完成。您不会向最终文件添加新的流(好吧,您可以这样做,但它的工作方式不同 - 请参阅下面的最后一段)。
要创建包含视频和音频的媒体文件,您需要在开始之前添加两个流。两次调用IMFSinkWriter::AddStream
,然后是两次IMFSinkWriter::SetInputMediaType
,然后您开始编写IMFSinkWriter::BeginWriting
,并同时提供视频和音频数据IMFSinkWriter::WriteSample
,提供各自的流索引。
要向现有文件添加新流,您需要创建一个全新的文件。您拥有的选项之一是从您拥有的现有文件中读取已经压缩的数据,并使用IMFSinkWriter::WriteSample
方法将其写入新文件,无需重新压缩。同时可以写入第二个流进行压缩。这样,您可以通过从现有文件中获取视频并添加/编码额外的音轨来创建视频和音频 MP4 文件。
【讨论】:
以上是关于Media Foundation 将音频流添加到视频文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Media Foundation 将音频从文件播放到扬声器
在 Windows Media Foundation 中使用 Sink Writer 添加到视频的音频示例
Windows Media Foundation 枚举音频设备
使用 IMFSourceReader 进行音频流式传输(Microsoft Media Foundation)
如何使用 Media Foundation 从 IMFSourceReader 播放音频缓冲区
如何使用 Microsoft Media Foundation 将原始 48khz/32 位 PCM 编码为 FLAC?