Tôi đang thiết kế một ứng dụng Android và tôi cần triển khai lớp AudioRecord để ghi lại âm thanh của người dùng. Sau khi một số nghiên cứu (không cung cấp đủ thông tin) và một vài lần thất bại, tôi đã tự hỏi liệu có ai có thể giúp tôi bằng cách đăng một ví dụ (mã) về cách ghi lại âm thanh chất lượng cao bằng AudioRecord hay không. Tôi thực sự sẽ đánh giá cao nó. Cảm ơn bạnVí dụ về Android AudioRecord
Trả lời
Ở đây tôi đăng cho bạn một số ví dụ về mã ghi lại chất lượng âm thanh tốt bằng cách sử dụng AudioRecord API.
Lưu ý: Nếu bạn sử dụng trong trình mô phỏng, chất lượng âm thanh sẽ không tốt vì chúng tôi đang sử dụng tỷ lệ mẫu 8k chỉ hỗ trợ trong trình mô phỏng. Trong thiết bị sử dụng tỷ lệ mẫu đến 44.1k cho chất lượng tốt hơn.
public class Audio_Record extends Activity {
private static final int RECORDER_SAMPLERATE = 8000;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private AudioRecord recorder = null;
private Thread recordingThread = null;
private boolean isRecording = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setButtonHandlers();
enableButtons(false);
int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
}
private void setButtonHandlers() {
((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick);
((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick);
}
private void enableButton(int id, boolean isEnable) {
((Button) findViewById(id)).setEnabled(isEnable);
}
private void enableButtons(boolean isRecording) {
enableButton(R.id.btnStart, !isRecording);
enableButton(R.id.btnStop, isRecording);
}
int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
int BytesPerElement = 2; // 2 bytes in 16bit format
private void startRecording() {
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
RECORDER_SAMPLERATE, RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);
recorder.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable() {
public void run() {
writeAudioDataToFile();
}
}, "AudioRecorder Thread");
recordingThread.start();
}
//convert short to byte
private byte[] short2byte(short[] sData) {
int shortArrsize = sData.length;
byte[] bytes = new byte[shortArrsize * 2];
for (int i = 0; i < shortArrsize; i++) {
bytes[i * 2] = (byte) (sData[i] & 0x00FF);
bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
sData[i] = 0;
}
return bytes;
}
private void writeAudioDataToFile() {
// Write the output audio in byte
String filePath = "/sdcard/voice8K16bitmono.pcm";
short sData[] = new short[BufferElements2Rec];
FileOutputStream os = null;
try {
os = new FileOutputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while (isRecording) {
// gets the voice output from microphone to byte format
recorder.read(sData, 0, BufferElements2Rec);
System.out.println("Short wirting to file" + sData.toString());
try {
// // writes the data to file from buffer
// // stores the voice buffer
byte bData[] = short2byte(sData);
os.write(bData, 0, BufferElements2Rec * BytesPerElement);
} catch (IOException e) {
e.printStackTrace();
}
}
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void stopRecording() {
// stops the recording activity
if (null != recorder) {
isRecording = false;
recorder.stop();
recorder.release();
recorder = null;
recordingThread = null;
}
}
private View.OnClickListener btnClick = new View.OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStart: {
enableButtons(true);
startRecording();
break;
}
case R.id.btnStop: {
enableButtons(false);
stopRecording();
break;
}
}
}
};
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
finish();
}
return super.onKeyDown(keyCode, event);
}
}
Để biết thêm chi tiết, hãy thử điều này AUDIORECORD BLOG.
Mã hóa hạnh phúc !!
Đây là giải pháp kết thúc để kết thúc mà tôi đã triển khai để phát trực tuyến âm thanh micrô Android đến máy chủ phát lại: Android AudioRecord to Server over UDP Playback Issues
Cảm ơn rất nhiều bạn! –
- 1. Ví dụ về Android SSLEngine
- 2. Ví dụ về Android của Android
- 3. Ví dụ về khóa Android 4.3
- 4. Ví dụ về MultiSelectListPreference
- 5. Ví dụ về Winsock?
- 6. Ví dụ về JGraphT
- 7. Ví dụ về D.ccurl
- 8. Ví dụ về pysmb
- 9. Android: ví dụ getRelativeTime
- 10. Cài đặt danh bạ (ví dụ: bộ lọc chỉ liên hệ) Ví dụ về mã Android
- 11. Ví dụ về các ví dụ điển hình
- 12. Android AudioRecord và MediaRecorder
- 13. Ví dụ về Android Twitter xAuth sử dụng twitter4j
- 14. Tìm kiếm ví dụ về Facebook SDK cho Android
- 15. Ví dụ về trò chơi dễ dàng cho Android
- 16. Ví dụ về người nghe Internet trên Android
- 17. Ví dụ về O (n!)?
- 18. Ví dụ về Java BitSet
- 19. Ví dụ về Fastcall GCC
- 20. Ví dụ về Hash-Collisions?
- 21. Ví dụ về DDD .NET
- 22. Ví dụ về Tcl/Tk?
- 23. ví dụ hay về Javadoc
- 24. Ví dụ về Bison java
- 25. wxPython Ví dụ về WebView
- 26. Ví dụ về jQuery & history.js
- 27. Ví dụ về AIDL sử dụng
- 28. Android Fragment Tabs Ví dụ
- 29. Ví dụ về tab kivy đơn giản
- 30. Ví dụ hay về MapServer/OpenLayers
Tôi có thể hỏi tần suất dữ liệu được ghi vào đầu ra không? Và cũng là lý do tại sao bạn đọc trong quần short, không phải là api cung cấp để đọc bằng byte? – james
@JamesClark phụ thuộc vào kích thước gửi đến máy chủ của bạn. Nếu bạn gửi dữ liệu âm thanh 1024 quần short, tức là 2048 byte. sau đó bạn phải gửi trong vòng 40ms đến server.you có thể đọc theo byte quá không tạo ra nhiều khác biệt .. –
Thêm vào đây: 44100 là tốc độ mẫu duy nhất được đảm bảo được hỗ trợ trên tất cả các thiết bị. http://developer.android.com/reference/android/media/AudioRecord.html –