2011-12-14 23 views
47

मैं एक एंड्रॉइड ऐप डिज़ाइन कर रहा हूं और मुझे उपयोगकर्ता की ध्वनि रिकॉर्ड करने के लिए ऑडियो रिकॉर्डॉर्ड क्लास को कार्यान्वित करने की आवश्यकता है। कुछ शोध (जो पर्याप्त जानकारी प्रदान नहीं करता) और कुछ असफल प्रयासों के बाद, मैं सोच रहा था कि अगर कोई ऑडियो रिकॉर्डर का उपयोग करके उच्च गुणवत्ता वाली ध्वनि को कैप्चर करने के तरीके पर एक उदाहरण (कोड) पोस्ट करके मेरी मदद कर सकता है। मुझे वास्तव में इसकी प्रशंसा करनी होगी। धन्यवादएंड्रॉइड ऑडियो रिकॉर्ड उदाहरण

उत्तर

74

यहां मैं आपको कुछ कोड उदाहरण पोस्ट कर रहा हूं जो ऑडियोआरकॉर्ड एपीआई का उपयोग करके ध्वनि की अच्छी गुणवत्ता रिकॉर्ड करता है।

नोट: यदि आप एमुलेटर में उपयोग करते हैं तो ध्वनि की गुणवत्ता बहुत अच्छी नहीं होगी क्योंकि हम नमूना दर 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 प्रयास करें।

हैप्पी कोडिंग !!

+1

मैं पूछ सकता है कि कितनी बार डेटा outputstream को लिखा है? और आप शॉर्ट्स में क्यों पढ़ते हैं, बाइट्स में पढ़ने के लिए एपीआई प्रस्ताव नहीं है? – james

+1

@JamesClark सर्वर पर आपके भेजने के आकार पर निर्भर करता है। यदि आपका ऑडियो डेटा 1024 शॉर्ट्स i.e 2048 बाइट्स भेज रहा है। तो आपको सर्वर पर 40ms के भीतर भेजना होगा। आप बाइट्स में भी पढ़ सकते हैं, इससे कोई फर्क नहीं पड़ता .. –

+2

इसमें जोड़ना: 44100 एकमात्र नमूना दर है जो सभी उपकरणों पर समर्थित होने की गारंटी है। http://developer.android.com/reference/android/media/AudioRecord.html –

5

यहाँ समाप्त समाधान मैं प्लेबैक के लिए एक सर्वर के लिए एंड्रॉयड माइक्रोफोन ऑडियो स्ट्रीमिंग के लिए लागू किया समाप्त करने के लिए है: Android AudioRecord to Server over UDP Playback Issues

+0

धन्यवाद बहुत सारे लोग! –