我正在开发一个 WebRTC 流媒体应用程序。这个想法是从麦克风捕获信号,进行一些实时 C/C++ 处理 (JNI),并将处理后的信号流式传输到服务器。当应用程序处于前台时,该过程按预期工作。但是,它开始滞后,应用程序进入后台的那一刻,或者当我锁定手机时。
我已将优先级设置为 Process.THREAD_PRIORITY_URGENT_AUDIO 但它仍然滞后。对于如何解决滞后问题,我们将不胜感激。
private class AudioRecordThread extends Thread {
private volatile boolean keepAlive = true;
public AudioRecordThread(String name) {
super(name);
}
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
Logging.d(TAG, "AudioRecordThread" + WebRtcAudioUtils.getThreadInfo());
assertTrue(audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING);
// Audio recording has started and the client is informed about it.
doAudioRecordStateCallback(AUDIO_RECORD_START);
// do some C/C++ processing
long st_time = System.currentTimeMillis();
res = org.webrtc.audio.AudioEngine.processBuffer(100*num_buffers, containerBufferShort);
Log.i("process_time", String.valueOf(System.currentTimeMillis()-st_time));
nativeDataIsRecorded(nativeAudioRecord, bytesRead);
}
}
Update1:我注意到当应用程序在后台时,process_time(C/C++ 代码处理音频缓冲区的时间)变成了两倍。我不明白这种行为!
更新 2:此行为不会在 Android 模拟器上发生,但会在我的实际 Android 设备(OnePlus Nord N200)上发生
Update3:正如@emandt 所建议的,我在前台和后台模式下分析了 CPU 使用率。CPU 利用率保持不变,而功耗明显下降。这可能表明应用程序在后台时 CPU 时钟速度受到限制?