mediaRecorder录制系统声音
时间: 2023-11-22 20:05:09 浏览: 252
在 Android 平台上,要录制系统声音需要使用 MediaProjection API 和 AudioRecord API。
首先,你需要请求用户授权使用 MediaProjection API。可以通过以下代码启动授权对话框:
```java
private static final int REQUEST_MEDIA_PROJECTION = 1;
private MediaProjectionManager mMediaProjectionManager;
// 在 onCreate() 方法中初始化 mMediaProjectionManager
mMediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
// 启动授权对话框
startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
```
当用户授权后,可以在 onActivityResult() 方法中获取到 MediaProjection 对象:
```java
private MediaProjection mMediaProjection;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_MEDIA_PROJECTION && resultCode == RESULT_OK) {
mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
// 开始录制
startRecord();
}
}
```
接下来,可以使用 AudioRecord API 来录制系统声音。需要注意的是,录制系统声音需要 root 权限,或者使用系统签名的应用程序。
以下是录制系统声音的示例代码:
```java
private static final int SAMPLE_RATE = 44100;
private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private AudioRecord mAudioRecord;
private byte[] mBuffer;
private boolean mIsRecording;
private void startRecord() {
int minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT);
mBuffer = new byte[minBufferSize];
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.REMOTE_SUBMIX, SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, minBufferSize);
mAudioRecord.startRecording();
mIsRecording = true;
new Thread(new Runnable() {
@Override
public void run() {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(getExternalFilesDir(null), "record.pcm"));
while (mIsRecording) {
int readSize = mAudioRecord.read(mBuffer, 0, mBuffer.length);
if (readSize > 0) {
fos.write(mBuffer, 0, readSize);
fos.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
private void stopRecord() {
mIsRecording = false;
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord = null;
}
```
上述代码中使用了 AudioRecord.getMinBufferSize() 方法获取最小缓冲区大小,然后创建了一个 AudioRecord 对象,并使用 startRecording() 方法开始录制。
录制过程中,使用 read() 方法从 AudioRecord 中读取数据,然后将数据写入到本地文件中。
最后,使用 stop() 方法停止录制,并释放资源。
需要注意的是,上述代码中使用了 REMOTE_SUBMIX 作为录音源,这是 Android 4.4 及以上版本中新增的一种录音源,可以录制系统声音。
如果你的设备不支持 REMOTE_SUBMIX 录音源,可以尝试使用其他录音源,比如 MIC、VOICE_COMMUNICATION 等。不过,这些录音源可能无法录制系统声音,需要根据具体情况进行选择。
阅读全文