文章目录:
- 1、如何使Android录音实现内录功能
- 2、android 录音pcm源码怎样加入降噪函数
- 3、android编程 如何调用系统录音机进行录音并存放在指定文件夹
- 4、android4.0系统开发板插上USB声卡后能录音,当放音时没声音,该怎么在源码中配置声卡呢?
- 5、用Android录音机录好的声音,请问文件在哪个目录里面
如何使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.flagsinclude $(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 录音pcm源码怎样加入降噪函数
1.PCM 编码实现(M函数) function code=PCMcoding(Range,S) code=zeros(1,8); Normalization=abs(S)/Range; deta=1/2048; if sign(S)==1 code(1)=1; else code(1)=0; end detas=ceil(Normalization/deta); if detas128 code(2)=1; if detas51
android编程 如何调用系统录音机进行录音并存放在指定文件夹
如果学过就知道这是一个相对简单的问题,
首先进行布局,就是设置写按钮,文字之类的。
2.写个activity,调用系统录音程序
public class SoundRecorderActivity extends Activity implements OnClickListener {
private Button btnStart;
private Button btnStop;
private Button btnPlay;
private MediaRecorder mMediaRecorder;
private File recAudioFile;
private MusicPlayer mPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
private void setupViews() {
btnStart = (Button) findViewById(R.id.start);
btnStop = (Button) findViewById(R.id.stop);
btnPlay = (Button) findViewById(R.id.play);
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
btnPlay.setOnClickListener(this);
recAudioFile = new File("/mnt/sdcard", "new.amr");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start:
startRecorder();
break;
case R.id.stop:
stopRecorder();
break;
case R.id.play:
mPlayer = new MusicPlayer(SoundRecorderActivity.this);
mPlayer.playMicFile(recAudioFile);
break;
default:
break;
}
}
private void startRecorder() {
mMediaRecorder = new MediaRecorder();
if (recAudioFile.exists()) {
recAudioFile.delete();
}
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setOutputFile(recAudioFile.getAbsolutePath());
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mMediaRecorder.start();
}
private void stopRecorder(){
if (recAudioFile!=null) {
mMediaRecorder.stop();
mMediaRecorder.release();
}
}
}/span
如何保存到特定的目录,只需要得到recAudioFile = new File("/mnt/sdcard", "new.amr"); 就可以了。
3.设置播放类,也是调用播放方法。MediaPlayer
4添加权限
android4.0系统开发板插上USB声卡后能录音,当放音时没声音,该怎么在源码中配置声卡呢?
修改audio Hal部分代码里的函数:adev_open_output_stream 或者是 start_output_stream 函数
在其中的 pcm_open 函数调用中更改打开的声卡的设备号;
具体声卡设备号可通过文件/proc/asound/devices 查看
用Android录音机录好的声音,请问文件在哪个目录里面
如果学过就知道这是一个相对简单的问题,
首先进行布局,就是设置写按钮,文字之类的。
2.写个activity,调用系统录音程序
public class SoundRecorderActivity extends Activity implements OnClickListener {
private Button btnStart;
private Button btnStop;
private Button btnPlay;
private MediaRecorder mMediaRecorder;
private File recAudioFile;
private MusicPlayer mPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
private void setupViews() {
btnStart = (Button) findViewById(R.id.start);
btnStop = (Button) findViewById(R.id.stop);
btnPlay = (Button) findViewById(R.id.play);
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
btnPlay.setOnClickListener(this);
recAudioFile = new File("/mnt/sdcard", "new.amr");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start:
startRecorder();
break;
case R.id.stop:
stopRecorder();
break;
case R.id.play:
mPlayer = new MusicPlayer(SoundRecorderActivity.this);
mPlayer.playMicFile(recAudioFile);
break;
default:
break;
}
}
private void startRecorder() {
mMediaRecorder = new MediaRecorder();
if (recAudioFile.exists()) {
recAudioFile.delete();
}
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setOutputFile(recAudioFile.getAbsolutePath());
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mMediaRecorder.start();
}
private void stopRecorder(){
if (recAudioFile!=null) {
mMediaRecorder.stop();
mMediaRecorder.release();
}
}
}/span
如何保存到特定的目录,只需要得到recAudioFile = new File("/mnt/sdcard", "new.amr"); 就可以了。
3.设置播放类,也是调用播放方法。MediaPlayer
4添加权限
er mMediaRecorder; private File recAudioFile; private MusicPlayer mPlayer; @Over
音上下线路 android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用 CAMCORDER 摄像头的麦克风 无 VOICE_RECOGNITION 语音识别 无 VOICE_COMMUNICATION
Android录屏默认会弹出确认框,但在系统app下请求就不会弹出了(具体可以去看源码)。这也是为了谷歌为了安全考虑。不过5.0的时候这个弹框却是一个大漏洞,被国内360发现了,给你们链接^_^Android 5.0屏幕录制漏