奇怪的局面。我使用AudioTrack但没有播放声音....我的代码播放:
private class wPlaySound extends Thread {
@Override
public void run() {
float sampleRate = 8000;
int sampleSizeInBytes = 2;
int samplePerFrame = (int) sampleRate / (1000 / 20); // 20мс
int frameSize = sampleSizeInBytes * samplePerFrame;
int minBuf = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
Log.v("w201", "Buffer Size: " + minBuf);
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBuf * 100, AudioTrack.MODE_STREAM);
at.setStereoVolume(1.0f,1.0f);
at.play();
for (int i = 0; i < position; i = i + frameSize) {
Log.v("w201","write: "+at.write(data, i, frameSize));
}
at.flush();
at.stop();
at.release();
}
}
如果我没有听到噪音或一些不正确的声音我能理解。但我什么也没听到....
编辑:我是如何得到的数据。它并不完美,也不会在所有设备上的工作,但它是我的手机和平板电脑上工作
private class wRecordSound extends Thread {
public boolean stop = false;
public wRecordSound() {
position = 0;
}
@Override
public void run() {
int freq = 8000;
int sampleSizeInBytes = 2;
int samplePerFrame = (int) freq / (1000 / 20); // 20мс
int frameSize = sampleSizeInBytes * samplePerFrame;
final int bufferSize = AudioRecord.getMinBufferSize(freq,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
final AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, freq,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize);
if (audioRecord.getState()!=AudioRecord.STATE_INITIALIZED) {
Log.v("w201","audio recorder not init" );
return;
}
try {
audioRecord.startRecording();
while (!stop) {
position += audioRecord.read(data, position, frameSize);
}
} catch (Exception e) {
e.printStackTrace();
}
audioRecord.stop();
audioRecord.release();
}
}
EDIT2:我发现它开始播放后,才叫做AudioTrack的方法停止声音。但我做什么,如果我需要发挥每一帧?
_loop_
_receive_frame_
at.play
at.write(_one frame_)
at.stop
下面的代码:
at.play();
at.write(data, i, frameSize));
at.flush();
at.stop();
at.release();
将无法正常播放。直到数据被写入到缓冲区中,直到它完成打写入仅几个街区。您需要删除“刷新”,它不应该玩缓冲反正被调用。见下文:
at.play();
at.write(data, i, frameSize));
at.stop();
at.release();
这样站将完成回放。但是如果你需要立即停止,你应该做的:
at.pause();
at.flush();