首页 > 其他分享 >手机投屏音频流转在无系统权限中的应用

手机投屏音频流转在无系统权限中的应用

时间:2023-05-24 17:12:48浏览次数:52  
标签:AudioManager app 流转 投屏 android 权限 音频

背景

手机投屏处理音频流转问题 中介绍了反射android.media.AudioSystem类的setDeviceConnectionState方法来达到音频流转方案,此方案是基于系统权限的,也就是说具有系统签名并且拥有android:sharedUserId="android.uid.system",如果没有这个权限咋整?

因公司需要把之前的投屏项目脱离系统权限并准备上Google Play,所以不能在拥有系统权限了,因此之前投屏项目的好的功能需要能适配就适配不能的只能去掉,所以投屏分成了两个app:一个app是没有任何系统权限的,另外一个app则是拥有签名权限的,没有系统权限的app将来是要上Google Play的,拥有签名权限的内置在自己手机里,因此把上面实现流转的功能放在了拥有签名权限app里,两个app之间通过AIDL进程间通信。

替代的API

当我把相关音频流转API放入到拥有签名权限app里时去执行时,虽然反射执行方法没啥问题,但结果就是没有效果,此时细心的可以发现日志有一句打印:

经过分析源码可以发现android.media.AudioSystem类的setDeviceConnectionState方法成功反射执行了,但是在调用C++层就出现了问题:

看来没有system uid权限还是不行的,于是我就在系统源码里各种寻找其他方案。

最终在我不懈努力终于被我找到了AudioManager类的setWiredDeviceConnectionState
setWiredDeviceConnectionState

哇,感觉发现了新大陆,这个api比android.media.AudioSystem类的setDeviceConnectionState方法好用多了,不用费那么大的劲进行反射,而且Android13及以下的api参数基本上是一致的,直接调用就行了。但是这里我们通过源码的api方法上面可以发现:此方法是需要android.Manifest.permission.MODIFY_AUDIO_ROUTING权限的,而且这个权限只能是系统签名的app能使用,所以还是得把这个api得调用放入到拥有签名权限的app中。

public class AudioUtils {
    private static final String TAG = AudioUtils.class.getSimpleName();
    public static void setWiredDeviceConnectionState(Context context,int state){
        AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        audioManager.setWiredDeviceConnectionState(AudioManager.DEVICE_OUT_REMOTE_SUBMIX,state,"","");
    }
}

音频卡顿问题

当实现了后音频可以正常进程流转,但是又一个新问题,就是流转后得音频播放出来是卡顿的,一开始我以为是我的Sink端有问题,直到我在Source端把录音保存本地后,发现是音频录取有问题。

于是又是排查一番发现是调用setWiredDeviceConnectionState方法传入的AudioManager.DEVICE_OUT_REMOTE_SUBMIX参数问题,最终发现可以使用AudioManager.DEVICE_OUT_WIRED_HEADPHONE来替代,表示有线耳机输出
DEVICE_OUT_WIRED_HEADPHONE

标签:AudioManager,app,流转,投屏,android,权限,音频
From: https://www.cnblogs.com/zuojie/p/17428916.html

相关文章

  • 常见音频编码格式(转)
    音频帧大小计算https://blog.csdn.net/tanningzhong/article/details/42914363假设音频采样率=8000,采样通道=2,位深度=16,采样间隔=20ms首先我们计算一秒钟总的数据量,采样间隔采用20ms的话,说明每秒钟需采集1000/20=50次,这个计算大家应该都懂,那么总的数据量计算为:一秒......
  • < Python全景系列-4 > 史上最全文件类型读写库大盘点!什么?还包括音频、视频?
    欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语言!本文系列第四篇,介绍史上最全PYTHON文件类型读写库大盘点!包含常用和不常用的大量文件格式!文本、音频、视频应有尽有!废话不多说!走......
  • python从视频中导出音频
     pipinstallffmpeg pipinstallmoviepy  (wind_2021)L:\>(wind_2021)L:\>(wind_2021)L:\>pipinstallffmpegLookinginindexes:https://pypi.tuna.tsinghua.edu.cn/simpleCollectingffmpegDownloadinghttps://pypi.tuna.tsinghua.e......
  • [图]Firefox 69新功能:可默认同时阻止视频和音频以节省流量
    Mozilla终于开始考虑修复困扰Firefox浏览器数十年的吃带宽问题。在最新的FirefoxNightly69版本中,允许用户同时阻止视频和音频。当前稳定版中,只允许用户阻止音频播放,不过在最新版本中允许用户同时阻止音频和视频,这样在访问Facebook或者Twitter等网站时候就不会出现太耗流量的问题......
  • ffmpeg实现的C++纯音频软解码器
    只实现解码,不包含前置的demux,以及后置的resample要求输入demux后的音频数据实现的C++类如下:AudioSoftDecoder.h:#ifndef_AUDIOSOFTDECODER_H_#define_AUDIOSOFTDECODER_H_#include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>extern"C&......
  • 音频焦点使用及原理
    音频焦点使用及原理本博客代码基于Android10源码为什么会有音频焦点这一概念?在Android音频领域中,应用层所有的App播放音频,最终都是走到音频回播线程PlaybackThread中,如果多个App都走到同一个PlaybackThread中去,就会出现混音情况,Android本身对混音也有很好的支持,但是也会造成......
  • < Python全景系列-4 > 史上最全文件类型读写库大盘点!什么?还包括音频、视频?
    欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语言!本文系列第四篇,介绍史上最全PYTHON文件类型读写库大盘点!包含常用和不常用的大量文件格式!文本、音频、视频应有尽有!废话不多说!......
  • C# 内存流转换为字节数组(内存流转比特数组)
    MemoryStreamms=newMemoryStream();//方法一byte[]bytes=ms.ToArray();//方法二byte[]bytes1=newbyte[ms.Length];ms.Read(bytes1,0,bytes1.Length);//设置当前流的......
  • 音频格式及转换代码
    音频信号的读写、播放及录音python已经支持WAV格式的书写,而实时的声音输入输出需要安装pyAudio(http://people.csail.mit.edu/hubert/pyaudio)。最后我们还将使用pyMedia(http://pymedia.org)进行Mp3的解码和播放。音频信号是模拟信号,我们需要将其保存为数字信号,才能对语音进行......
  • 网络 -- Internet上的音频视频
    在internet上传输音频视频面临的问题区别:1.音频视频:占用的带宽高网速恒定延迟低2.数据信息:对带宽网速是否恒定延迟要求不高1.延迟:对于非交互式的音频视频影响不大(发送延迟传播延迟排队延迟处理延迟)2.带宽不稳定:设置缓存 安装流媒体服务目前因特网提供的音频......