You need to enable JavaScript to run this app. 如何在AVAudioPlayer中获取音频片段采样?Xamarin C# Mac端开发问询
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 00:06:03