Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

13.3. AudioTrack

		
    int sampleRate = 44100;
    int channelConfig = AudioFormat.CHANNEL_OUT_MONO;
    int audioFormat = AudioFormat.ENCODING_PCM_16BIT;		
		
    int buffersize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat);
    private final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfig,
            audioFormat, buffersize, AudioTrack.MODE_STREAM);

    public synchronized void playTrack(byte[] buffer) {
        if (audioTrack != null && audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
            audioTrack.write(buffer, 0, buffer.length);
        }
    }	
		
		

MP3 流

		
    int buffersize = AudioTrack.getMinBufferSize(16000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_MP3);
    private final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 16000, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_MP3, buffersize, AudioTrack.MODE_STREAM);

    public synchronized void playTrack(byte[] buffer) {
        if (audioTrack != null && audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
            audioTrack.write(buffer, 0, buffer.length);
        }
    }		
		
		

AudioTrack 安卓 14 方案

		
		# 老 Android 系统
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRateInHz, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_MP3, buffersize, AudioTrack.MODE_STREAM);
		
		# 老 Android 系统
        audioTrack = new AudioTrack.Builder()
                //1、setAudioAttributes:AudioAttributes 实例,不能为空
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_MEDIA)//setUsage 设置 AudioTrack 的使用场景;
                        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)//setContentType 设置输入的音频文件内容的类型;
                        .build())
                //2、setAudioFormat:AudioFormat是咧 用于描述播放的数据格式,AudioFormat 中包含了编码
                //格式,声道和采样率等,不能为空
                .setAudioFormat(new AudioFormat.Builder()
                        .setEncoding(AudioFormat.ENCODING_PCM_16BIT)//采样格式
                        .setSampleRate(16000)//设置采样率
                        .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)//设置声道
                        .build())
                //3、setTransferMode:int模式二选一 MODE_STATIC 与 MODE_STREAM
                .setTransferMode(AudioTrack.MODE_STREAM)
                //4、setBufferSizeInBytes:int: 用于读取音频数据的内部缓冲区的总大小(以byte为单位)。
                //如果 mode 是 MODE_STATIC ,其为音频最大长度;
                //如果是 MODE_STREAM ,其值要大于等于接收流的最小缓冲区大小,建议使用 getMinBufferSize(int, int, int) 方法来估算 AudioTrack的实例在流模式下的最小缓冲区大小
                .setBufferSizeInBytes(buffersize)
                .build();