我目前正在开发一个应用程序,它可以在后台运行,并在来电和去电期间将麦克风静音。但是,当有任何类型的音频录制时,我无法将麦克风静音。如果能提供任何解决方案,将会非常有帮助。
提前感谢。
AudioRecorder没有直接的静音方法。我们需要添加一些技巧来静音录音。
我可以做的是,下载无声wav文件并将其转换为字节,然后添加到字节数组中。 当用户点击静音按钮时,isMuteClick = true,取消静音时为false。
while (isStreaming)
{
if(!isMuteClick){
// read() is a blocking call // can set blocking see docs
int bytesRead = recorder.read(readBuffer, 0,bytesReadTotal);
bytesReadTotal += bytesRead; // above ...chunk - bytesReadTotal);
mainBuffer.write(readBuffer, 0, bytesRead);
}else{
int bytesRead = recorder.read(WavToByteArray(R.raw.silence), 0, chunk - bytesReadTotal); // 505 // 4410 //chunk - bytesReadTotal
bytesReadTotal += bytesRead; // above ...chunk - bytesReadTotal);
mainBuffer.write(WavToByteArray(R.raw.silence), 0, bytesRead);
}
} /
以下是将无声WAV文件转换为字节数组的代码
private byte[] WavToByteArray(int resourceId) {
byte[] filteredByteArray = new byte[1024];
try {
InputStream inputStream = this.getResources().openRawResource(resourceId);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] soundBytes = new byte[1024];
int i = Integer.MAX_VALUE;
while ((i = inputStream.read(soundBytes, 0, soundBytes.length)) > 0) {
outputStream.write(soundBytes, 0, i);
}
inputStream.close();
outputStream.close();
// remove .wav header
byte[] audioBytes = outputStream.toByteArray();
filteredByteArray = Arrays.copyOfRange(audioBytes, 44, audioBytes.length);
} catch (Exception e) {
e.printStackTrace();
}
return filteredByteArray;
}
AudioManager::setMicrophoneMute
仅适用于语音通话(和VoIP)。在某些产品上,它可能也会影响录音,但不能保证它会这样做,因此您不能依赖它。
它仍然应该静音语音通话上行,以便其他一方无法听到您正在说什么,即使有正在进行的录音。如果没有,我会认为这是您测试设备实现中的一个错误。但是,您所说的内容最终将出现在您本地进行的录音中(除非您使用VOICE_DOWNLINK
AudioSource)。