一. 从AudioTrack类说起
AudioTrack适用于解码后的PCM流数据格式,参考AudioTrack类的最基本构造器的参数列表:
public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode){ ... } |
streamType参数定义在AudioSystem类中, 由AudioManager类向app层返还调用
frameworks/base/media/java/android/media ... ... public static final int STREAM_DEFAULT = -1; //默认的audio流以及音量 public static final int STREAM_VOICE_CALL = 0; //通话中 public static final int STREAM_SYSTEM = 1; //系统提示音(低电量,锁屏) public static final int STREAM_RING = 2; //来电铃声,短信声 public static final int STREAM_MUSIC = 3; //音乐播放声 public static final int STREAM_ALARM = 4; //警报声 public static final int STREAM_NOTIFICATION = 5; //消息提示音 public static final int STREAM_BLUETOOTH_SCO = 6; //通话中,连接上蓝牙 public static final int STREAM_SYSTEM_ENFORCED = 7; //某些国家强制规定的系统提示音 public static final int STREAM_DTMF = 8; //双向多频拨号盘,拨号声 public static final int STREAM_TTS = 9; //麦克风输入声 public static final int STREAM_ACCESSIBILITY = 10; //可扩展的其他声音 ... ... |
sampleRateInHz,声音采样频率,介于4000-44100Hz即可
channelConfig参数定义在AudioFormat类中,如下
... ... public static final int CHANNEL_CONFIGURATION_INVALID = 0; //非法无效的channel配置 ... ... |
audioFormat参数也在AudioFormat类中,不仅包含了PCM流格式,还包含了编码格式
... ... public static final int ENCODING_PCM_16BIT = 2; // 16bit/点进行采样 ... ... |
bufferSize参数定义在AudioTrack类中,对每次写入缓冲区的数据大小进行限制,并初步判定sampleRateInHz, channelConfig以及audioFormat输入是否合理:
... ... static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat){ ... } ... ... |
mode参数定义在AudioSystem类中,设定手机所处状态
... ... public static final int MODE_INVALID = -2; //非法无效模式配置 public static final int MODE_IN_COMMUNICATION = 3; //通话模式 ... ... |
二. AudioTrack 样例
我们以双声道,8000Hz采样频率,播放音乐作为预设条件
int mBufferSize = AudioTrack.getMinBufferSize( ); AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, mBufferSize, AudioSystem.MODE_NORMAL); mAudioTrack.play(); byte[] audiodata = new byte[100]; ... ... //初始化audiodata mAudioTrack.write(audiodata, 0, audiodata.length) //取决于要写入多少audiodata mAudioTrack.stop(); mAudioTrack.release(); //释放AudioTrack资源,否则不容易被GC回收 |