UWP中如何使用MediaPlayer将电台音频流保存为MP3文件?
实现MediaPlayer音频流录制为MP3的方案
嘿Christian,我之前做过类似的Windows 10电台应用录制功能,用Windows.Media.Playback.MediaPlayer的话,确实没有直接获取音频字节的现成属性或事件,但可以通过AudioGraph来对接MediaPlayer的输出,再编码成MP3文件,下面是具体的实现步骤和代码示例:
核心思路
利用Windows.Media.Audio.AudioGraph搭建音频处理管线:将MediaPlayer的输出作为AudioGraph的输入节点,再添加一个支持MP3编码的文件输出节点,实现实时录制。
步骤1:配置权限
首先在你的Package.appxmanifest里添加必要的权限:
- 勾选麦克风(虽然我们是捕获应用内音频,但部分场景下需要这个权限)
- 添加后台媒体录制能力(如果需要后台录制的话)
步骤2:初始化AudioGraph并对接MediaPlayer
下面是关键的代码片段:
private AudioGraph _audioGraph; private MediaPlayerAudioInputNode _playerInputNode; private FileOutputNode _mp3OutputNode; private MediaPlayer _mediaPlayer; // 你的现有MediaPlayer实例 // 初始化录制管线 private async Task InitializeRecordingPipeline() { // 1. 创建AudioGraph设置 var settings = new AudioGraphSettings(AudioRenderCategory.Media); var result = await AudioGraph.CreateAsync(settings); if (result.Status != AudioGraphCreationStatus.Success) { // 处理创建失败的情况 return; } _audioGraph = result.Graph; // 2. 将MediaPlayer接入AudioGraph作为输入节点 var playerInputResult = await _audioGraph.CreateMediaPlayerAudioInputNodeAsync(_mediaPlayer); if (playerInputResult.Status != MediaPlayerAudioInputNodeCreationStatus.Success) { // 处理节点创建失败 return; } _playerInputNode = playerInputResult.Node; // 3. 创建MP3格式的文件输出节点 var filePicker = new FileSavePicker(); filePicker.FileTypeChoices.Add("MP3 文件", new List<string> { ".mp3" }); filePicker.SuggestedFileName = $"电台录制_{DateTime.Now:yyyyMMddHHmmss}"; var outputFile = await filePicker.PickSaveFileAsync(); if (outputFile == null) return; // 配置MP3编码属性 var mp3EncodingProfile = MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High); var fileOutputResult = await _audioGraph.CreateFileOutputNodeAsync(outputFile, mp3EncodingProfile); if (fileOutputResult.Status != FileOutputNodeCreationStatus.Success) { // 处理输出节点创建失败(比如编码器缺失,N版本Windows需安装媒体功能包) return; } _mp3OutputNode = fileOutputResult.Node; // 4. 连接输入节点到输出节点 _playerInputNode.AddOutgoingConnection(_mp3OutputNode); }
步骤3:控制录制启停
// 开始录制 public void StartRecording() { _audioGraph.Start(); _mp3OutputNode.Start(); } // 停止录制 public async Task StopRecording() { _audioGraph.Stop(); _mp3OutputNode.Stop(); await _mp3OutputNode.FinalizeAsync(); // 确保文件写入完成 }
注意事项
- 如果你的应用运行在Windows 10 N/KN版本,可能需要手动安装媒体功能包才能使用MP3编码器
- 录制过程中要注意处理MediaPlayer的播放状态变化(比如暂停、切换曲目),可以监听
MediaPlayer.PlaybackSession.PlaybackStateChanged事件来同步录制状态 - 如果需要后台录制,还需要配置后台任务,并确保AudioGraph在后台保持活动
希望这个方案能帮到你!
内容的提问来源于stack exchange,提问作者TiMeJuMp
相关产品推荐
相关产品推荐

