![](/img/trans.png)
[英]How do you attach a reverb effect to AudioRecord/PCM data and save it to a file?
[英]How to save audio of AudioRecord in a file?
背景:我正在制作一个 android 应用程序,通过它我可以捕获用户的实时音频,然后通过 Socket 将其传输到他的 PC。 我使用 AudioRecord 进行现场录音,使用 AudioTrack 收听音频。 我能够捕捉现场音频,然后同时播放。
问题:我想将我正在实时捕获的用户声音保存在一个可播放的文件中。 我尝试将 output 保存在扩展名为 .mp3 和 .pcm 的文件中,但这些文件无法播放。 我如何将 AudioRecord Object 生成的 output 保存在可以播放的文件中。
以下是我捕获和播放现场音频的代码:
AudioRecord recorder;
AudioTrack audioTrack;
short[] buffer;
int sampleRate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);//48000
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);//3840
DataOutputStream dos;
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate,
channelConfig ,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize );
recorder.startRecording();
//For playing audio
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC
, sampleRate
, AudioFormat.CHANNEL_OUT_MONO
, AudioFormat.ENCODING_PCM_16BIT
, bufferSize
, AudioTrack.MODE_STREAM);
audioTrack.setPlaybackRate(sampleRate);
audioTrack.play();
buffer = new short[bufferSize/4];
audioPlaying =true;
try {
dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(getRecordingFilePath())));
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG,"Exception >>"+e.toString());
}
while (audioPlaying){
//reading audio from buffer
int bufferReadResult =recorder.read(buffer, 0, bufferSize/4);
//playing that audio simultaneously
audioTrack.write(buffer, 0, bufferSize/4);
//Saving file (Unable to Play it)
try {
for (int i = 0; i < bufferReadResult; i++ )
{
dataOutputStream.writeShort(buffer[i]);
}
Log.d(TAG,"Writing file");
} catch (Exception e) {
Log.d(TAG,"183 Eception>>"+e.toString());
e.printStackTrace();
}
}
private String getRecordingFilePath()
{
Log.d(TAG, "Creating File for Audio");
//I am using android 11
ContextWrapper contextWrapper= new ContextWrapper(getApplicationContext());
File musicDirectory = contextWrapper.getExternalFilesDir(Environment.DIRECTORY_MUSIC);
File file = new File(musicDirectory,"testAudioFile.pcm");
String path = file.getPath();
Log.d(TAG, "File created at path:" + path);
return path;
}
经过一些研究,我找到了解决方案。 不完美,但以某种方式帮助了我。 如果有人知道更好的答案,那么下面的代码,发布它。
private void playFileAudio() {
byte[] byteData = null;
File file = null;
file = new File(getRecordingFilePath());
byteData = new byte[(int) file.length()];
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream( file );
fileInputStream.read( byteData );
fileInputStream.close();
Log.d(TAG,"File Readed");
} catch (Exception e) {
Log.d(TAG,"Exception>>:"+e.toString());
e.printStackTrace();
}
if (audioTrack!=null) {
audioTrack.play();
Log.d(TAG, "File is being played");
audioTrack.write(byteData, 0, byteData.length);
audioTrack.stop();
audioTrack.release();
}
else{
Log.d(TAG, "audio track is not initialised ");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.