如何使用C# MediaCapture录制两路音频输入与一路视频输入
C# 双音频输入+单视频采集实现方案
方案1:AudioGraph + MediaStreamSource 混合录制
核心思路是绕开MediaCapture直接绑定单一音频设备的限制,自己用AudioGraph完成双路音频混音后输出到自定义媒体流,再交给MediaCapture录制,全程不会触发音频外放,音质可控。
- 初始化AudioGraph时禁用默认输出设备,避免声音外放:
var graphSettings = new AudioGraphSettings(AudioRenderCategory.Media); graphSettings.PrimaryRenderDevice = null; // 禁用默认渲染输出 CreateAudioGraphResult graphResult = await AudioGraph.CreateAsync(graphSettings); AudioGraph audioGraph = graphResult.Graph;
- 分别为摄像头麦克风、独立麦克风创建输入节点,挂载到同一子混音节点完成混音:
// 提前枚举获取两个音频设备的DeviceInformation对象 var webcamAudioInput = await audioGraph.CreateDeviceInputNodeAsync(MediaCategory.Media, audioGraph.EncodingProperties, webcamAudioDevice); var standaloneMicInput = await audioGraph.CreateDeviceInputNodeAsync(MediaCategory.Media, audioGraph.EncodingProperties, standaloneMicDevice); AudioSubmixNode submixNode = audioGraph.CreateSubmixNode(); webcamAudioInput.AddOutgoingConnection(submixNode); standaloneMicInput.AddOutgoingConnection(submixNode);
- 创建音频帧输出节点接收混音数据,结合摄像头视频流构造MediaStreamSource,交给MediaCapture录制:
AudioFrameOutputNode audioOutputNode = audioGraph.CreateFrameOutputNode(); submixNode.AddOutgoingConnection(audioOutputNode); // 构造音视频流描述符,绑定音频帧输出回调、摄像头视频采集回调到MediaStreamSource MediaStreamSource mediaSource = new MediaStreamSource(videoStreamDesc, audioStreamDesc); // 后续直接用MediaCapture编码MediaStreamSource即可输出包含双路音频的录制文件
方案2:FFmpeg 直接采集封装
如果不需要完全依赖WinRT原生API,可以引入FFmpeg.AutoGen绑定库,直接通过FFmpeg API指定3个输入设备(2路音频+1路视频),在FFmpeg层完成音频混音和音视频封装。该方案开发成本更低,支持的输出格式更丰富,只需将FFmpeg官方二进制文件随同应用打包即可。
方案3:虚拟音频设备
如果必须使用原生MediaCapture的设备绑定逻辑,无需自己从零开发驱动,可直接采用成熟的开源虚拟音频设备驱动,安装后将两个麦克风的音频路由到虚拟音频设备的输入,再将MediaCapture的AudioDeviceId指定为虚拟音频设备的ID即可实现双路音频采集,缺点是需要用户额外安装驱动组件。
内容的提问来源于stack exchange,提问作者GreenDragon
相关产品推荐
相关产品推荐

