之前在做直播的时候需要使用到内录功能,比如经常看到游戏主播在直播玩游戏,游戏的声音不是通过MIC录制的,而是内录完成的。故在此记录一下。

相信大家都很熟悉Android如果录音的了:

         int frequency = 44100;int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;int minBufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration,    audioEncoding);int audioSource = MediaRecorder.AudioSource.MIC;AudioRecord audioRecord = new AudioRecord(audioSource, frequency,channelConfiguration, audioEncoding, minBufferSize);audioRecord.startRecording();...

AudioSource输入源介绍

项目 介绍 权限
DEFAULT 默认。在源码 system/media/audio/include/system/audio.h配置默认项
MIC 麦克风
VOICE_UPLINK 电话录音上行线路 android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用
VOICE_DOWNLINK 电话录音下行线路 android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用
VOICE_CALL 电话录音上下线路 android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用
CAMCORDER 摄像头的麦克风
VOICE_RECOGNITION 语音识别
VOICE_COMMUNICATION 网络电话
REMOTE_SUBMIX 传输到远程的音频混合流。默认情况下如何用该项录音,本地扬声器或者耳机的声音将会被截走 android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用

好了,现在我们知道了REMOTE_SUBMIX可以实现内录功能了。有两点比较麻烦:

  • 需要系统权限

  • 会截走扬声器和耳机的声音,也就是说再录音时本地无法播放声音

系统权限问题

这个对我来说比较好办,因为我是直接在android设备板子上开发,可以直接使用系统签名编译。首先在AndroidManifest.xml添加
android:sharedUserId="android.uid.system"
其次,

第一种方法:

adb shell 执行:
signapk.jar platform.x509.pem platform.pk8 app-unsigned.apk signed.apk
adb push signed.apk /system/app

第二种方法:

编写Android.mk : 设置签名为platform

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := YourApp
LOCAL_CERTIFICATE := platform
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))

截走扬声器和耳机的声音问题

修改framework下av/services/audiopolicy/AudioPolicyManager.cpp

audio_devices_t AudioPolicyManager::getDeviceForStrategy(routing_strategy strategy,bool fromCache)

getDeviceForStrategy方法下找到

if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
}

修改为

if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_WIRED_HEADPHONE);device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_SPEAKER);
}

意思是声音输出的设备添加了耳机和扬声器,这里可根据实际情况设置。
至此,将最开始的录音代码

int audioSource = MediaRecorder.AudioSource.MIC;

改成

int audioSource = MediaRecorder.AudioSource.REMOTE_SUBMIX;

就可以实现内录功能了。
<br/>


ps:

在不修改源码的情况下,第三方app目前暂不知如何实现内录。

延伸阅读

5.0以后请求Android录屏默认会弹出确认框,但在系统app下请求就不会弹出了(具体可以去看源码)。这也是为了谷歌为了安全考虑。
不过5.0的时候这个弹框却是一个大漏洞,被国内360发现了,给你们链接^_^
Android 5.0屏幕录制漏洞

如何使Android录音实现内录功能相关推荐

  1. 转 如何使android录音实现内录功能,BroadcastReceiver实现android来去电录音功能(外录)...

    因为原生android没有提供来去电内录功能,所以只能通过麦克进行通话录音, /** * 来去电录音,因为去电没有接听的状态,只要拨出就会开始录音 * * @author jauken * @date ...

  2. android申请内录功能吗,如何使Android录音实现内录功能

    背景 之前在做直播的时候需要使用到内录功能,比如经常看到游戏主播在直播玩游戏,游戏的声音不是通过MIC录制的,而是内录完成的.故在此记录一下. 相信大家都很熟悉Android如果录音的了: int f ...

  3. Conexant声卡实现内录功能(win7)

    Conexant声卡本身没有立体声混音设备可选,所以我们采用virtual audio device,实现内录功能. [1]下载virtual audio device.下载地址:http://dow ...

  4. Android实现内录

    转载博客 景 之前在做直播的时候需要使用到内录功能,比如经常看到游戏主播在直播玩游戏,游戏的声音不是通过MIC录制的,而是内录完成的.故在此记录一下. 相信大家都很熟悉Android如果录音的了: i ...

  5. Android平台实现系统内录(捕获播放的音频)并推送RTMP服务技术方案探究

    几年来,我们在做无纸化同屏或在线教育相关场景的时候,总是被一件事情困扰:如何实现Android平台的系统内录,并推送到其他播放端,常用的场景比如做无纸化会议或教育的时候,主讲人或老师需要放一个视频,该 ...

  6. python开发的录音机(一)录制声卡播放的声音(内录)

    现在网上用python编写的录音机小软件很多,几乎都不支持内录. 这个小程序的主要功能特点是 1 , 录制电脑上正在播放的声音,即从声卡录制,而不是从麦克风录制,这样就可以将电脑上正在播放的音乐保存下 ...

  7. win7/windows7内录方法

    win7/windows7内录方法 随着win7系统的普及,不少机友们已经发现自己的电脑不能内录音频,对于一些音乐玩家来说,内录功能十分重要,可win7不能像xp一样内录,该怎么办呢? 首先,我们要分 ...

  8. 安卓内录声音软件scr_那款安卓手机软件可以内录视频?

    ScreenCam v2.0.3 开源还免费,你说香不香.但是英文的. 安装条件:安卓,且已root 正在使用中,可以实现内录.内录的时候,是听不到扬声器声音的.找了n多app,目前只有ScreenC ...

  9. Android Q及以上系统音频捕获功能(声音内录)的简单实现

    前言 现在越来越多的视频类APP,如抖音.快手.B站等等,都开放了音频捕获配置,也就是android:allowAudioPlaybackCapture="true".因此学习如何 ...

最新文章

  1. mysql批量insert bug_MySQL Bug insert into on duplicate key update 语法更新 text blob 大字段导致 MySQL crash...
  2. python绘制动态模拟图-Python 模拟动态产生验证码图片
  3. 拒绝双写:巧用Lindorm数据订阅
  4. 图解 Python 算法
  5. rocketMQ基本架构简介
  6. 苹果应用审核走进中国!
  7. axios 与 Vuex的使用
  8. mysql 介于两个日期函数_帮忙看一上这个mysql函数,用来返回两个日期之间的年数...
  9. 计算机专业复试离散数学,考研复试没头绪?计算机考研复试的同学看过来
  10. 【增长工程学】如何研究数字广告投放策略?(Part1)
  11. [简单]poi 创建word2007脚注(FootNote)
  12. KeyError: [] not found in axis_最IN拉花潮改“出圈”,欧拉白猫拓创无限可能_搜狐汽车...
  13. 软件工程(1) CSDN花神生涯
  14. usb-cam(1)安装
  15. 【UNR #6 B】机器人表演(DP)
  16. 网络爬虫 | selenium 爬取动态加载信息
  17. diag()函数功能
  18. 【数据结构——图和图的存储结构】
  19. DOS程序员手册(七)
  20. malloc: *** error for object 0x1740a8340: pointer being freed was not allocated

热门文章

  1. 分享一个H5使用JQ首字母排序的通讯录
  2. 高速数据存储板资料:6U VPX 存储容量可达128TB,可通过网络(FTP协议)/PCLE 直接访问
  3. linux下使用c语言模拟tail [-n] 命令
  4. Lotus的金额大小写转换
  5. python模拟自动填充(一)
  6. 视频怎么用伪原创手机 抖音短视频如何去水印
  7. git merge --no--ff 详解
  8. informatica 学习日记整理
  9. 【PyMuPDF和pdf2image】Python将PDF转成图片
  10. 警惕!程序员万字揭露被空姐骗到香港做传销的来龙去脉!