所以我有一个应用程序,我从麦克风中读取并将其记录到文件中(在补丁中)。
即使我认为我在一个单独的线程中有OnRecordPositionUpdateListener和所有记录的相关项目,我的主线程UI线程也会变得非常慢。因此,在录制时,我点击屏幕上的按钮会严重延迟。
使用注释掉编码的过程,我将其缩小到我从缓冲区中提取数据的部分。
int samplesRead = recorder.read(audioBuffer, 0, mAudioBufferSampleSize);
不是将数据写入本地内存或其他任何内容(我在尝试找到问题时已将其注释掉)。
有没有人在这里有任何经验,我能做些什么以某种方式减轻阻力?
这是我开始的线程,并在用户点击“开始”按钮后写入录音。
public View.OnClickListener startListener = new View.OnClickListener()
{
int x = 0;
public void onClick(View v)
{
buttonStart.setEnabled(false);
buttonStop.setEnabled(true);
inRecordMode = CURRENT_REC;
if(!bInit)
{
bInit = true;
Thread tSanyo = new Thread(new Runnable()
{
@Override
public void run()
{
final String sPath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/tapes";
try
{
int sampleRate = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
mAudioBufferSize = AudioRecord.getMinBufferSize(sampleRate,
channelConfig, audioFormat);
mAudioBufferSampleSize = mAudioBufferSize * 10;
mAudioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,
sampleRate,
channelConfig,
audioFormat,
mAudioBufferSampleSize);
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
mAudioRecord.setNotificationMarkerPosition(mAudioBufferSampleSize/2);
mAudioRecord.setPositionNotificationPeriod(mAudioBufferSampleSize/2);
OnRecordPositionUpdateListener mListener = new OnRecordPositionUpdateListener()
{
String sTemp;
@Override
public void onMarkerReached(AudioRecord recorder)
{
}
public void onPeriodicNotification(AudioRecord recorder)
{
short[] audioBuffer = new short[mAudioBufferSampleSize];
/////app slows to a crawl as soon as the first
/////recorder.read is called
int samplesRead = recorder.read(audioBuffer, 0, mAudioBufferSampleSize);
}
};
mAudioRecord.setRecordPositionUpdateListener(mListener);
int audioRecordState = mAudioRecord.getState();
if (audioRecordState != AudioRecord.STATE_INITIALIZED)
{
finish();
}
if(mAudioRecord == null)
return;
short[] audioBuffer = new short[mAudioBufferSampleSize];
mAudioRecord.startRecording();
int audioRecordingState = mAudioRecord.getRecordingState();
if(audioRecordingState != AudioRecord.RECORDSTATE_RECORDING)
{
finish();
}
}
});
tSanyo.start();
}
else
{
}
}
};
答案 0 :(得分:0)
您确定它是在单独的线程上运行吗?或者是一个单独的核心,如果你正在运行一个低端的旧式学校设备,你可能会用一个核心停止CPU。
您多久阅读一次样品?如果您在一个while循环中继续读取它们,请考虑给CPU一些松弛,看看它是否有帮助。
通常,您不需要您认为的低延迟音频,但有时Android对于实时音频应用程序来说可能太慢,但不知道您的音频应用程序是什么,我会采取一些猜测。
找出导致CPU或主线程停止的原因和原因的最简单方法是使用分析器,您可以阅读here。
分析器将告诉每个方法执行需要多长时间,但是,如果CPU已经停止,响应启动和停止分析器可能会很慢,但也可以通过编程方式切换。