gpt4 book ai didi

Android 音频录制到 wav

转载 作者:行者123 更新时间:2023-11-29 17:32:31 26 4
gpt4 key购买 nike

我使用 Android 上的录音机录制了一段音频,它生成了一个原始 PCM 文件。我正在尝试将其转换为我可以收听的格式(例如 wav 或 mp3。

我从这个例子开始,但不知道从这里到哪里去:Android AudioRecord example

尝试了以下这些: http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java

Recording .Wav with Android AudioRecorder

这是我要记录的代码(请注意,我正在使用倒数计时器告诉它何时开始和停止记录。

public class AudioRecordService extends Service {
Toast toast;
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private AudioRecord record = null;
int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
int BytesPerElement = 2; // 2 bytes in 16bit format
private Thread recordingThread = null;
private boolean isRecording = false;
int buffsize = 0;

public AudioRecordService() {
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}

public int onStartCommand(Intent intent, int flags, int startId)
{
try {
buffsize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);

record = new AudioRecord(MediaRecorder.AudioSource.MIC,
RECORDER_SAMPLERATE, RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING, buffsize);

record.startRecording();

CountDownTimer countDowntimer = new CountDownTimer(15000, 1000) {
public void onTick(long millisUntilFinished) {
toast = Toast.makeText(AudioRecordService.this, "Recording", Toast.LENGTH_SHORT);
toast.show();
isRecording = true;
recordingThread = new Thread(new Runnable() {
public void run() {
writeAudioDataToFile();
}
}, "AudioRecorder Thread");
recordingThread.start();
}

public void onFinish() {
try {
toast.cancel();
Toast.makeText(AudioRecordService.this, "Done Recording ", Toast.LENGTH_SHORT).show();
isRecording = false;
record.stop();
record.release();
record = null;
recordingThread = null;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}};
countDowntimer.start();
}
catch (Exception ex)
{
ex.printStackTrace();
}
return Service.START_STICKY;
}

private byte[] short2byte(short[] sData) {
int shortArrsize = sData.length;
byte[] bytes = new byte[shortArrsize * 2];
for (int i = 0; i < shortArrsize; i++) {
bytes[i * 2] = (byte) (sData[i] & 0x00FF);
bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
sData[i] = 0;
}
return bytes;

}

private void writeAudioDataToFile() {
try {
//String filePath = "/sdcard/voice8K16bitmono.pcm";
String extState = Environment.getExternalStorageState();
// Path to write files to
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC + "/test").getAbsolutePath();

String fileName = "audio.pcm";
String externalStorage = Environment.getExternalStorageDirectory().getAbsolutePath();
File file = new File(externalStorage + File.separator + fileName);

// if file doesnt exists, then create it
if (!file.exists()) {
file.createNewFile();
}
short sData[] = new short[BufferElements2Rec];

FileOutputStream os = null;
try {
os = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}

while (isRecording) {
// gets the voice output from microphone to byte format

record.read(sData, 0, BufferElements2Rec);
System.out.println("Short wirting to file" + sData.toString());
try {
// // writes the data to file from buffer
// // stores the voice buffer
byte bData[] = short2byte(sData);
os.write(bData, 0, BufferElements2Rec * BytesPerElement);
} catch (IOException e) {
e.printStackTrace();
}
}
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}

我的 audio.pcm 已创建。但是我不知道怎么玩。我假设 bDate[] 是正在写入的字节数组。我创建的链接说他们使用了这些文件,但没有显示如何完成的示例。

如果重要的话,我已经使用 GoldWave 打开文件。它可以打开,但音频乱七八糟。

我还注意到我的文件是 2 秒,我认为这是因为 BytesPerElement 和 BufferElements2Rec。如果你能帮我解决问题,那将是 15 秒,那就太好了。

提前致谢!

最佳答案

PCM 文件和 WAV 文件之间的唯一区别是 PCM 文件没有标题,而 WAV 文件有。 WAV header 包含用于播放的关键信息,例如采样率、每个样本的位数和 channel 数。当您加载 PCM 文件时,应用程序必须事先知道此信息,或者您必须告诉它。例如,如果您将 PCM 文件加载到 audacity 中,它会提示您填写所有这些内容。

为了使现有的保存文件成为 .WAV,您需要在前面加上适当的标题。我不打算详细介绍它,因为已经有很多关于 SO 的详细答案,并且可以在网上轻松获得 (https://en.wikipedia.org/wiki/WAV)

您提出的关于文件长度的第二个问题可能与以下事实有关:AudioRecord.read 返回一个 int,它是实际读取的样本数,因为它可能比您要求的要少为了。这确实是第二个问题

关于Android 音频录制到 wav,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32218360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com