AudioTrack的理解

采样率说的是一秒钟采样多少点
波形频率说的是一个采样周期内有多少个波形
pcm编码说的是 16 还是8 直接决定write的时候使用short还是byte

‌一、初始化配置

  1. ‌参数设定‌
    需定义音频格式、采样率及缓冲区大小,确保符合硬件支持范围
// 音频参数配置
int sampleRate = 44100;          // 标准采样率
int channelConfig = AudioFormat.CHANNEL_OUT_MONO;  // 单声道
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;  // 16位PCM编码
int bufferSize = AudioTrack.getMinBufferSize(
    sampleRate, 
    channelConfig, 
    audioFormat
);  // 最小缓冲区大小

  1. ‌创建AudioTrack实例‌
    使用流模式(MODE_STREAM)支持实时数据写入
AudioTrack audioTrack = new AudioTrack(
    AudioManager.STREAM_MUSIC,    // 音频流类型
    sampleRate,
    channelConfig,
    audioFormat,
    bufferSize,
    AudioTrack.MODE_STREAM        // 流式模式
);

// 检查初始化状态
if (audioTrack.getState() != AudioTrack.STATE_INITIALIZED) {
    throw new IllegalStateException("AudioTrack初始化失败");
}

二、音频数据生成与写入‌

  1. ‌生成PCM数据‌
    动态创建指定频率的音频波形(如440Hz正弦波)
short[] generateSineWave(int freq, int durationMs) {
    int numSamples = durationMs * sampleRate / 1000;
    short[] buffer = new short[numSamples];
    double angle = 0;
    double delta = 2 * Math.PI * freq / sampleRate;
    
    for (int i = 0; i < numSamples; i++) {
        buffer[i] = (short)(Math.sin(angle) * Short.MAX_VALUE);
        angle += delta;
    }
    return buffer;
}

  1. ‌实时数据写入‌
    通过循环写入实现持续播放
short[] audioData = generateSineWave(440, 1000);  // 生成1秒音频
audioTrack.play();  // 启动播放线程

// 持续写入数据(示例为简单循环)
while (isPlaying) {
    int written = audioTrack.write(
        audioData, 
        0, 
        audioData.length
    );
    if (written != audioData.length) {
        Log.e("AudioTrack", "数据写入不完整");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值