之前发布过一行代码完成安卓屏幕收集编码,并介绍了怎么屏幕收集编码并进行了封装,简略的调用即可完成MediaProjection权限申请、H264硬编码、错误处理等功用。本文将介绍新增的功用,还是只需一行代码即可完成屏幕、声响收集。

一行代码完成屏幕收集编码

之前的文章,咱们已经介绍过怎么一行代码完成安卓屏幕收集编码,这儿再次简略介绍一下

ScreenShareKit.init(this).onH264({ buffer, isKeyFrame, w, h, ts ->
    //获取编码后的屏幕内容数据
}).onStart({
    //用户赞同收集,开端收集数据
}).start()

经过这段代码,咱们能够完成MediaProjection权限申请、H264硬编码、错误处理等功用。一起,咱们也新增了一个onStart回调,会在用户赞同屏幕收集后回调该办法,愈加便利的处理事务。

添加全局屏幕旋转监测

在之前版别中,屏幕旋转,会导致画面变形,宽高紊乱。本次更新中,屏幕旋转监测是经过反射监听IRotationWatcher来完成的。IRotationWatcher是一个AIDL接口,它定义了一个旋转监测器,用于监测屏幕旋转事情。在ScreenShare库中,咱们经过反射获取IRotationWatcher目标,并注册一个IRotationWatcher.Stub实例来监听屏幕旋转事情。当屏幕旋转时,该Stub实例会收到回调,并依据旋转视点重置编码器,更改宽高,以确保屏幕方向正确。这儿不是简略判别设备是否旋转,而是判别屏幕内容或许其他app布局是否旋转。然后重置编码器,更改宽高。始终保持方向正确。

参阅:scrcpy

添加RGBA数据回调

因为Android设备多,各类 CPU 功用不一。很难确保每个设备硬编码后都能够明晰流畅。所以新增一种方式,运用ImageReader收集屏幕截图,有很多开源库截图都是运用这个类。ImageReader是Android系统提供的一个用于获取屏幕截图的类,经过setOnImageAvailableListener回调,能够不停地获取屏幕变化,并获取RGBA数据。在这儿咱们经过创立一个ImageReader目标,并设置其宽高、像素格式等参数来获取屏幕数据。在回调函数中,咱们能够获取到每一帧的RGBA数据,并进行处理。该完成虽然比硬编码占用的内存高一点,但优势在于十分的均衡,不管功用强悍或是低端的CPU,都能够得到画质较明晰流畅的数据。

ScreenShareKit.init(this).config(screenDataType = EncodeBuilder.SCREEN_DATA_TYPE.RGBA).onRGBA(object : RGBACallBack {
    override fun onRGBA(
        rgba: ByteArray,
        width: Int,
        height: Int,
        stride: Int,
        rotation: Int,
        rotationChanged: Boolean
    ) {
        //收集的RGBA数据
    }
}).onStart({
    //用户赞同收集,开端收集数据
}).start()

添加屏幕内置声响收集回调

Android 10已引进AudioPlaybackCapture API。运用能够凭借此API复制其他运用正在播映的音频。此功用类似于屏幕收集,但收集目标是音频。主要用例是视频在线播映运用,这些运用期望捕获游戏正在播映的音频。

AudioPlaybackCaptureConfiguration config = (new AudioPlaybackCaptureConfiguration.Builder(mediaProjection)).addMatchingUsage(AudioAttributes.USAGE_MEDIA).build();
AudioFormat audioFormat = (new AudioFormat.Builder()).setEncoding(AudioFormat.ENCODING_PCM_16BIT).setSampleRate(sampleRate).setChannelMask(channelConfig).build();
audioRecord = new AudioRecord.Builder().setAudioFormat(audioFormat).setBufferSizeInBytes(bufferSizeInBytes).setAudioPlaybackCaptureConfig(config).build();

**留意:**运用的音频能否被捕获也取决于运用的 targetSdkVersion

  • 仅支撑Android 10及以上版别
  • 默许情况下,适配Android 9.0及之前版别的运用不答应捕获播映的音频。如要启用该功用,请在运用的 manifest.xml 文件中包含 android:allowAudioPlaybackCapture="true"
  • 默许情况下,适配Android 10 (API等级29)或更高版别的运用答应其他运用捕获其音频。如要停用“捕获播映的音频”功用,请在运用的 manifest.xml 文件中包含 android:allowAudioPlaybackCapture="false"

运用:

ScreenShareKit.init(this).config(audioCapture = true).onAudio(object : AudioCallBack {
    override fun onAudio(buffer: ByteArray?, ts: Long) {
        //运用的音频数据
    }
}).onStart({
    //用户赞同收集,开端收集数据
}).start()

参阅捕获播映的音频:官方文档

添加禁音屏幕内置声响办法

在运用收集过程中,如果不想中断又想禁音,能够调用以下办法。

ScreenShareKit.setMicrophoneMute(true)

设置为true之后,将会回调空数据,已达到静音作用。横竖,康复正常音频收集。

以上就是本文介绍的一些实用功用。经过这个库,咱们能够经过简略的一行代码完成屏幕、声响收集,而且支撑全局屏幕旋转监测、RGBA数据回调、屏幕内置声响收集等功用。这个库运用起来十分便利,项目地址:ScreenShare

Android技术分享 | 一行代码实现屏幕、声音采集