gpt4 book ai didi

android - setMicrophoneMute(boolean) 在某些设备上不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:00:27 25 4
gpt4 key购买 nike

我在这里找不到任何相关的帖子(但互联网上的其他小帖子),所以这里是:

AudioManager.setMicrophoneMute(boolean) 在我测试过的某些特定设备上不执行任何操作:Google Nexus S、Samsung Galaxy S 和 Motorola Milestone。在任何其他设备上它都运行良好。

它甚至保持其“状态”并返回一个 bool 值,就好像它被静音/取消静音一样,但它不会静音 - 麦克风继续录音 - 无论是在 GSM 调用还是在 AudioRecord 编程录音中。没有指示性日志消息。

我还弄乱了权限(android.permission.MODIFY_AUDIO_SETTINGS、android.permission.RECORD_AUDIO),这里没有新内容。

有其他人遇到过吗?有没有人有解决方法或神奇的解决方案?如果我使用 AudioRecord,我只是为这些设备实现我自己的“静音”——我不会传递录制的缓冲区。但它不能帮助我在 GSM 通话中将麦克风静音,这是我需要的。

谢谢

----------------更新----------------

见下文。

最佳答案

我遇到这个问题是因为我想编辑包含 AAC 音频数据的 M4A 文件。我希望能够合并它们并添加静音作为填充。由于不同设备每帧的毫秒数不同,我决定将麦克风静音并录制一秒钟的静音,然后在我需要静音时一遍又一遍地重复。 (M4A + AAC 静音比原始 PCM 复杂得多)。

不幸的是,我在 Android 设备上遇到了许多静音差异。这是我学到的:

  • 除非您使用 MODIFY_AUDIO_SETTINGS 权限,否则静音将悄无声息地失败。没有错误信息,只是不会静音
  • Samsung Galaxy Tab 10.1 和 Motorola Xoom 的性能符合您的预期。调用 audioManager.setMicrophoneMute(true) 静音,调用 audioManager.setMicrophoneMute(false) 取消静音
  • HTC Inspire(带有 CyanogenMod 7)和摩托罗拉 Droid X 将错误地返回 true 到 audioManager.isMicrophoneMute,但实际上不会被静音。要解决此问题,请在静音之前调用 audioManager.setMode(AudioManager.MODE_IN_CALL)。完成静音后,请务必将模式改回原来的模式——我不确定,但如果您将其设置为不正确的模式,其他应用似乎可能会出现问题。
  • HP Touchpad,被黑到 CyanogenMod 7 双启动,根本不喜欢静音。它会生成无用的录音文件,并且调用 audioManager.setMode() 需要五秒钟才能返回。
  • HTC MyTouch 4G 声称它已静音,但在我能找到的任何情况下都不会自行静音。
  • HTC Flyer 会静音,但只要您调用 mediaRecorder.start() 或 mediaRecorder.stop() 它就会自行取消静音。您可以再次将其静音,但可能会先听到几分之一秒的声音。
  • Gingerbread 设备,无论您是否愿意,在任何 MediaRecorder 录制开始时都会有半秒到一秒的静音。整个录音的长度是正确的,第一部分只是静音,而不是捕捉麦克风当时接收到的内容。

在我的例子中,要生成给定设备使用的每帧毫秒数适当的静音文件(因此在与其他音频文件合并时兼容),我使用类似于以下的代码:

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
int oldAudioMode = audioManager.getMode();
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setMicrophoneMute(true);
MediaRecorder mediaRecorder = new MediaRecorder();
int bitRate = 1000 * 160;
mediaRecorder.setAudioEncodingBitRate(bitRate);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(silenceFile.getAbsolutePath());
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setAudioSamplingRate(44100);
try {
mediaRecorder.prepare();
} catch (IOException ioe) {
throw new RuntimeException("could not prepare mediarecorder to create silence file",ioe);
}
mediaRecorder.start();
audioManager.setMicrophoneMute(true); //re-mute for devices like HTC Flyer that unmute
try {
Thread.sleep(SILENCE_LENGTH_MILLIS);
} catch (InterruptedException ie) {
throw new RuntimeException("could not record silence file", ie);
}
mediaRecorder.stop();
audioManager.setMicrophoneMute(false);
audioManager.setMode(oldAudioMode);
int currentVersion = android.os.Build.VERSION.SDK_INT;
if (currentVersion <= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
//cut out beginning half second and use that, since it's always silent on Gingerbread
} else {
//Honeycomb and up
//Take end of audio and use that--if the device unmuted itself there may be a little noise at the beginning
}

这是一个完整的解决方案吗?不会。有些设备不会静音。其他设备,如前面提到的 HP Touchpad,即使您尝试静音也会导致所有新问题。希望这些提示至少能帮助人们在大多数 Android 设备上静音。

关于android - setMicrophoneMute(boolean) 在某些设备上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217437/

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