android - 如何在 android 设备中录制内部音频 [root/no root]
问题描述
我在录制屏幕表面时使用并尝试了 MediaRecorder.AudioSource.REMOTE_SUBMIX,应用程序由于权限问题而崩溃,在 HTC 10 [根植于其中安装了superSu ] 中进行了测试。
虽然它适用于以下输入:
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
我想在不使用麦克风的情况下录制系统的内部/输出音频。要求:我需要记录屏幕的活动以及音频(不使用麦克风),当屏幕录像机打开时,如果播放 youtube 我需要记录它的音频以及屏幕活动(不使用麦克风)。我只面临音频部分的挑战,请建议
private void initRecorder() {
try {
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.REMOTE_SUBMIX);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mMediaRecorder.setOutputFile(Environment
.getExternalStoragePublicDirectory(Environment
.DIRECTORY_DOWNLOADS) + "/video.mp4");
mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
mMediaRecorder.setVideoFrameRate(30);
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int orientation = ORIENTATIONS.get(rotation + 90);
mMediaRecorder.setOrientationHint(orientation);
mMediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
开始录制会弹出一个权限对话框,同时创建以下 Logcat 条目
2020-01-27 12:38:19.463 3958-3958/com.truiton.screencapture E/MediaRecorder: prepare failed: -2147483648
单击立即开始(用户的许可)会使应用程序崩溃并显示以下 logcat 输出
2020-01-27 12:55:09.174 12787-12787/com.truiton.screencapture E/MediaRecorder: start called in an invalid state: 0
2020-01-27 12:55:09.178 12787-12787/com.truiton.screencapture E/MediaRecorder: Failed to start recording
java.lang.IllegalStateException
at android.media.MediaRecorder._start(Native Method)
at android.media.MediaRecorder.start(MediaRecorder.java:1063)
at com.truiton.screencapture.MainActivity.onActivityResult(MainActivity.java:122)
at android.app.Activity.dispatchActivityResult(Activity.java:7246)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4577)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4631)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1699)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:180)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:835)
2020-01-27 12:55:09.183 12787-12787/com.truiton.screencapture E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.truiton.screencapture, PID: 12787
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1000, result=-1, data=Intent { (has extras) }} to activity {com.truiton.screencapture/com.truiton.screencapture.MainActivity}: java.lang.IllegalStateException
at android.app.ActivityThread.deliverResults(ActivityThread.java:4581)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4631)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1699)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:180)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:835)
Caused by: java.lang.IllegalStateException
at android.media.MediaRecorder._start(Native Method)
at android.media.MediaRecorder.start(MediaRecorder.java:1063)
at com.truiton.screencapture.MainActivity.onActivityResult(MainActivity.java:122)
at android.app.Activity.dispatchActivityResult(Activity.java:7246)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4577)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4631)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1699)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:180)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:835)
解决方案
是否添加权限:android.Manifest.permission.CAPTURE_AUDIO_
推荐阅读
- powershell - Copy-Item 不复制到正确的目标目录
- amazon-web-services - AWS Educate Starter 的访问密钥和密钥
- cordova - Ionic Cordova 资源错误:证书链中的自签名证书
- selenium - 有没有办法将 webdriverio 测试编译为标准硒文件
- dart - Flutter - 如何制作嵌套列表视图?
- javascript - 在基本的 vanilla js 页面中使用 systemjs
- c# - 如何在属性类型不固定的情况下反序列化 json - 可以是空字符串或对象,请建议。如何处理这种情况?
- php - 如何检查一个数组的值是否等于另一个数组的值并显示在选择下拉列表中选择的值
- mongodb - MongoDB 中使用的数据结构(B 树等)
- python - 如何将获得的数据包存储到 pkt.show() 命令的变量中?