1、android音频通道
android系统按照使用场景的不同,区分不同的通道模式,主要有媒体音,通话音和铃声。媒体音主要应用于音乐和视频播放的,具有高清晰度的特点。通话音主要用于语音通话的场景,具有背景降噪、回声消除,自动增益的3A算法,但在音质方面相比媒体音较差,采样率低于16k。android应用开发切换两种音频通道的代码如下:
AudioManage audiomanage = context.getSystemService(Context.AUDIO_SERVICE)
audiomanage.mode = AudioManager.MODE_NORMAL ; //媒体音
audiomanage.mode = AudioManager.MODE_IN_COMMUNICATION ; //通话音
同时在创建AudioTrack时,将streamType置为STREAM_VOICE_CALL
2、音频播放
系统上层提供音频播放的 API: AudioTrack,另外如果是c++开发,安卓系统也支持OpenSL的音频播放协议。下面将介绍AudioTrack,AudioTrack是java层音频播放接口,其提供了音频播放,音频流样式选择,音量调节、和音频设备选择功能。
2.1、音频播放
首先创建AudioTrack实例
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.setLegacyStreamType(AudioManager.STREAM_MUSIC) //媒体音
.build();
AudioFormat audioFormat = new AudioFormat.Builder()
.setSampleRate(48000) //采样率48k
.setEncoding(AudioFormat.ENCODING_PCM_16BIT) //PCM_16位编码格式
.setChannelMask(AudioFormat.CHANNEL_IN_STEREO) //双声道
.build();
AudioTrack audioTrack = new AudioTrack(audioAttributes, audioFormat, 1024,
AudioTrack.MODE_STREAM, AudioManager.AUDIO_SESSION_ID_GENERATE);
if (audioTrack.getPlayState() != AudioTrack.PLAYSTATE_PLAYING) {
audioTrack.play();
}
2.2 播放
//同步写数据
byte[] audioData = new byte[1024];
audioTrack.write(audioData, 0, 1024);
2.3 调节音量
audioTrack.setVolume(1); //设置音量
2.4 设置音频设备
AudioManager audioManager = context.getSystemService(Context.AUDIO_SERVICE);
AudioDeviceInfo[] audioDeviceInfos = audioManager.getDevices(AudioManager.GET_DEVICES_ALL);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
audioTrack.setPreferredDevice(audioDeviceInfos[0])
}
2.5 释放播放器
audioTrack.flush();
audioTrack.release(); //释放