UWP中如何将多个MediaStreamSource编码为单个文件?音视频录制咨询
解决方案:同时捕获屏幕、系统音频及麦克风输入
UWP 平台实现方案
方案1:改用 MediaCapture 统一捕获(推荐)
如果不需要单独依赖WGC和WASAPI的自定义逻辑,MediaCapture本身支持同时捕获屏幕画面、系统音频和麦克风输入,无需手动合并流:
- 配置
MediaCaptureInitializationSettings,指定VideoDeviceId为屏幕捕获设备(通过GraphicsCaptureItem获取对应设备ID),同时设置AudioDeviceId为系统音频输出设备的回环捕获ID,再添加麦克风作为第二音频输入。 - 初始化MediaCapture后,直接调用
PrepareLowLagRecordToStorageFileAsync或PrepareRecordToStorageFileAsync启动录制,MediaCapture会自动完成音视频流的合并。
方案2:手动合并 WGC 视频流与 WASAPI 音频流
如果必须分开用WGC和WASAPI捕获流,MediaTranscoder不支持多MediaStreamSource,但可以通过以下方式实现:
- 分别从WGC创建视频MediaStreamSource,从WASAPI创建音频MediaStreamSource。
- 使用
MediaEncodingProfile创建包含音视频轨道的输出配置。 - 自定义媒体流合成逻辑:读取两个MediaStreamSource的样本,同步时间戳后,将音视频样本写入同一文件容器(如MP4)。此方式需要手动处理样本同步、时间戳对齐及容器封装,实现复杂度较高。
注意:MediaComposition仅适用于已录制媒体文件的拼接,不支持实时流合并。
Windows Media Foundation (WMF) 平台实现方案
若UWP的限制无法满足需求,WMF提供更灵活的底层控制,支持同时捕获屏幕、系统音频和麦克风:
- 屏幕捕获:通过Windows Graphics Capture API获取屏幕帧,将帧转换为WMF兼容的媒体样本(如IMFMediaBuffer)。
- 音频捕获:
- 系统音频:利用WASAPI的回环模式捕获系统输出音频。
- 麦克风:通过WASAPI的输入模式捕获麦克风音频,可选择将系统音频与麦克风音频混合为单轨,或保留为独立轨道。
- 流合并与录制:使用WMF的Sink Writer(IMFVideoSinkWriter),将视频样本与混合后的音频样本按时间戳同步写入输出文件。Sink Writer支持自定义媒体类型,可轻松处理音视频流的同步与封装。
关键步骤:
- 初始化WMF环境,创建目标媒体类型(视频:H.264,音频:AAC/MP3)。
- 分别启动屏幕捕获、系统音频捕获、麦克风捕获线程,采集媒体样本并对齐时间戳。
- 按需混合音频样本,将音视频样本依次送入Sink Writer,完成文件写入。
内容的提问来源于stack exchange,提问作者sqa
相关产品推荐
相关产品推荐

