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可以无限制录制高清无损音频,存在版权侵权风险,谷歌法务部已经就版权问题与我司反馈,整改是大趋势,使用新接口已经迫在眉睫。。。

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐