AudioTrack 一般用来实现播放原始音频数据(PCM)
public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,
int bufferSizeInBytes, int mode);
/** 默认声音 **/
public static final int DEFAULT = 0;
/** 麦克风声音 */
public static final int MIC = 1;
/** 通话上行声音 */
public static final int VOICE_UPLINK = 2;
/** 通话下行声音 */
public static final int VOICE_DOWNLINK = 3;
/** 通话上下行声音 */
public static final int VOICE_CALL = 4;
/** 根据摄像头转向选择麦克风*/
public static final int CAMCORDER = 5;
/** 对麦克风声音进行声音识别,然后进行录制 */
public static final int VOICE_RECOGNITION = 6;
/** 对麦克风中类似ip通话的交流声音进行识别,默认会开启回声消除和自动增益 */
public static final int VOICE_COMMUNICATION = 7;
/** 录制系统内置声音 */
public static final int REMOTE_SUBMIX = 8;
streamType 这个参数表示使用哪种音频管理策略
STREAM_VOCIE_CALL 电话声音
STREAM_SYSTEM 系统声音
STREAM_RING 铃声
STREAM_MUSCI 音乐声
STREAM_ALARM 警告声
STREAM_NOTIFICATION 通知声
sampleRateInHz, 采样率
channelConfig, 声道数
audioFormat, 量化精度
bufferSizeInBytes, 缓存大小
mode 播放模式:一种是static方式,另一种是streaming方式。
static方式:需要一次性将所有的数据都写入播放缓冲区,适合播放铃声,较短的音频片段。
streaming方式:按照一定的时间间隔不间断的写入音频数据。(常用这种方式)
private AudioTrack track;
// 音频获取源
private int audioSource = MediaRecorder.AudioSource.MIC;
// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
private static int sampleRateInHz = 8000;
//private static int sampleRateInHz = 44100;
// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
private static int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
// 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 缓冲区字节大小
private static final int AUDIO_FREQUENCY = 44100;
int bufferSize = AudioTrack.getMinBufferSize(sampleRateInHz,
channelConfig, audioFormat);
track = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
sampleRateInHz,
channelConfig, audioFormat, bufferSize,
AudioTrack.MODE_STREAM);
audioTrack.play();
开启子线程,向AudioTrack缓冲区写入数据
AudioTrackPlayThread()
{
setPriority(Thread.MAX_PRIORITY);//设置线程拥有的最大优先级
byte[] CallBackVoice;
state = WindState.PLAYING;
//notifyState(state);
try {
track.play();
while (state.equals(WindState.PLAYING) &&
track != null) {
CallBackVoice = MainActivity.voice_stream();
track.write(CallBackVoice, 0, CallBackVoice.length);
Log.d("lsx test", "CallBackVoice.length: " + CallBackVoice.length + ", CallBackVoice: " + Arrays.toString(CallBackVoice));
}
track.stop();
track.release();
} catch (Exception e) {
Log.e(TAG, "AudioTrackPlayThread:", e);
//notifyState(WindState.ERROR);
}
state = WindState.STOP_PLAY;
//notifyState(state);
state = WindState.IDLE;
//notifyState(state);
}
}
需要在xml之中申请权限,要储存声音需要存储权限,读取声音需要录音权限
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
<!-- 读取声音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />