2012-02-17 5 views
6

मेरे आवेदन में मैं उन तरीकों को कार्यान्वित करना चाहता हूं जो ध्वनि को रिकॉर्ड करते हैं यदि कोई आवाज होती है।एंड्रॉइड: अगर कोई आवाज होती है तो ध्वनि रिकॉर्ड करने के लिए श्रोता

कुछ इस एप्लिकेशन की तरह समान: Talking Tom Cat

तो मुझे क्या करना चाहिए? क्या कोई डेमो है जो ध्वनि के लिए सुनता है और अगर कोई ध्वनि होती है तो इसे रिकॉर्ड करता है?

उत्तर

15

अपने आवेदन में इस कोड का प्रयास करें ...

private int RECORDER_CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
private int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; 
private int RECORDER_SAMPLERATE = 44100; 
private byte RECORDER_BPP = (byte) 16; 

private AudioRecord audioRecorder; 

public void arm() { 
    // Get the minimum buffer size required for the successful creation of an AudioRecord object. 
    int bufferSizeInBytes = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, 
      RECORDER_AUDIO_ENCODING); 

    // Initialize Audio Recorder. 
    audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, 
      RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSizeInBytes); 

    // Start Recording. 
    audioRecorder.startRecording(); 

    int numberOfReadBytes = 0; 
    byte audioBuffer[] = new byte[bufferSizeInBytes]; 
    boolean recording = false; 
    float tempFloatBuffer[] = new float[3]; 
    int tempIndex = 0; 
    int totalReadBytes = 0; 
    byte totalByteBuffer[] = new byte[60 * 44100 * 2]; 

    // While data come from microphone. 
    while (true) { 
     float totalAbsValue = 0.0f; 
     short sample = 0; 

     numberOfReadBytes = audioRecorder.read(audioBuffer, 0, bufferSizeInBytes); 

     // Analyze Sound. 
     for (int i = 0; i < bufferSizeInBytes; i += 2) { 
      sample = (short) ((audioBuffer[i]) | audioBuffer[i + 1] << 8); 
      totalAbsValue += Math.abs(sample)/(numberOfReadBytes/2); 
     } 

     // Analyze temp buffer. 
     tempFloatBuffer[tempIndex % 3] = totalAbsValue; 
     float temp = 0.0f; 
     for (int i = 0; i < 3; ++i) 
      temp += tempFloatBuffer[i]; 

     if ((temp >= 0 && temp <= 350) && recording == false) { 
      Log.i("TAG", "1"); 
      tempIndex++; 
      continue; 
     } 

     if (temp > 350 && recording == false) { 
      Log.i("TAG", "2"); 
      recording = true; 
     } 

     if ((temp >= 0 && temp <= 350) && recording == true) { 
      Log.i("TAG", "Save audio to file."); 

      // Save audio to file. 
      String filepath = Environment.getExternalStorageDirectory().getPath(); 
      File file = new File(filepath, "AudioRecorder"); 
      if (!file.exists()) 
       file.mkdirs(); 

      String fn = file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".wav"; 

      long totalAudioLen = 0; 
      long totalDataLen = totalAudioLen + 36; 
      long longSampleRate = RECORDER_SAMPLERATE; 
      int channels = 1; 
      long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8; 
      totalAudioLen = totalReadBytes; 
      totalDataLen = totalAudioLen + 36; 
      byte finalBuffer[] = new byte[totalReadBytes + 44]; 

      finalBuffer[0] = 'R'; // RIFF/WAVE header 
      finalBuffer[1] = 'I'; 
      finalBuffer[2] = 'F'; 
      finalBuffer[3] = 'F'; 
      finalBuffer[4] = (byte) (totalDataLen & 0xff); 
      finalBuffer[5] = (byte) ((totalDataLen >> 8) & 0xff); 
      finalBuffer[6] = (byte) ((totalDataLen >> 16) & 0xff); 
      finalBuffer[7] = (byte) ((totalDataLen >> 24) & 0xff); 
      finalBuffer[8] = 'W'; 
      finalBuffer[9] = 'A'; 
      finalBuffer[10] = 'V'; 
      finalBuffer[11] = 'E'; 
      finalBuffer[12] = 'f'; // 'fmt ' chunk 
      finalBuffer[13] = 'm'; 
      finalBuffer[14] = 't'; 
      finalBuffer[15] = ' '; 
      finalBuffer[16] = 16; // 4 bytes: size of 'fmt ' chunk 
      finalBuffer[17] = 0; 
      finalBuffer[18] = 0; 
      finalBuffer[19] = 0; 
      finalBuffer[20] = 1; // format = 1 
      finalBuffer[21] = 0; 
      finalBuffer[22] = (byte) channels; 
      finalBuffer[23] = 0; 
      finalBuffer[24] = (byte) (longSampleRate & 0xff); 
      finalBuffer[25] = (byte) ((longSampleRate >> 8) & 0xff); 
      finalBuffer[26] = (byte) ((longSampleRate >> 16) & 0xff); 
      finalBuffer[27] = (byte) ((longSampleRate >> 24) & 0xff); 
      finalBuffer[28] = (byte) (byteRate & 0xff); 
      finalBuffer[29] = (byte) ((byteRate >> 8) & 0xff); 
      finalBuffer[30] = (byte) ((byteRate >> 16) & 0xff); 
      finalBuffer[31] = (byte) ((byteRate >> 24) & 0xff); 
      finalBuffer[32] = (byte) (2 * 16/8); // block align 
      finalBuffer[33] = 0; 
      finalBuffer[34] = RECORDER_BPP; // bits per sample 
      finalBuffer[35] = 0; 
      finalBuffer[36] = 'd'; 
      finalBuffer[37] = 'a'; 
      finalBuffer[38] = 't'; 
      finalBuffer[39] = 'a'; 
      finalBuffer[40] = (byte) (totalAudioLen & 0xff); 
      finalBuffer[41] = (byte) ((totalAudioLen >> 8) & 0xff); 
      finalBuffer[42] = (byte) ((totalAudioLen >> 16) & 0xff); 
      finalBuffer[43] = (byte) ((totalAudioLen >> 24) & 0xff); 

      for (int i = 0; i < totalReadBytes; ++i) 
       finalBuffer[44 + i] = totalByteBuffer[i]; 

      FileOutputStream out; 
      try { 
       out = new FileOutputStream(fn); 
       try { 
        out.write(finalBuffer); 
        out.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } catch (FileNotFoundException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      // */ 
      tempIndex++; 
      break; 
     } 

     // -> Recording sound here. 
     Log.i("TAG", "Recording Sound."); 
     for (int i = 0; i < numberOfReadBytes; i++) 
      totalByteBuffer[totalReadBytes + i] = audioBuffer[i]; 
     totalReadBytes += numberOfReadBytes; 
     // */ 

     tempIndex++; 
    } 
} 

अधिक जानकारी के आप भी इस डेमो देख सकते हैं के लिए ...

http://musicg.googlecode.com/files/musicg_android_demo.zip

+0

वास्तव में अच्छा उदाहरण है। लेकिन यह केवल सीटी का पता लगाता है। क्या आप जानते हैं कि उस मामले में सामान्य ध्वनि का पता कैसे लगाया जाए? –

+3

अधिक अप-वोटों का बहुत उपयोगी है। इस उदाहरण को बनाने में अपना समय बिताने के लिए धन्यवाद। – Akyl

+0

@iDroidExplorer और रुचि रखने वाले किसी और - मैंने गायब चर शामिल करने के लिए कोड को संशोधित किया है। यह मेरे लिए काम करता है लेकिन किसी और को यह भी पता चलेगा कि यह उनके लिए काम करता है (यदि आवश्यक हो तो अपने बदलावों के साथ पुनः प्रयास करें) – kape123

3

कृपया Audio Capture के बारे में Android डेवलपर पृष्ठ पर जाएं।

इसमें एक नमूना कोड है जो दर्शाता है कि ध्वनियों को कैप्चर और प्ले कैसे करें।

+0

कृपया शीर्षक को ध्यान से पढ़ें। मैंने कहा है कि मैं डेमो चाहता हूं जो ध्वनि के लिए लालसा और यदि कोई आवाज है तो यह उस ध्वनि को रिकॉर्ड करेगा। –

+0

क्या आपने पहले यह लिंक देखा है? – Raman

+0

हां मैंने यह लिंक देखा है। मैं बटन क्लिक पर रिकॉर्ड शुरू नहीं करना चाहता हूं। मैं चाहता हूं कि अगर कोई आवाज हो तो यह रिकॉर्ड ऑटोमेटिकल होनी चाहिए। –

1

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

कहा जा रहा है कि मैं प्रोग्रामिंग के लिए बहुत नया हूं, और वास्तव में किसी भी अतिरिक्त टिप्स या चाल की सराहना करता हूं।

संबंधित मुद्दे