使用 AudioRecord() 录制声音
Record sound using AudioRecord()
我想使用 AudioRecord 录制一些音频。为了初始化 AudioRecord 对象,您必须提供几个参数,例如(速率、通道、编码),并且由于硬件设备支持不同的参数组合,我继续检查功能性应用程序,例如
环形机器人:
Audio recording done in Ringdroid
和排练助理:
Audio recording in Rehersal Assistant
如 AudioRecord class 的文档中所述,始终有效的配置是 rate = 44100 和 channel = CHANNEL_IN_MONO.
我在初始化 AudioRecord 对象时使用了相同的参数,但我仍然收到运行时错误,提示我的对象未初始化。由于 RingDroind 在我的设备 (Nexus 5) 上运行良好,我在创建 AudioObject 时使用了相同的配置。
package com.example.android.visualizeaudio;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
int mSampleRate = 44100;
Button startButton;
boolean started = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton = (Button) this.findViewById(R.id.start_button);
}
private void RecordAudio() {
int minBufferSize = AudioRecord.getMinBufferSize(
mSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
// make sure minBufferSize can contain at least 1 second of audio (16 bits sample).
if (minBufferSize < mSampleRate * 2) {
minBufferSize = mSampleRate * 2;
}
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,
mSampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
minBufferSize
);
audioRecord.startRecording();
//Do some stuff here with the recorded data
audioRecord.stop();
audioRecord.release();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
public void startRec(View view) {
if (started) {
started = false;
startButton.setText("Start");
} else {
started = true;
startButton.setText("Stop");
Toast.makeText(this, "Recording started", Toast.LENGTH_LONG);
RecordAudio();
}
}
}
我在调试期间附加了对象检查,以防它提供更多见解
谢谢
切换到 SDK 目标版本 22 成功了。对于目标 SDK 23,我遇到了这些错误。我不知道为什么,但似乎我尝试访问的资源已被 OS.
使用
我想使用 AudioRecord 录制一些音频。为了初始化 AudioRecord 对象,您必须提供几个参数,例如(速率、通道、编码),并且由于硬件设备支持不同的参数组合,我继续检查功能性应用程序,例如
环形机器人: Audio recording done in Ringdroid
和排练助理: Audio recording in Rehersal Assistant
如 AudioRecord class 的文档中所述,始终有效的配置是 rate = 44100 和 channel = CHANNEL_IN_MONO.
我在初始化 AudioRecord 对象时使用了相同的参数,但我仍然收到运行时错误,提示我的对象未初始化。由于 RingDroind 在我的设备 (Nexus 5) 上运行良好,我在创建 AudioObject 时使用了相同的配置。
package com.example.android.visualizeaudio;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
int mSampleRate = 44100;
Button startButton;
boolean started = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton = (Button) this.findViewById(R.id.start_button);
}
private void RecordAudio() {
int minBufferSize = AudioRecord.getMinBufferSize(
mSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
// make sure minBufferSize can contain at least 1 second of audio (16 bits sample).
if (minBufferSize < mSampleRate * 2) {
minBufferSize = mSampleRate * 2;
}
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,
mSampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
minBufferSize
);
audioRecord.startRecording();
//Do some stuff here with the recorded data
audioRecord.stop();
audioRecord.release();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
public void startRec(View view) {
if (started) {
started = false;
startButton.setText("Start");
} else {
started = true;
startButton.setText("Stop");
Toast.makeText(this, "Recording started", Toast.LENGTH_LONG);
RecordAudio();
}
}
}
我在调试期间附加了对象检查,以防它提供更多见解
谢谢
切换到 SDK 目标版本 22 成功了。对于目标 SDK 23,我遇到了这些错误。我不知道为什么,但似乎我尝试访问的资源已被 OS.
使用