標籤:寫入 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【轉】