Android Q 包含一个新的 AudioPlaybackCapture API。应用可以借助此 API 复制其他应用正在播放的音频。该功能类似于屏幕采集,但针对的是音频。主要用例是影音在线播放应用,这些应用希望捕获游戏当前播放的音频。
请注意,对于其音频正在由其他应用捕获的应用,Capture API 不会影响此应用的延迟时间。
谷歌早在 Android 5.0,开放了视频录制的接口,其实严格来说,是屏幕采集的接口,也就是 MediaProjection
和 MediaProjectionManager
。现在姗姗来迟的是系统视频捕获的姊妹接口,音频捕获;有了这个接口,可以实现系统音、系统播放视频的捕获。
mProjectionManager = getSystemService(MediaProjectionManager.class);
Intent screenCaptureIntent = mProjectionManager.createCcreenCaptureIntent();
startActivityForResult(screenCaptureIntent,1);
--开启谷歌授权弹框,这个与历史视频录制 的api是一样的,都是谷歌弹框提示用户,要截取音视频信息了,弹框风格主题都改不了,主要是为了隐私保护,防止钓鱼应用获取到隐私音视频
protected void onActivityReslut(int requestCode, int resultCode, Intent intent){
surper.onActivityReslut(requestCode, resultCode, intent);
MediaProjection mediaProjection = mProjectionManager.getMediaProjection(resultCode, intent);
AudioPlaybackCaptureConfiguration.Builder builder = new AudioPlaybackCaptureConfiguration.Builder(mediaProjection);
builder.addMatchingUsage(AudioAttributes.USAGE_MEDIA);//多媒体
builder.addMatchingUsage(AudioAttributes.USAGE_ALARM);//闹铃
builder.addMatchingUsage(AudioAttributes.USAGE_GAME);//游戏
...
audioPlaybackCaptureConfiguration = builder.build();
--用户点击谷歌弹框,获取了权限,再onActivityResult中处理返回结果,返回的 intent生成audioPlaybackCaptureConfiguration,通过addMatchingUsage添加不同类型的系统声音源,需要录制什么声音源就添加什么类型
AudioRecord.Builder recorder1 = new AudioRecord.Builder()
.setAudioFormat(new AudioFormat.Builder())
.setEncoding(AudioFormat.EMCODING_PCM_16BIT)
.setSampleRate(48000) //采样率
.setChannelMask(AudioFormat.CHANNEL_IN_MONO)
.setBufferSizeInBytes(minBufferSize)
.setAudioPlaybackCaptureConfig(audioPlaybackCaptureConfiguration);
mAudioRecorder = recorder.build();
mAudioRecorder.startRecording();
--生成音频对象,开启录制音频
(代码纯手敲,可能有错误,主要看逻辑)
API新提供的系统音录制接口存在的问题:
1、AudioPlaybackCaptureConfiguration接口是谷歌API29新增的,要使用此接口,应用至少需要将compileSdkVersion升到API29。
2、使用此api后,也不是全部音频都可以录制到,应用的音频能否被捕获也取决于应用的targetSdkVersion,默认情况下,以Android9.0及之前版本为目标平台的应用不允许捕获播放的音频。要启用捕获播放的音频功能,需要在应用的manifest.xml文件中包含android:allowAudioPlaybackCapture = “ture”。
3、默认情况下,以android Q或更高版本为目标平台的应用允许其他应用捕获其音频。要禁止被捕获音频,需要在应用的manifest.xml文件中包含android:allowAudioPlaybackCapture = “false”。
4、系统音录制其实早有接口。REMOTE_SUBMIX可以实现类似功能,但由于此接口不是专门为录制系统音频而开的所以存在缺陷,此接口在捕获多媒体音频时,外放无声音,而部分音频种类如闹钟等截取不到。具体见历史博客:https://blog.csdn.net/zhangzhuo1024/article/details/78484053,新接口感觉很鸡肋,处于安全隐私和高清音频的版权考虑,谷歌把系统音接口可录制的的范围设置了太多限制,用起来还感觉还不如历史REMOTE_SUBMIX接口。但是REMOTE_SUBMIX可以无限制录制高清无损音频,存在版权侵权风险,谷歌法务部已经就版权问题与我司反馈,整改是大趋势,使用新接口已经迫在眉睫。。。