前言这几天一直在做系统录音,通过修改源码编译成功;下面详细介绍一下内置音源的录音方案。在Android中,您可以使用MediaRecorder.AudioSource.REMOTE_SUBMIX来录制系统声音。此属性只能由系统应用程序使用。而且这个属性会切断耳机和喇叭的声音,手机播放音乐或者视频的时候听不到声音。这个时候,我们就要更改系统源码了。一、录音的简单实现AudioRecordaudioRecord=newAudioRecord(MediaRecorder.AudioSource.REMOTE_SUBMIX,captureSampleRate,captureChannel,AudioFormat.ENCODING_PCM_16BIT,recordbufferSize);newThread(newRunnable(){@Overridepublicvoidrun(){finalbyte[]bytes=newbyte[recordBufferSize];audioRecord.read(bytes,0,bytes.length);audioRecord.setPositionNotificationPeriod(captureSampleRate/25);audioRecord.setRecordPositionUpdateListener(newAudioRecord.OnRecordPositionUpdateListener(){@OverridepublicvoidonMarkerReached(AudioRecordrecorder){}@OverridepublicvoidonPeriodicNotification(AudioRecordrecorder){singleThreadPool.execute(newRunnable(){@Overridepublicvoidrun(){try{if(audioRecord!=null){audioRecord.read(bytes,0,bytes.length);PcmBuffer.clear();PcmBuffer.put(bytes,0,recordbufferSize);audioFrameParam.sampleRate=ZEGO_AUDIO_SAMPLE_RATE_44K;//声音的处理}}catch(Exceptione){e.printStackTrace();}}});}});audioRecord.startRecording();}}).start();二、AudioSource输入源介绍publicfinalclassAudioSource{privateAudioSource(){}/**默认音频source**/publicstaticfinalintDEFAULT=0;/**麦克风音频源*/publicstaticfinalintMIC=1;/**语音呼叫上行链路(Tx)音频源*/publicstaticfinalintVOICE_UPLINK=2;/**语音通话下行(Rx)音频源*/publicstaticfinalintVOICE_DOWNLINK=3;/**语音通话上行+下行音频源*/publicstaticfinalintVOICE_CALL=4;/**麦克风音频源与方向相同相机(如果可用),主*设备麦克风,否则*/publicstaticfinalintCAMCORDER=5;publicstaticfinalintVOICE_RECOGNITION=6;publicstaticfinalintVOICE_COMMUNICATION=7;publicstaticfinalintREMOTE_SUBMIXULT=8;}默认,android.permission.RECORD_AUDIOMIC:麦克风,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:VoIP,android.permission.RECORD_AUDIO。REMOTE_SUBMIX:传输到远程音频混合流。默认情况下,如果使用此选项进行录音,将截取本地扬声器或耳机的声音。android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方应用使用。使用REMOTE_SUBMIX的注意事项(1)需要系统权限。(2)喇叭和耳机的声音会被截取,即再次录音时无法在本地播放声音。对于系统权限,需要在AndroidManifest.xml中添加android:sharedUserId="android.uid.system",然后使用系统签名对应用进行打包,这样第三方应用就被打包为系统应用,并且可以使用系统权限。三、源码修改1、Android10及以下的目录frameworks\av\services\audiopolicy\enginedefault\src\Engine.cppif(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);}2、Android11目标框架\av\services\audiopolicy\enginedefault\src\Engine.cppif((remoteSubmix=availableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX,String8("0"),AUDIO_FORMAT_DEFAULT))!=nullptr){devices2.add(remoteSubmix);}修改为:if((remoteSubmix=availableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX,String8("0"),AUDIO_FORMAT_DEFAULT))!=nullptr){devices2=availableOutputDevices.getDevicesFromTypes({AUDIO_DEVICE_OUT_REMOTE_SUBMIX,AUDIO_DEVICE_OUT_WIRED_HEADPHONE,AUDIO_DEVICE_OUT_SPEAKER});}总结?要实现安卓录制系统声音,正常情况下是获取不Asyoucansee,thissolutionisimplementedbymodifyingthesourcecode.Later,Iwillintroducehowthesystemisimplemented.Youcanpostthesourcecodeandleteveryonelearntogether.
