Java 录制pcm文件并通过Audiotrack崩溃播放
我正在通过录音机录制pcm文件,并在SD卡中创建一个文件。录音完成后,我用Audiotrack播放同一个文件,但它崩溃了。在logcat中显示“无效的音频缓冲区大小”。我在SD卡上的文件大小也是0.0kb,我不明白为什么。这是代码`Java 录制pcm文件并通过Audiotrack崩溃播放,java,android,eclipse,Java,Android,Eclipse,我正在通过录音机录制pcm文件,并在SD卡中创建一个文件。录音完成后,我用Audiotrack播放同一个文件,但它崩溃了。在logcat中显示“无效的音频缓冲区大小”。我在SD卡上的文件大小也是0.0kb,我不明白为什么。这是代码` public void startRecord() { File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");
public void startRecord() {
File file = new File(Environment.getExternalStorageDirectory(),
"test.pcm");
int sampleFreq = 11025;
try {
file.createNewFile();
OutputStream outputStream = new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
outputStream);
DataOutputStream dataOutputStream = new DataOutputStream(
bufferedOutputStream);
int minBufferSize = AudioRecord.getMinBufferSize(sampleFreq,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
short[] audioData = new short[minBufferSize];
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC, sampleFreq,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
audioRecord.startRecording();
while (recording) {
int numberOfShort = audioRecord.read(audioData, 0,
minBufferSize);
for (int i = 0; i < numberOfShort; i++) {
dataOutputStream.writeShort(audioData[i]);
}
}
audioRecord.stop();
dataOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void PLaying(int explosion) {
File file = new File(Environment.getExternalStorageDirectory(),
"test.pcm");
int shortSizeInBytes = Short.SIZE / Byte.SIZE;
int bufferSizeInBytes = (int) (file.length() / shortSizeInBytes);
short[] audioData = new short[bufferSizeInBytes];
try {
InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(
inputStream);
DataInputStream dataInputStream = new DataInputStream(
bufferedInputStream);
int i = 0;
while (dataInputStream.available() > 0) {
audioData[i] = dataInputStream.readShort();
i++;
}
dataInputStream.close();
int sampleFreq = explosion;
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleFreq, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes,
AudioTrack.MODE_STREAM);
audioTrack.play();
audioTrack.write(audioData, 0, bufferSizeInBytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void startRecord(){
File File=新文件(Environment.getExternalStorageDirectory(),
“test.pcm”);
int-sampleFreq=11025;
试一试{
createNewFile();
OutputStream OutputStream=新文件OutputStream(文件);
BufferedOutputStream BufferedOutputStream=新的BufferedOutputStream(
输出流);
DataOutputStream DataOutputStream=新DataOutputStream(
缓冲输出流);
int minBufferSize=AudioRecord.getMinBufferSize(sampleFreq,
AudioFormat.CHANNEL\u配置\u单声道,
音频格式。编码(PCM(16位);
short[]audioData=新的short[minBufferSize];
音频记录=新的音频记录(
MediaRecorder.AudioSource.MIC、sampleFreq、,
AudioFormat.CHANNEL\u配置\u单声道,
AudioFormat.ENCODING_PCM_16位,最小缓冲区大小);
录音。开始录制();
同时(录音){
int numberOfShort=音频记录。读取(音频数据,0,
最小尺寸);
for(int i=0;i0){
audioData[i]=dataInputStream.readShort();
i++;
}
dataInputStream.close();
int sampleFreq=爆炸;
AudioTrack AudioTrack=新的AudioTrack(AudioManager.STREAM_MUSIC,
sampleFreq,AudioFormat.CHANNEL\u配置\u单声道,
AudioFormat.ENCODING_PCM_16位,缓冲区大小单位,
音频跟踪模式(音频流);
音轨播放();
audioTrack.write(音频数据,0,缓冲大小为字节);
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
`这段代码看起来不可靠
while (recording) {
int numberOfShort = audioRecord.read(audioData, 0,
minBufferSize);
for (int i = 0; i < numberOfShort; i++) {
dataOutputStream.writeShort(audioData[i]);
}
}
while(录制){
int numberOfShort=音频记录。读取(音频数据,0,
最小尺寸);
for(int i=0;i
录制的值是多少。值在哪里变化。如果它没有改变,它将是一个无止境的循环(除非抛出了和异常)。您是否集成了停止方法?请再给我们看一点代码。问题是,如果你没有实施正确的停止方法,它将永远循环。你是否做过这样的事情:
yourStopButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view){
recording=false;
}
});
然后,不要忘记在onStart中执行同样的操作,并将recording设置为true。在构建AudioRecord实例时,将最小缓冲区大小除以2是的,我添加了停止代码,与您在上述答案中所做的完全相同。问题其实出在我的设备上。我换了设备,它就工作了。谢谢你的帮助。是的,我也这么做了。现在正在工作。是我的设备出了问题。好吧,如果你想发布这样的应用程序,你应该处理这个问题。也许其他一些设备也有这个问题是的,你是对的,但我已经很好地处理了这个部分。事实上,困扰我的是我的设备。我换了设备,它工作了,但花了一个小时来找出确切的错误。