Android中实现录制内置声音

Android中实现对内置声源的录制有两种方案java

1、将应用打包为系统应用

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;
}
复制代码

  • DEFAULT:默认为MIC,android.permission.RECORD_AUDIO
  •  MIC:麦克风,android.permission.RECORD_AUDIO 
  • VOICE_UPLINK:电话录音上行线路,android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不容许第三方app使用 
  • VOICE_DOWNLINK:电话录音下行线路,android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不容许第三方app使用
  •  VOICE_CALL:电话录音上下线路,android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不容许第三方app使用 
  • CAMCORDER:摄像头的麦克风,android.permission.RECORD_AUDIO 
  • VOICE_RECOGNITION:语音识别,android.permission.RECORD_AUDIO 
  • VOICE_COMMUNICATION:网络电话,android.permission.RECORD_AUDIO 
  • REMOTE_SUBMIX:传输到远程的音频混合流,默认状况下若是用该项录音,本地扬声器或者耳机的声音将会被截走,android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不容许第三方app使用

REMOTE_SUBMIX能够实现内录功能,有两点比较麻烦:
git

(1)须要系统权限 github

(2)会截走扬声器和耳机的声音,也就是说再录音时本地没法播放声音
bash

  • 对于系统权限,须要在在AndroidManifest.xml添加 android:sharedUserId="android.uid.system",而后使用系统签名来打包应用,这样就第三方应用打包为系统应用,就能够使用系统权限了。 
对于系统签名,若是系统使用的是原生的系统,就能够直接在AOSP发布的Android源码获取签名证书

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

2、使用Root权限修改底层驱动

第二种方法来自开源项目:

https://github.com/iwo/SCR-Screen-Recorder-app

相关文章
相关标签/搜索