关于两个 Android 程序同时访问麦克风的功能实现 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dblpx
V2EX    Android

关于两个 Android 程序同时访问麦克风的功能实现

  •  
  •   dblpx 2020-10-30 21:48:20 +08:00 15775 次点击
    这是一个创建于 1878 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://developer.android.com/guide/topics/edia/sharing-audio-input
    各位大佬好,我在官方开发者手册中看到: "在 Android 10 之前,输入音频流一次只能由一个应用捕获。"(未经修改的系统),那么问题来了,通话录音为啥能实现呢?我查看了开源的通话录音的源码,也并没有发现什么特别的地方。

    我的想法是因为系统通话属于特权 APP,不占用音频输入流,所以属于例外,不知道这个想法对不对,希望各位大佬能指点一下。

    对了,这里的讨论仅限于未经修改的系统哈。

    另一个问题是,如果通话录音真的属于例外情况的话,那么在未经修改的系统( Android 10 以前)上两个应用程序同时进行录制可行吗?

    18 条回复    2021-04-18 10:25:17 +08:00
    6IbA2bj5ip3tK49j
        1
    6IbA2bj5ip3tK49j  
       2020-10-30 21:57:46 +08:00 via iPhone
    通话录音也许只是电话应用的一个 Interceptor,截取电话应用的音频信息就好了。
    不一定需要做你说的访问麦克风。

    //以上为瞎掰
    dblpx
        2
    dblpx  
    OP
       2020-10-30 22:05:24 +08:00
    @xgfan 我看的通话录音的源码是调用的 MediaRecord.start(), 先设置访问的 AudioSource 为麦克风然后才开始录制的。
    billlee
        3
    billlee  
       2020-10-30 22:56:00 +08:00   1
    好像是通话的音频有单独的路由从麦克风 /扬声器直通 modem, 不经过 app processor
    democracier
        4
    democracier  
       2020-10-30 22:57:52 +08:00 via Android
    就是你没事想要监听我说话?
    dblpx
        5
    dblpx  
    OP
       2020-10-31 00:33:13 +08:00 via iPhone
    @democracier 我不关心实现,只想知道可行不可行
    codeforyou
        6
    codeforyou  
       2020-10-31 09:32:26 +08:00
    多少人都想录制微信语音通话,可惜现在还没有一款 App 真正实现这个功能!
    daozhihun
        7
    daozhihun  
       2020-10-31 11:19:03 +08:00   1
    根据谷歌的文档,从安卓 10 开始,可以支持多个 app 同时使用麦克风的功能。
    但是,仅限于特权 app (应该是指的 system app ),所以两个普通的 app 不能同时访问麦克风。

    不支持两个普通 app 同时访问,应该是从隐私、安全性的角度来考虑的,故意做的限制。而通话录音、录制系统的声音则是从隐私的角度直接不给普通 app 权限的。
    dblpx
        8
    dblpx  
    OP
       2020-10-31 15:32:06 +08:00 via iPhone
    @daozhihun 是的,这部分文档我也看到了,即使是 Android 10,普通 app 可以共享音频输入也是有限制的。</br>我比较好奇的是 Android 10 以前通话录音是个啥原理?我看了开源代码和普通录音程序也没啥区别
    KaynWASD
        9
    KaynWASD  
       2020-10-31 15:42:02 +08:00
    @codeforyou 甚至连 ios 的录屏都录不到!
    daozhihun
        10
    daozhihun  
       2020-10-31 17:27:19 +08:00
    @dblpx AOSP 和 Pixel 的系统都不支持通话录音吧,你说的是魔改 UI 提供的录音功能吧。你上面不自己都说仅限于未经修改的情况嘛,谷歌官方一直是不让通话录音的。。。
    dblpx
        11
    dblpx  
    OP
       2020-10-31 19:22:55 +08:00
    @daozhihun 啊,我日常不用 Android,还以为 Android 设备都支持通话录音
    daozhihun
        12
    daozhihun  
       2020-10-31 21:18:19 +08:00 via iPhone
    @dblpx 国产手机可以,应该是改过了
    acess
        13
    acess  
       2020-10-31 22:58:31 +08:00
    @daozhihun 借楼问一下音频内录(无论是系统还是 app ),感觉应该蛮相关的: /t/659086
    其实现在这个状况一直让我失望,我只是偶尔会看游戏视频,但我感觉内录音频+玩家语音这个需求是非常合理的,不知道 Google 为啥从 Android 7.0 开始就各种拦路设卡,搞得连获取 root 权限后都不太能搞。
    不知道 Android 11 在这方面有没有什么新动向呢?
    daozhihun
        14
    daozhihun  
       2020-11-01 04:52:05 +08:00 via iPhone
    @acess app 去获取系统声音是谷歌严格禁止的,所以第三方 app 都无法获取系统声音,只能通过录麦克风的方式变相获取声音(所以音质很差)。

    从安卓 11 开始系统提供录屏功能,你可以选择录取系统声音或者麦克风,也可以同时录,对于打游戏或者解说应该是够用了的。由于是系统功能所以有特权录到系统声音,第三方 app 仍然是禁止的。

    国产手机应该提供了录屏功能,至于你的 LieageOS 是否支持我不了解,反正 Pixel 的安卓 11 是内置了这个录屏录系统声音和麦克风功能的。
    acess
        15
    acess  
       2020-11-01 13:58:31 +08:00
    @daozhihun
    我现在用的 los17.1,是 Android 10 。

    目前我只找到 ScreenCam 可以内录任何 app 和系统的声音,但是很蛋疼,详见:/t/659086#reply2

    Android 10 提供内录音频的录屏 API,但是必须 app 主动声明允许才可以录。
    我一直好奇有没有 xposed 之类的办法能解除这个限制。不过即便解除了,貌似还是不能达到 Android 6.0 上 SCR Screen Recorder 那种耳机播放+音频内录+麦克风同时录制这种完美效果(虽然 SCR 也是需要 root 的,但是它效果完美啊)。

    不知道 Android 11 能不能搞定这个需求,听你说的,似乎是搞定了,但只能是系统 app 才能录,用户 app 仍然不行?(嗯,这样也基本够用了)

    而且你说“app 去获取系统声音是谷歌严格禁止的”这个我也不明白,是出于安全隐私方面的原因,还是……版权方面受到了压力……什么的?

    另外即便 Android 11 搞定了这个需求,肯定还有大量机器一时半会(甚至是永远)升级不到 Android 11……
    daozhihun
        16
    daozhihun  
       2020-11-01 15:20:11 +08:00   1
    @acess

    关于录音,你说的有一部分是对的,我之前没看 Android Q 的文档,所以我上面的描述有误,刚才认真研究了下谷歌的官方文档。我重新表述一下:

    - 录声音的问题

    从 Android Q 开始提供 API,让第三方 app 也可以录制系统声音(也就是说,10 以前的版本是不行的)。
    第三方 app 录制声音,有如下限制:

    * 被录制声音的 app 如果 target API 是 28 或以下( 9 或以下),除非 app 在 manifest 里声明,否则默认 [禁止] 录制这些 app 的声音。

    * 被录制声音的 app 如果 target API 是 29 ( Android Q ),或者是系统 app 录制声音,则允许录制游戏、媒体或者未知类别的声音。

    * 应用可以声明禁止其他 app 录制声音,只要应用声明了,不管什么 app 都不能录音。

    总之简单来说,除非 app 升级到了 target Android Q,否则除了系统 app 以外,第三方是不能录音的,而且仅限于媒体、游戏和未知类别(像通话什么的显然还是禁止录制的)。

    关于这个限制,我觉得主要还是隐私、版权方面的考虑,因为如果允许 app 随便录音是非常危险的,所以在录音和录屏的时候会有弹窗警告并且在任务栏显示显眼的图标(比如流氓 app 有可能有办法获取微信语音或者通话内容)。另外版权的问题,这点老外很看中,比如 PS4 之类的游戏机提供录制功能,但是一些游戏也可以禁止你录制,或者一些歌曲没有声音。通话录音也是这样了,比如 iOS 和原生 Android 都不允许通话录音。

    所以在 Android 10 以前,录屏软件的声音都是从麦克风获取的(我之前用的就这样),后来 10 自带了录屏功能,我就没关注了(所以我之前仍然谷歌没开放这个限制)。

    ********

    - 关于录麦克风的问题

    如我之前说的,两个普通 app 不允许同时录音(优先级较低的得到的声音是空白的),但是对于游戏直播的情况,只有一个 app 在录音(所以不会触发两个普通 app 不能同时获取麦克风声音的限制),那是可以做到又录屏又录声音的。

    当然通话录音仍然是不允许的。
    daozhihun
        17
    daozhihun  
       2020-11-01 15:26:11 +08:00   1
    @acess 我上面说的只有系统 app 可以录,意思是只有系统 app 可以做到和其他 app 同时获取麦克风的内容,和你说的不是一回事。你想要录系统声音+麦克风,在这种情况下如果只有一个 app 使用麦克风(比如没有开微信语音等),那是可以做到的。
    tanranran
        18
    tanranran  
       2021-04-18 10:25:17 +08:00
    @codeforyou #6 miui 自带这个功能,估计是系统层面拦截的,没有 Android 官方 API 能做到
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4926 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 09:37 PVG 17:37 LAX 01:37 JFK 04:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86