AudioRecord 内存不足异常
AudioRecord Out of Memory Exception
我创建了一个持续读取麦克风输入的对象,但我在使用它时遇到了一些问题。我需要能够暂停和启动它,所以我已经实现了这些方法,但问题是,在较旧的 phone (Galaxy Y) 上,我第一次启动它时效果很好,但之后我暂停它并再次启动它,但由于 OutOfMemoryException,它很快就崩溃了。
@Override
public void run() {
while (mIsRunning) {
synchronized (mThread) {
while (mIsPaused) {
try {
mThread.wait();
} catch (InterruptedException e) {
}
}
}
double sum = 0;
int readSize = mRecorder.read(mBuffer, 0, mBuffer.length);
if (readSize > 0) {
short[] samples = new short[readSize];
for (int i = 0; i < readSize; i++) {
sum += mBuffer[i] * mBuffer[i];
samples[i] = mBuffer[i];
}
final int amplitude = (int) Math.sqrt((sum / readSize));
Message message = new Message();
message.arg1 = amplitude;
message.arg2 = readSize;
message.obj = samples;
message.what = 0;
if (mHandler != null)
mHandler.sendMessage(message);
}
}
}
public void start() {
if (!mIsRunning) {
mIsRunning = true;
mThread.start();
} else synchronized (mThread) {
mIsPaused = false;
mThread.notifyAll();
}
mRecorder.startRecording();
}
public void pause() {
synchronized (mThread) {
mIsPaused = true;
}
mRecorder.stop();
}
因此,第一次一切正常,但在我调用 AudioRecord 上的 stop() 并再次开始读取输入后,我很快 运行 内存不足。有想法该怎么解决这个吗?我在想只是不停止记录,只是不通过处理程序发送数据,但我不知道。谢谢
解决方案是在每次暂停时销毁(并释放)AudioRecord 对象,并在每次开始时重新创建它。
我创建了一个持续读取麦克风输入的对象,但我在使用它时遇到了一些问题。我需要能够暂停和启动它,所以我已经实现了这些方法,但问题是,在较旧的 phone (Galaxy Y) 上,我第一次启动它时效果很好,但之后我暂停它并再次启动它,但由于 OutOfMemoryException,它很快就崩溃了。
@Override
public void run() {
while (mIsRunning) {
synchronized (mThread) {
while (mIsPaused) {
try {
mThread.wait();
} catch (InterruptedException e) {
}
}
}
double sum = 0;
int readSize = mRecorder.read(mBuffer, 0, mBuffer.length);
if (readSize > 0) {
short[] samples = new short[readSize];
for (int i = 0; i < readSize; i++) {
sum += mBuffer[i] * mBuffer[i];
samples[i] = mBuffer[i];
}
final int amplitude = (int) Math.sqrt((sum / readSize));
Message message = new Message();
message.arg1 = amplitude;
message.arg2 = readSize;
message.obj = samples;
message.what = 0;
if (mHandler != null)
mHandler.sendMessage(message);
}
}
}
public void start() {
if (!mIsRunning) {
mIsRunning = true;
mThread.start();
} else synchronized (mThread) {
mIsPaused = false;
mThread.notifyAll();
}
mRecorder.startRecording();
}
public void pause() {
synchronized (mThread) {
mIsPaused = true;
}
mRecorder.stop();
}
因此,第一次一切正常,但在我调用 AudioRecord 上的 stop() 并再次开始读取输入后,我很快 运行 内存不足。有想法该怎么解决这个吗?我在想只是不停止记录,只是不通过处理程序发送数据,但我不知道。谢谢
解决方案是在每次暂停时销毁(并释放)AudioRecord 对象,并在每次开始时重新创建它。