2012-11-27 15 views
5

मैं ऑडियो रिकॉर्डॉर्ड क्लास का उपयोग करके कुछ आवाज रिकॉर्ड करने की कोशिश कर रहा हूं और फिर इसे आउटपुट .pcm फ़ाइल में लिख रहा हूं। मैं चाहता हूं कि मेरा प्रोग्राम रिकॉर्डिंग जारी रखे जब तक कि स्टॉप बटन दबाया न जाए। दुर्भाग्य से कोई फर्क नहीं पड़ता कि मैं कितनी देर तक रिकॉर्डिंग कर रहा हूं, आउटपुट फ़ाइल का आकार हमेशा 3528 बाइट होता है और यह लगभग 20 एमएस तक रहता है। टूल्सॉफ्ट ऑडियो टूल्स के मुताबिक, उस फाइल की प्रोपरीज हैं: 44100 हर्ट्ज, 16 बिट्स, स्टीरियो, भले ही मैं पूरी तरह से अलग नमूना आवृत्ति के साथ मोनो का उपयोग कर रहा हूं।ऑडियो रिकॉर्ड - लेखन पीसीएम फ़ाइल

Thread recordingThread; 
boolean isRecording = false; 


int audioSource = AudioSource.MIC; 
int sampleRateInHz = 44100; 
int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); 

byte Data[] = new byte[bufferSizeInBytes]; 

AudioRecord audioRecorder = new AudioRecord(audioSource, 
              sampleRateInHz, 
              channelConfig, 
              audioFormat, 
              bufferSizeInBytes); 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
}  

public void startRecording(View arg0) { 
    audioRecorder.startRecording(); 
    isRecording = true; 
    recordingThread = new Thread(new Runnable() { 
     public void run() { 
      String filepath = Environment.getExternalStorageDirectory().getPath(); 
      FileOutputStream os = null; 
      try { 
       os = new FileOutputStream(filepath+"/record.pcm"); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      while(isRecording) { 
       audioRecorder.read(Data, 0, Data.length); 
       try { 
        os.write(Data, 0, bufferSizeInBytes); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       try { 
        os.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 
    recordingThread.start(); 
} 

public void stopRecording(View arg0) { 
    if (null != audioRecorder) { 
     isRecording = false; 
     audioRecorder.stop(); 
     audioRecorder.release(); 
     audioRecorder = null; 
     recordingThread = null; 
    } 
} 

क्या मैं आपसे पूछूंगा कि क्या गलत है? मैं आशा करती हूं जवाब 'सब कुछ' :)

+0

मुझे लगता है कि आपका आईओ कोड समस्या हो सकती है। धाराओं की प्रतिलिपि बनाने के लिए अपाचे कॉमन्स IOUtils का उपयोग करने का प्रयास करें: http://commons.apache.org/io/api-release/org/apache/commons/io/IOUtils.html#copy(java.io.InputStream,%20java.io ऑटपुटस्ट्रीम) –

उत्तर

2

Change your sample rate to 8000 नहीं होगा, क्योंकि एमुलेटर आप cant test with 44100 sample rate.

उपयोग AudioRecord स्रोत के रूप में एमुलेटर

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; 

AudioRecord audio_record = new AudioRecord(MediaRecorder.AudioSource.MIC, 
      RECORDER_SAMPLERATE, RECORDER_CHANNELS, 
      RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement); 


int BufferElements2Play = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024 
int BytesPerElement = 2; // 2 bytes in 16bit format 

If it din't get worked, then go to this blog. It will work fine for recording and storing the data in .pcm file. में खेलने के लिए दिखाए जाने वाले इन

+0

मैं अपने फोन का उपयोग कर रहा हूं, एम्यूलेटर नहीं। – Arxas

+0

रिकॉर्डिंग लॉन्च करने वाले बटन दबाए जाने के बाद उस ब्लॉग और ऐप से प्रयुक्त संपूर्ण कोड क्रैश हो गया। – Arxas

+0

नमूना दर 44100 स्टीरियो एन्कोडिंग -16 बिट में बदलें, चेक आउट करें। यह क्रैश नहीं होना चाहिए क्या आपको त्रुटि लॉग फ़ाइल मिल सकती है। –

1
try { 
       os.write(Data, 0, bufferSizeInBytes); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       os.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

यह मुद्दा है। आप केवल एक ही लिखने के बाद FileOutputStream (os.close()) को बंद कर रहे हैं। इसे लूप से बाहर ले जाएं:

while(isRecording) { 
      audioRecorder.read(Data, 0, Data.length); 
      try { 
       os.write(Data, 0, bufferSizeInBytes); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
     try { 
       os.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
    } 
संबंधित मुद्दे