概述
AudioPlayer 接受 AudioPlayerOptions 参数精细控制输出设备。默认配置适合大多数场景。
using var player = new AudioPlayer(); // 默认配置
using var player = new AudioPlayer(new AudioPlayerOptions { ... });⚠️ 真正跨平台通用的只有
SampleFormat/Channels/SampleRate/ShareMode四项。LatencyMode/Usage/ContentType的效果局限于特定平台,详见各节说明。
AudioPlayerOptions 详解
public class AudioPlayerOptions
{
public SampleFormat SampleFormat { get; init; } = SampleFormat.F32;
public uint Channels { get; init; } = 2;
public uint SampleRate { get; init; } // 0 = 设备原生
public AudioLatencyMode LatencyMode { get; init; } = AudioLatencyMode.Playback;
public AudioPlaybackUsage Usage { get; init; } = AudioPlaybackUsage.Media;
public AudioContentType ContentType { get; init; } = AudioContentType.Music;
public AudioShareMode ShareMode { get; init; } = AudioShareMode.Shared;
public uint PeriodSizeInMilliseconds { get; init; } // 0 = 自动
public uint Periods { get; init; } // 0 = 自动
}各字段详解与平台影响
SampleFormat
值 | 说明 |
|---|---|
| 无符号 8-bit |
| 有符号 16-bit (CD 品质) |
| 有符号 24-bit |
| 有符号 32-bit |
| 32-bit 浮点(默认,推荐) |
✅ 全平台生效。直接传递给 miniaudio 的 ma_device_config.playback.format,控制音频管线的 PCM 数据类型。
Channels
✅ 全平台生效。0 = 设备默认声道数。
SampleRate
✅ 全平台生效。0 = 设备原生采样率。非 0 时 miniaudio 会尝试使用该采样率,若设备不支持则自动重采样。
LatencyMode
public enum AudioLatencyMode
{
LowLatency = 0,
Playback = 1 // 默认
}⚠️
AudioLatencyMode.Playback对应 C 端AUDIO_PERFORMANCE_PROFILE_CONSERVATIVE。命名虽不一致但行为正确。
平台 | LowLatency 效果 |
|---|---|
Windows WASAPI | ✅ 使用事件驱动回调降低延迟 |
Linux ALSA | ❌ 被忽略 |
macOS CoreAudio | ❌ 被忽略 |
Android AAudio | ⚠️ 部分有效,受设备约束 |
Android OpenSL ES | ❌ 被忽略 |
结论:低延迟主要靠调 PeriodSizeInMilliseconds。LatencyMode 仅 Windows 有效。
var player = new AudioPlayer(new AudioPlayerOptions {
LatencyMode = AudioLatencyMode.LowLatency
});Usage
public enum AudioPlaybackUsage
{
Default = 0,
Media = 1, // 默认
Game = 2,
VoiceCommunication = 3,
Notification = 4,
Alarm = 5
}平台 | 映射效果 |
|---|---|
Windows WASAPI | ⚠️ 仅 |
Linux | ❌ 被忽略 |
macOS | ❌ 被忽略 |
Android AAudio | ✅ 映射到 AAudio |
Android OpenSL ES | ✅ 映射到 stream type(media/voice/notification/alarm) |
// Windows: Game 禁用音频增强降延迟
// Android: 系统据此调整音频路由和策略
var player = new AudioPlayer(new AudioPlayerOptions {
Usage = AudioPlaybackUsage.Game
});ContentType
public enum AudioContentType
{
Default = 0,
Music = 1, // 默认
Speech = 2,
Movie = 3,
Sonification = 4
}平台 | 映射效果 |
|---|---|
Windows WASAPI | ❌ 被忽略 |
Linux | ❌ 被忽略 |
macOS | ❌ 被忽略 |
Android AAudio | ✅ 映射到 AAudio |
Android OpenSL ES | ❌ 被忽略 |
结论:ContentType 仅在 Android AAudio 上有效,影响系统音频处理策略。在其他平台设置此字段无效果。
ShareMode
public enum AudioShareMode
{
Shared = 0, // 默认
Exclusive = 1
}平台 | Exclusive 效果 |
|---|---|
Windows WASAPI | ✅ 独占设备,绕过混音器,最低延迟 |
Linux ALSA | ✅ 直接硬件访问 |
macOS CoreAudio | ⚠️ 部分支持 |
Android | ⚠️ 部分设备不支持 |
✅ 跨平台基本有效。独占模式延迟最低,但其他应用无声。
PeriodSizeInMilliseconds / Periods
✅ 全平台生效,但后端可能舍入。0 = 由后端自动选择。
值越小 → 延迟越低 → CPU 越高 → 越可能爆音
总延迟 ≈ PeriodSize × Periods
// 低延迟: 20ms × 2 = 40ms 总缓冲
new AudioPlayerOptions {
PeriodSizeInMilliseconds = 20,
Periods = 2
};
// 稳定: 80ms × 3 = 240ms 总缓冲
new AudioPlayerOptions {
PeriodSizeInMilliseconds = 80,
Periods = 3
};音量控制
player.Volume 属性基于 miniaudio 的 ma_device_set_master_volume,范围 0.0~1.0:
player.Volume = 0.75;实战场景
音乐播放器(默认配置即可)
new AudioPlayer(); // 默认值已是最佳配置游戏音频(低延迟)
new AudioPlayer(new AudioPlayerOptions {
LatencyMode = AudioLatencyMode.LowLatency, // Windows 有效
Usage = AudioPlaybackUsage.Game, // Windows/Android 有效
PeriodSizeInMilliseconds = 30,
Periods = 2
});VoIP 通信
new AudioPlayer(new AudioPlayerOptions {
LatencyMode = AudioLatencyMode.LowLatency,
Usage = AudioPlaybackUsage.VoiceCommunication, // Android 有效
SampleRate = 16000,
PeriodSizeInMilliseconds = 20,
Periods = 2
});高解析度音频(独占模式防重采样)
new AudioPlayer(new AudioPlayerOptions {
ShareMode = AudioShareMode.Exclusive,
SampleRate = 96000 // 设备必须支持
});快速参考
字段 | 跨平台 | 主要影响平台 | 实际效果 |
|---|---|---|---|
SampleFormat | ✅ | 全部 | PCM 数据类型 |
Channels | ✅ | 全部 | 声道数 |
SampleRate | ✅ | 全部 | 输出采样率 |
LatencyMode | ❌ | Windows | WASAPI 事件驱动 |
Usage | ❌ | Android+Win | 音频路由/策略 |
ContentType | ❌ | Android | 音频质量预设 |
ShareMode | ✅ | 全部(有差异) | 独占/共享 |
PeriodSize | ✅ | 全部(可舍入) | 缓冲大小 |
Periods | ✅ | 全部(可舍入) | 缓冲分段数 |
发表评论