android MediaRecorder start failed:-38【轉】

來源:互聯網
上載者:User

標籤:寫入   code   extends   androi   fail   nbsp   運行時異常   資源   ips   

本文轉載自:http://blog.csdn.net/fnuwfnh/article/details/46698509

最近在學習android 錄音方面的知識,發現在部分手機正常啟動並執行APP,在華為平板上掛了,eclipse的Logcat顯示MediaRecorder start failed:-38。查了下資料,原因是我的APP在編碼時使用了多路錄音,而調試用的華為平板在硬體上只能單路錄音,不支援多路錄音。目前mtk的75,15,77,17平台硬體上只支援單路錄音,不支援多路錄音,後續89平台在這塊已經做了改進,多路錄音需要硬體支援,後續更高階的平台是可以支援多路錄音的。PDXXXX是mtk77平台,硬體上只支援單路錄音,不支援多路錄音。

解決的辦法就是最佳化代碼,看能不能從代碼上調整為單路錄音了。 
以下是我APP中兩處用到MIC SOURCE之處,分別用來實現邊錄音邊播放以及儲存錄音檔案。在支援多路錄音的手機上正常運行,而在不支援多路錄音的平台上,通過改代碼,測試發現要麼只能邊錄音邊播放,要麼只能儲存錄音檔案。要想儲存錄音檔案,必須得在start前(需要一段時間延遲)釋放邊錄音邊播放佔用的MIC SOURCE。

AudioRecord audioRecord2 = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,                    channelConfiguration, audioEncoding, recBufSize);    AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,                    channelConfiguration, audioEncoding,                    playBufSize, AudioTrack.MODE_STREAM);new RecordPlayThread().start();class RecordPlayThread extends Thread {            public void run() {                try {                    byte[] buffer = new byte[recBufSize2];                    audioRecord2.startRecording();//開始錄製                    audioTrack.play();//開始播放                    while (isRecording) {                        //從MIC儲存資料到緩衝區                        int bufferReadResult =        audioRecord2.read(buffer, 0, recBufSize2);                           byte[] tmpBuf = new byte[bufferReadResult];                        System.arraycopy(buffer, 0, tmpBuf, 0, bufferReadResult);                        //寫入資料即播放                        for (int i=0; i<buffer.length; i++){                        tmpBuf[i] = (byte) (tmpBuf[i]*2);                    }                    audioTrack.write(tmpBuf, 0, tmpBuf.length);                    }                    audioTrack.stop();                  audioTrack.release();                audioTrack = null;                audioRecord2.stop();                  audioRecord2.release();                audioRecord2 = null;            } catch (Throwable t) {                    Toast.makeText(testOscilloscope.this, t.getMessage(), 1000);                }            }        }    //釋放底層資源    //mRecorder.stop();    //mRecorder.release();    //mRecorder = null;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
MediaRecorder mRecorder = new MediaRecorder();mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);mRecorder.setOutputFile(Second_Path+date+".amr");mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);try {    mRecorder.prepare();    } catch (IOException e) {    Log.e(LOG_TAG, "prepare() failed");                         }                   mRecorder.start();//釋放底層資源//mRecorder.stop();//mRecorder.release();//mRecorder = null;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

記得釋放底層資源~否則會導致其它APP無法得到底層的錄音資源,從而無法錄音,導致運行時異常。

android MediaRecorder start failed:-38【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.