如何在AVAudioPlayer中获取音频片段采样?Xamarin C# Mac端开发问询
解答
AVAudioPlayer能否直接获取采样?
AVAudioPlayer本身没有提供直接读取原始采样数据的属性,它的功能仅覆盖音频播放控制相关的能力,不支持音频数据处理类的需求。
Xamarin.Mac环境下获取采样的实现方案
你可以使用AVFoundation.AVAudioFile搭配AVAudioPCMBuffer来读取WAV文件的采样数据,以下是适配你现有代码的实现示例:
var openDialog = NSOpenPanel.OpenPanel; openDialog.CanChooseFiles = true; openDialog.CanChooseDirectories = false; openDialog.AllowedFileTypes = new string[] { "wav" }; if (openDialog.RunModal() == 1) { var url = openDialog.Urls[0]; if (url != null) { // 打开音频文件 NSError error; var audioFile = new AVAudioFile(url, out error); if (error != null) { // 处理文件打开错误 Console.WriteLine($"打开音频文件失败:{error.LocalizedDescription}"); return; } // 读取音频格式和总帧数 var audioFormat = audioFile.ProcessingFormat; var totalFrames = audioFile.Length; // 初始化PCM缓冲区 var buffer = new AVAudioPCMBuffer(audioFormat, totalFrames); // 将音频数据读入缓冲区 audioFile.Read(buffer, out error); if (error != null) { Console.WriteLine($"读取音频数据失败:{error.LocalizedDescription}"); return; } // 获取采样数据:FloatChannelData返回的是各声道的采样数组 // 单声道音频取下标0,立体声取下标0、1分别对应左右声道 float[] samples = buffer.FloatChannelData.GetArray<float>(0, (int)totalFrames); // 后续处理samples数组即可,每个值为[-1,1]区间的归一化采样值 } }
注:你原有代码里
AVAudioPlayer.FromUrl(file)中的file属于未定义的笔误,上述代码中已经修正为使用选中的url参数。
注意事项
- 上述方案仅适用于未压缩的PCM格式WAV文件,如果你需要处理其他压缩格式的音频,需要先做解码处理
- 如果音频采样位数为16位/24位整数,读取结果会自动归一化为[-1, 1]区间的32位浮点值,不需要额外做格式转换
内容的提问来源于stack exchange,提问作者1.21 gigawatts
相关产品推荐
相关产品推荐

