java - 当另一个服务(如 WebRTC、Twilio)正在使用它时,有没有办法录制音频?
问题描述
我正在尝试在使用 Twilio 拨打电话期间通过麦克风从 Android 手机录制音频。似乎 Twilio 使用 webRTC,因为有几个I/org.webrtc.Logging
条目。我已经缩小了一些与存储、权限和setAudioEncoder()
/setOutputFormat()
调用相关的问题,这个 SO Q/A 表明该错误与使用手机麦克风的另一项服务有关。
尽管如此,是否可以与 webRTC 并行捕获音频,或者是否有某种方法可以连接到音频流?
我尝试了几种配置,但主要是我尝试操纵顺序、类型和设置,这给了我不同程度的成功。下面的代码是据我所知。并且似乎表明我不能因为其他服务使用麦克风。
public void onConnected(Call call) {
setAudioFocus(true);
recorder = new MediaRecorder();
Log.d(TAG, "created recorder");
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Log.d(TAG, "set source");
recorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
Log.d(TAG, "set output");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // TODO: change format, codec
Log.d(TAG, "set codec");
fileName = getExternalCacheDir().getAbsolutePath();
fileName += "/audiorecordtest.aac";
recorder.setOutputFile(fileName);
Log.d(TAG, "set file");
try {
recorder.prepare();
} catch (IOException e) {
Log.e(TAG, "prepare() failed");
}
recorder.start();
Log.d(TAG, "Connected");
activeCall = call;
}
这是 Logcat 输出...
2019-05-20 15:46:04.865 13078-13132/product I/org.webrtc.Logging: WebRtcAudioRecord: startRecording
2019-05-20 15:46:04.870 13078-13163/product I/org.webrtc.Logging: WebRtcAudioRecord: AudioRecordThread@[name=AudioRecordJavaThread, id=563]
2019-05-20 15:46:04.969 13078-13078/product D/CallActivity: created recorder
2019-05-20 15:46:04.972 13078-13078/product D/CallActivity: set source
2019-05-20 15:46:04.972 13078-13078/product D/CallActivity: set output
2019-05-20 15:46:04.973 13078-13078/product D/CallActivity: set codec
2019-05-20 15:46:04.975 13078-13078/product D/CallActivity: set file
2019-05-20 15:46:05.005 13078-13078/product E/MediaRecorder: start failed: -38
2019-05-20 15:46:05.005 13078-13078/product D/AndroidRuntime: Shutting down VM
2019-05-20 15:46:05.006 13078-13078/product E/AndroidRuntime: FATAL EXCEPTION: main
Process: product, PID: 13078
java.lang.IllegalStateException
at android.media.MediaRecorder.start(Native Method)
at product.CallActivity$2.onConnected(CallActivity.java:259)
at com.twilio.voice.Call$1$2.run(Call.java:532)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-05-20 15:46:05.011 13078-13078/product I/Process: Sending signal. PID: 13078 SIG: 9
解决方案
推荐阅读
- c# - 为什么在 C# 中读取 excel 的相同代码不再读取 excel?
- mongodb - mongodb查找文档具有ID以外的文档
- windows - Windows CMD 批处理“if”语句字符串检查有时会区分大小写
- salesforce - SFCC/Demandware 对 OCAPI 的速率限制是多少?
- here-api - HERE.com:为 Javascript 和 REST 生成应用程序代码
- java - 使用 IntelliJ 在 Spring Boot 中自定义应用程序属性
- python - 如何将已注册的过滤器从一个 Django 视图导入到另一个视图?
- scala - 使用 if 语句进行理解的 scala 导致无法理解的编译错误
- airflow - Google Dataflow:导入自定义 Python 模块
- pandas - 使用布尔条件从数据帧中提取数据时出现 ValueError