gpt4 book ai didi

android - Android记录和播放

转载 作者:行者123 更新时间:2023-12-03 02:17:49 29 4
gpt4 key购买 nike

我目前正在尝试为Android构建放大器。目的是记录和回放同时记录的内容。我创建了一个线程来解决这个问题。但是,声音变得断断续续。这是我尝试过的。

private class RecordAndPlay extends Thread{
int bufferSize;
AudioRecord aRecord;
short[] buffer;

public RecordAndPlay() {
bufferSize = AudioRecord.getMinBufferSize(22050, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
buffer = new short[bufferSize];

}

@Override
public void run() {
aRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 22050, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

try {
aRecord.startRecording();
} catch (Exception e) {

}
int bufferedResult = aRecord.read(buffer,0,bufferSize);
final AudioTrack aTrack = new AudioTrack(AudioManager.STREAM_MUSIC, samplingRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferedResult, AudioTrack.MODE_STREAM);
aTrack.setNotificationMarkerPosition(bufferedResult);
aTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener() {

@Override
public void onPeriodicNotification(AudioTrack track) {
// TODO Auto-generated method stub

}

@Override
public void onMarkerReached(AudioTrack track) {
Log.d("Marker reached", "...");
aTrack.release();
aRecord.release();
run();

}
});
aTrack.play();
aTrack.write(buffer, 0, buffer.length);

}

public void cancel(){
aRecord.stop();
aRecord.release();

}
}

最佳答案

您的播放不连贯,因为AudioTrack饿了,无法顺利获取数据。在您的代码中,您递归地调用run并为每个标记创建一个新的AudioTrack。相反,只实例化一次AudioRecord和AudioTrack并仅处理它们的事件。另外,为帮助平滑播放,您可能应该在播放之前稍微开始记录,并保持已记录缓冲区的队列。然后,您可以管理将这些缓冲区传递到AudioTrack,并确保始终在每个标记事件上提交新的缓冲区。

关于android - Android记录和播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18022995/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com