Android 无法播放录制的音频文件

Android 无法播放录制的音频文件,android,audio-recording,real-time-updates,Android,Audio Recording,Real Time Updates,我使用一个教程录制语音,对于录制,我使用classAudioRecord,因为我想用一些噪声级显示progressbar。我提供的文件中的音频数据将被存储。当文件获取音频数据时,文件的大小正在增加。但当我手动播放录制的文件时,它什么都不播放。谁能告诉我我错过了什么 private class RecordAudio extends AsyncTask<Void, Void, Void> { boolean alertshown = false; bo

我使用一个教程录制语音,对于录制,我使用class
AudioRecord
,因为我想用一些噪声级显示progressbar。我提供的文件中的音频数据将被存储。当文件获取音频数据时,文件的大小正在增加。但当我手动播放录制的文件时,它什么都不播放。谁能告诉我我错过了什么

private class RecordAudio extends AsyncTask<Void, Void, Void> {

        boolean alertshown = false;
        boolean smsdone = false;
        boolean calldone = false;
        int blocksize = 256;
        @Override
        protected Void doInBackground(Void... params) {
            //isRecording = true;
            try {
                BufferedOutputStream dos = new BufferedOutputStream(new FileOutputStream(babyNoiseFile));
                DataOutputStream dosTemp = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(babyNoiseTempFile)));


                int bufferSize = AudioRecord.getMinBufferSize(frequency,channelConfiguration, audioEncoding);
                AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,channelConfiguration, audioEncoding, bufferSize);

                short[] buffer = new short[bufferSize];
                audioRecord.startRecording();

                while (isMonitoringStarted) {
                    int bufferReadResult = audioRecord.read(buffer, 0,bufferSize);

                    //for (int i = 0; i < buffer.length; i++) {
                    for (int i = 0; i < bufferReadResult; i++) {

                        prgrssbarNoiseStatus.setProgress(buffer[i]);
                        lastlevel = buffer[i];
                        //txtvwProgress.setText(""+lastlevel);
                        //System.out.println(lastlevel);
                        if (lastlevel > lowSensitivityLevel && lastlevel < mediumSensitivityLevel){
                            dos.write(buffer[i]);
                            publishProgress();
                            break;
                        } 
                        if (lastlevel > mediumSensitivityLevel && lastlevel < highSensitivityLevel) {
                            dos.write(buffer[i]);
                            publishProgress();
                            break;
                        }
                        if (lastlevel > highSensitivityLevel) {
                            dos.write(buffer[i]);
                            publishProgress();
                            break;
                        }

                    }
                    for (int i = 0; i < bufferReadResult; i++) {
                        dosTemp.writeShort(buffer[i]);

                    }
                    //publishProgress(new Integer(r));
                }
                audioRecord.stop();
                if (isMonitoringStarted) {

                }
                dos.close();
                dosTemp.close();
            } catch (Throwable t) {
                t.getStackTrace();
                t.printStackTrace();
                Log.e("AudioRecord", "Recording Failed");
            }
            return null;
        }

        protected void onProgressUpdate(Void... progress) {

            if (lastlevel > lowSensitivityLevel && lastlevel < mediumSensitivityLevel) {
                //islowFired = false;
                System.out.println("low");
                if (!islowFired) {
                    islowFired = true;
                    lowTimer = new LowActionTimer(2000, 1000);
                    lowTimer.start();
                }

                //Toast.makeText(HomeActivity.this, "Call will fire!!", Toast.LENGTH_SHORT).show();
            }
            if (lastlevel > mediumSensitivityLevel && lastlevel < highSensitivityLevel) {
                //if (islowFired) {
                lowTimer.cancel();
                mediumTimer = new MediumActionTimer(2000, 1000);
                mediumTimer.start();
                //}
                //Toast.makeText(HomeActivity.this, "email will fire!!", Toast.LENGTH_SHORT).show();
                System.out.println("medium");
            }
            if (lastlevel > highSensitivityLevel) {
                //Toast.makeText(HomeActivity.this, "notification will fire!!", Toast.LENGTH_SHORT).show();
                System.out.println("call will fire!!");
            }
}
        protected void onPostExecute(Void result) {

        }
    }
私有类RecordAudio扩展异步任务{
布尔值=假;
布尔smsdone=false;
布尔calldone=false;
int blocksize=256;
@凌驾
受保护的Void doInBackground(Void…参数){
//isRecording=true;
试一试{
BufferedOutputStream dos=新的BufferedOutputStream(新文件输出流(babyNoiseFile));
DataOutputStream dosTemp=新的DataOutputStream(新的BufferedOutputStream(新的FileOutputStream(babyNoiseTempFile));
int bufferSize=AudioRecord.getMinBufferSize(频率、通道配置、音频编码);
AudioRecord AudioRecord=新的录音(MediaRecorder.AudioSource.MIC、频率、频道配置、音频编码、缓冲区大小);
short[]buffer=新的short[bufferSize];
录音。开始录制();
while(isMonitoringStarted){
int bufferReadResult=audioRecord.read(buffer,0,bufferSize);
//for(int i=0;i低敏感度等级和&lastlevel<中等敏感度等级){
写(缓冲区[i]);
出版进度();
打破
} 
如果(lastlevel>mediumSensitivityLevel&&lastlevel高灵敏度级别){
写(缓冲区[i]);
出版进度();
打破
}
}
for(int i=0;i低敏感度等级和&lastlevel<中等敏感度等级){
//islowFired=false;
系统输出打印项次(“低”);
如果(!islowFired){
islowFired=true;
lowTimer=新的LowActionTimer(2000,1000);
lowTimer.start();
}
//Toast.makeText(HomeActivity.this,“调用将触发!!”,Toast.LENGTH\u SHORT.show();
}
如果(lastlevel>mediumSensitivityLevel&&lastlevel高灵敏度级别){
//Toast.makeText(HomeActivity.this,“通知将触发!!”,Toast.LENGTH\u SHORT.show();
System.out.println(“调用将触发!!”;
}
}
受保护的void onPostExecute(void结果){
}
}

非常感谢。

您打算如何播放它?大多数独立播放器不会播放纯PCM数据,这就是事实。您需要添加某种WAV头,或将其转换为另一种格式。通过从SD卡打开文件。您能给我一些提示,将其转换为另一种格式以存储此录制的文件吗?如果您想要WAV(大文件大小),您只需向其中添加一个标准头。对于其他任何内容(MP3、OGG等),您可能需要通过谷歌搜索第三方库来为您完成此项工作。您可以详细说明一下吗?我应该在哪里添加标准头?不,但可以。