Android 无法播放录制的音频文件
我使用一个教程录制语音,对于录制,我使用classAndroid 无法播放录制的音频文件,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
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等),您可能需要通过谷歌搜索第三方库来为您完成此项工作。您可以详细说明一下吗?我应该在哪里添加标准头?不,但可以。