如何使Android录音实现内录功能
景
之前在做直播的时候需要使用到内录功能,比如经常看到游戏主播在直播玩游戏,游戏的声音不是通过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录音实现内录功能相关推荐
- 转 如何使android录音实现内录功能,BroadcastReceiver实现android来去电录音功能(外录)...
因为原生android没有提供来去电内录功能,所以只能通过麦克进行通话录音, /** * 来去电录音,因为去电没有接听的状态,只要拨出就会开始录音 * * @author jauken * @date ...
- android申请内录功能吗,如何使Android录音实现内录功能
背景 之前在做直播的时候需要使用到内录功能,比如经常看到游戏主播在直播玩游戏,游戏的声音不是通过MIC录制的,而是内录完成的.故在此记录一下. 相信大家都很熟悉Android如果录音的了: int f ...
- Conexant声卡实现内录功能(win7)
Conexant声卡本身没有立体声混音设备可选,所以我们采用virtual audio device,实现内录功能. [1]下载virtual audio device.下载地址:http://dow ...
- Android实现内录
转载博客 景 之前在做直播的时候需要使用到内录功能,比如经常看到游戏主播在直播玩游戏,游戏的声音不是通过MIC录制的,而是内录完成的.故在此记录一下. 相信大家都很熟悉Android如果录音的了: i ...
- Android平台实现系统内录(捕获播放的音频)并推送RTMP服务技术方案探究
几年来,我们在做无纸化同屏或在线教育相关场景的时候,总是被一件事情困扰:如何实现Android平台的系统内录,并推送到其他播放端,常用的场景比如做无纸化会议或教育的时候,主讲人或老师需要放一个视频,该 ...
- python开发的录音机(一)录制声卡播放的声音(内录)
现在网上用python编写的录音机小软件很多,几乎都不支持内录. 这个小程序的主要功能特点是 1 , 录制电脑上正在播放的声音,即从声卡录制,而不是从麦克风录制,这样就可以将电脑上正在播放的音乐保存下 ...
- win7/windows7内录方法
win7/windows7内录方法 随着win7系统的普及,不少机友们已经发现自己的电脑不能内录音频,对于一些音乐玩家来说,内录功能十分重要,可win7不能像xp一样内录,该怎么办呢? 首先,我们要分 ...
- 安卓内录声音软件scr_那款安卓手机软件可以内录视频?
ScreenCam v2.0.3 开源还免费,你说香不香.但是英文的. 安装条件:安卓,且已root 正在使用中,可以实现内录.内录的时候,是听不到扬声器声音的.找了n多app,目前只有ScreenC ...
- Android Q及以上系统音频捕获功能(声音内录)的简单实现
前言 现在越来越多的视频类APP,如抖音.快手.B站等等,都开放了音频捕获配置,也就是android:allowAudioPlaybackCapture="true".因此学习如何 ...
最新文章
- mysql批量insert bug_MySQL Bug insert into on duplicate key update 语法更新 text blob 大字段导致 MySQL crash...
- python绘制动态模拟图-Python 模拟动态产生验证码图片
- 拒绝双写:巧用Lindorm数据订阅
- 图解 Python 算法
- rocketMQ基本架构简介
- 苹果应用审核走进中国!
- axios 与 Vuex的使用
- mysql 介于两个日期函数_帮忙看一上这个mysql函数,用来返回两个日期之间的年数...
- 计算机专业复试离散数学,考研复试没头绪?计算机考研复试的同学看过来
- 【增长工程学】如何研究数字广告投放策略?(Part1)
- [简单]poi 创建word2007脚注(FootNote)
- KeyError: [] not found in axis_最IN拉花潮改“出圈”,欧拉白猫拓创无限可能_搜狐汽车...
- 软件工程(1) CSDN花神生涯
- usb-cam(1)安装
- 【UNR #6 B】机器人表演(DP)
- 网络爬虫 | selenium 爬取动态加载信息
- diag()函数功能
- 【数据结构——图和图的存储结构】
- DOS程序员手册(七)
- malloc: *** error for object 0x1740a8340: pointer being freed was not allocated