Android中实现对内置声源的录制有两种方案java
AudioSource输入源
android
public final class AudioSource {
private AudioSource() {}
/** Default audio source **/
public static final int DEFAULT = 0;
/** Microphone audio source */
public static final int MIC = 1;
/** Voice call uplink (Tx) audio source */
public static final int VOICE_UPLINK = 2;
/** Voice call downlink (Rx) audio source */
public static final int VOICE_DOWNLINK = 3;
/** Voice call uplink + downlink audio source */
public static final int VOICE_CALL = 4;
/** Microphone audio source with same orientation as camera if available, the main
* device microphone otherwise */
public static final int CAMCORDER = 5;
public static final int VOICE_RECOGNITION = 6;
public static final int VOICE_COMMUNICATION = 7;
public static final int REMOTE_SUBMIX = 8;
}
复制代码
REMOTE_SUBMIX能够实现内录功能,有两点比较麻烦:
git
(1)须要系统权限 github
(2)会截走扬声器和耳机的声音,也就是说再录音时本地没法播放声音
bash
https://github.com/aosp-mirror/platform_build/tree/master/target/product/security
网络
用signapk.jar对应用进行签名
app
java -jar signapk.jar platform.x509.pem platform.pk8 app-unsigned.apk signed.apk
复制代码
signapk获取地址:
ui
https://github.com/techexpertize/SignApkspa
https://github.com/maks/aosp-signapk
.net
修改framework下av/services/audiopolicy/AudioPolicyManager.cpp
if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {
device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
}
复制代码
修改成:
if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {
device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_WIRED_HEADPHONE);
device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_SPEAKER);
}复制代码
如今就能够使用MediaRecorder.AudioSource.REMOTE_SUBMIX实现内录功能了。
该方案只适用于知道系统签名或者本身编译系统源码的状况
参考文章:
https://www.jianshu.com/p/916ede1d1f48 https://blog.csdn.net/liuhaitao_share/article/details/41249175 https://blog.csdn.net/jinzhuojun/article/details/33748031
第二种方法来自开源项目:
https://github.com/iwo/SCR-Screen-Recorder-app