मैं एक एंड्रॉइड ऐप डिज़ाइन कर रहा हूं और मुझे उपयोगकर्ता की ध्वनि रिकॉर्ड करने के लिए ऑडियो रिकॉर्डॉर्ड क्लास को कार्यान्वित करने की आवश्यकता है। कुछ शोध (जो पर्याप्त जानकारी प्रदान नहीं करता) और कुछ असफल प्रयासों के बाद, मैं सोच रहा था कि अगर कोई ऑडियो रिकॉर्डर का उपयोग करके उच्च गुणवत्ता वाली ध्वनि को कैप्चर करने के तरीके पर एक उदाहरण (कोड) पोस्ट करके मेरी मदद कर सकता है। मुझे वास्तव में इसकी प्रशंसा करनी होगी। धन्यवादएंड्रॉइड ऑडियो रिकॉर्ड उदाहरण
उत्तर
यहां मैं आपको कुछ कोड उदाहरण पोस्ट कर रहा हूं जो ऑडियोआरकॉर्ड एपीआई का उपयोग करके ध्वनि की अच्छी गुणवत्ता रिकॉर्ड करता है।
नोट: यदि आप एमुलेटर में उपयोग करते हैं तो ध्वनि की गुणवत्ता बहुत अच्छी नहीं होगी क्योंकि हम नमूना दर 8k का उपयोग कर रहे हैं जो केवल एमुलेटर में समर्थन करता है। बेहतर गुणवत्ता के लिए डिवाइस में नमूना दर 44.1k का उपयोग करें।
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);
}
}
अधिक विस्तार के लिए इस AUDIORECORD BLOG प्रयास करें।
हैप्पी कोडिंग !!
यहाँ समाप्त समाधान मैं प्लेबैक के लिए एक सर्वर के लिए एंड्रॉयड माइक्रोफोन ऑडियो स्ट्रीमिंग के लिए लागू किया समाप्त करने के लिए है: Android AudioRecord to Server over UDP Playback Issues
धन्यवाद बहुत सारे लोग! –
मैं पूछ सकता है कि कितनी बार डेटा outputstream को लिखा है? और आप शॉर्ट्स में क्यों पढ़ते हैं, बाइट्स में पढ़ने के लिए एपीआई प्रस्ताव नहीं है? – james
@JamesClark सर्वर पर आपके भेजने के आकार पर निर्भर करता है। यदि आपका ऑडियो डेटा 1024 शॉर्ट्स i.e 2048 बाइट्स भेज रहा है। तो आपको सर्वर पर 40ms के भीतर भेजना होगा। आप बाइट्स में भी पढ़ सकते हैं, इससे कोई फर्क नहीं पड़ता .. –
इसमें जोड़ना: 44100 एकमात्र नमूना दर है जो सभी उपकरणों पर समर्थित होने की गारंटी है। http://developer.android.com/reference/android/media/AudioRecord.html –