Java 使用tarsos android library从麦克风播放流媒体,添加效果并保存到wav文件
注意:我正在使用android studio,目前我正在使用最新版本,该版本应该与android兼容,事实上,我已经成功地将该库添加到我的android studio项目中。我以前尝试过使用JTransforms和Minim库,但没有成功。 17年8月23日编辑:发现并修复了一些错误,重新发布了当前代码,但仍没有取得任何进展,实际问题总结如下: 小结:在我发布的第5个代码块中,在注释掉的第15行,我需要知道如何使该行正常工作,而不是抛出编译错误 我试着从麦克风录音,录音时使用tarsos库中的dsp带通滤波器,并将结果输出到.wav文件。通过使用android.media导入,我可以成功地将麦克风流式传输到.wav文件,但这不允许我添加带通滤波器,使用tarsos导入功能也不允许我使用另存为.wav方法,我知道我遗漏了什么和/或做错了什么,但我已经用谷歌搜索了将近一周,还没有找到一个有效的解决方案,我只找到了库中java文件的链接,这对我没有帮助,因为我找不到关于如何正确使用它们的教程。我做错了什么?下面是我尝试使用的tarsos方法的相关代码: 相关导入和“全局”变量Java 使用tarsos android library从麦克风播放流媒体,添加效果并保存到wav文件,java,android,audio,streaming,tarsosdsp,Java,Android,Audio,Streaming,Tarsosdsp,注意:我正在使用android studio,目前我正在使用最新版本,该版本应该与android兼容,事实上,我已经成功地将该库添加到我的android studio项目中。我以前尝试过使用JTransforms和Minim库,但没有成功。 17年8月23日编辑:发现并修复了一些错误,重新发布了当前代码,但仍没有取得任何进展,实际问题总结如下: 小结:在我发布的第5个代码块中,在注释掉的第15行,我需要知道如何使该行正常工作,而不是抛出编译错误 我试着从麦克风录音,录音时使用tarsos库中的d
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.media.AudioFormat;
import android.media.AudioTrack;
import be.tarsos.dsp.AudioDispatcher;
import be.tarsos.dsp.AudioProcessor;
import be.tarsos.dsp.filters.BandPass;
import be.tarsos.dsp.io.android.AudioDispatcherFactory;
//start the class
AudioRecord alteredRecord = null;
AudioDispatcher dispatcher;
float freqChange;
float tollerance;
private static final int RECORDER_BPP = 16;
private static final String AUDIO_RECORDER_FOLDER = "Crowd_Speech";
private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
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 int bufferSize = 1024;
private Thread recordingThread = null;
//set the min buffer size in onCreate event
bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING)*4;
这将在onClick方法内启动麦克风录制,通过注释/取消注释2个“正在运行”变量值中的一个,我可以在调用startRecording方法时在过滤器或无过滤器(android或tarsos函数)之间切换
if(crowdFilter && running==0 && set==0){//crowd speech mode, start talking
Icons(2,"");
running=4;//start recording from mic, apply bandpass filter and save as wave file using TARSOS import
//running=5;//start recording from mic, no filter, save as wav file using android media import
freqChange = Globals.minFr[Globals.curUser];
tollerance = 40;
set=1;
startRecording();
}
开始记录方法:
private void startRecording() {
if (running == 5) {//start recording from mic, no filter, save as wav file using android media library
alteredRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);
alteredRecord.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
writeAudioDataToFile();
}
}, "Crowd_Speech Thread");
recordingThread.start();
}
if (running == 4) {//start recording from mic, apply bandpass filter and save as wave file using TARSOS library
dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(RECORDER_SAMPLERATE, bufferSize, 0);
AudioProcessor p = new BandPass(freqChange, tollerance, RECORDER_SAMPLERATE);
dispatcher.addAudioProcessor(p);
isRecording = true;
dispatcher.run();
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
writeAudioDataToFile();
}
}, "Crowd_Speech Thread");
recordingThread.start();
}
}
onClick方法中的停止录制按钮
if(crowdFilter && (running==4 || running==5) && set==0) {//crowd speech finished talking
Icons(1, "");
stopRecording();
set = 1;
}
在这一点之前,这两种情况都是正常的,如果running==4(应用了tarsos dsp过滤器),则程序崩溃。如果我使用running==5(没有过滤器的android.media方式),那么剩下的部分都可以正常工作并保存文件,但没有应用带通效果。如果我试着换掉alteredRecord=新的录音带。。。使用tarsos dispatcher=AudioDispatcherFactory。。。(例如dispatcher=new AudioRecord…)它们不兼容,甚至不会考虑编译。(这就是为什么下面方法中的第15行被注释掉的原因)
解决后,您需要使用writer函数,而不必使用android.media导入函数保存wav文件所需的任何方法,这是我更改的startRecording方法的工作代码段:
if (running == 4) {//start recording from mic, apply bandpass filter and save as wave file using TARSOS library
dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(RECORDER_SAMPLERATE, bufferSize, 0);
AudioProcessor p = new BandPass(freqChange, tollerance, RECORDER_SAMPLERATE);
dispatcher.addAudioProcessor(p);
isRecording = true;
// Output
RandomAccessFile outputFile = new RandomAccessFile(getFilename(), "rw");
TarsosDSPAudioFormat outputFormat = new TarsosDSPAudioFormat(44100, 16, 1, true, false);
WriterProcessor writer = new WriterProcessor(outputFormat, outputFile);
dispatcher.addAudioProcessor(writer);
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
dispatcher.run();
}
}, "Crowd_Speech Thread");
recordingThread.start();
}
我使用了您的代码进行录音,但我听到录音文件中有噪音,请告诉我们您的回复@wraithius
if (running == 4) {//start recording from mic, apply bandpass filter and save as wave file using TARSOS library
dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(RECORDER_SAMPLERATE, bufferSize, 0);
AudioProcessor p = new BandPass(freqChange, tollerance, RECORDER_SAMPLERATE);
dispatcher.addAudioProcessor(p);
isRecording = true;
// Output
RandomAccessFile outputFile = new RandomAccessFile(getFilename(), "rw");
TarsosDSPAudioFormat outputFormat = new TarsosDSPAudioFormat(44100, 16, 1, true, false);
WriterProcessor writer = new WriterProcessor(outputFormat, outputFile);
dispatcher.addAudioProcessor(writer);
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
dispatcher.run();
}
}, "Crowd_Speech Thread");
recordingThread.start();
}