首页 > 其他分享 >Android技术分享 | 一行代码实现屏幕、声音采集

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

时间:2023-04-13 14:14:35浏览次数:45  
标签:编码 音频 旋转 采集 Android 屏幕

之前发布过一行代码实现安卓屏幕采集编码,并介绍了如何屏幕采集编码并进行了封装,简单的调用即可实现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,屏幕
From: https://www.cnblogs.com/anyrtc/p/17314560.html

相关文章

  • android AsyncTask
    在Android中每一个应用都拥有自己的独立进程,而一个进程可以拥有多个线程,在这些线程中有一个线程叫做MainThread(也叫UIThread).它负责显示、更新UI,与用户交互.其他的线程叫做WorkerThread(也叫工作线程),由于在主线程中做耗时的操作会阻塞主线程,影响UI更新,会让用户感觉到应......
  • 查看xxx.apk文件的AndroidManifest.xml操作步骤:
    查看xxx.apk文件的AndroidManifest.xml操作步骤: 1.使用7.zip打开xxx.apk文件,且将该文件夹中的AndroidManifest.xml文件复制出来。 2、AndroidManifest.xml文件复制到AXMLPrinter2文件夹中。 3、在AXMLPrinter2文件夹输入cmd进入命令行模式。 4、输入java-jarAXMLPrinter2.jarAn......
  • 河北稳控科技多通道振弦传感器无线采集仪与参数配置工具连接
    河北稳控科技多通道振弦传感器无线采集仪与参数配置工具连接VS101~VS432设备配备了专门的参数配置工具SETP来完成设备工作参数的查看和修改工作。 连接前的准备工作(1)数据接口与计算机连接使用标配的通讯线与计算机RS232接口连接。若需基于手机网络发送数据,请在开机前......
  • 数据采集代码 模板化,标准化(放到dll)
     socket通信:ip,port,timeout(别忘,300),关闭连接串口通信:串口号,波特率,超时等,字符编码(别忘,),关闭连接 。overtcp(串口服务器) 指令拼接:标准化,写到dll,做好备注。 -----------------比如下面代码中,tostring使用,--------------------------vs没有提示x和X的区别,写到自己的工作dl......
  • android: 平台版本对应api及占比统计(android studio 2022.1.1)
    一,查看平台版本对应的api官方文档地址:https://developer.android.google.cn/guide/topics/manifest/uses-sdk-element.html?utm_campaign=adp_series_sdkversion_010616&utm_source=medium&utm_medium=blog&hl=zh-cn#ApiLevels如图: 二,查看各版本的支持比率:启动androi......
  • 数据采集——数据清洗
    数据清洗到目前为止,我们还没有处理过那些样式不规范的数据,要么是使用样式规范的数据源,要么就是彻底放弃样式不符合我们预期的数据。但是在网络数据采集中,你通常无法对采集的数据样式太挑剔。由于错误的标点符号、大小写字母不一致、断行和拼写错误等问题,零乱的数据(dirtydata)是......
  • Android sqlite 数据库查询,插入,删除,更新demo<第1章>
    //20140424创建数据库帮助类DataBaseHelper,继承SQLiteOpenHelper, 1. 编写构造函数,实现数据库创建;publicstaticfinalStringTAG="ListViewActivity";privatestaticintVERSION=1;privatestaticfinalStringTABLE_NAME="user1";privatestaticfinalSt......
  • Android App状态栏变色:ColorfulStatusBar
    适用于版本大于等于19以上。importandroid.annotation.TargetApi;importandroid.app.Activity;importandroid.content.Context;importandroid.graphics.Color;importandroid.os.Build;importandroid.view.View;importandroid.view.ViewGroup;......
  • BISS-C 8通道采集renishaw传感器及其CRC校验
    背景BISS-C是常见的位置编码器传输协议,相对于传统的协议,支持更快的传输速度,电器接口为电压差分RS422或者485,抗干扰能力较强,在精密位置传输中应用广泛。下述信息源自雷尼绍典型的请求循环进程如下:当空闲时,主接口使MA线保持高电平。光栅通过使SLO线保持高电平显示它已准备......
  • Android动态设置drawableRight
    DrawablerightDrawable=getResources().getDrawable(R.drawable.icon);//调用setCompoundDrawables时,必须调用Drawable.setBounds()方法,否则图片不显示rightDrawable.setBounds(0,0,rightDrawable.getMinimumWidth(),rightDrawable.getMinimumHeight());//left,top,r......