Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用tarsos android library从麦克风播放流媒体,添加效果并保存到wav文件_Java_Android_Audio_Streaming_Tarsosdsp - Fatal编程技术网

Java 使用tarsos android library从麦克风播放流媒体,添加效果并保存到wav文件

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

注意:我正在使用android studio,目前我正在使用最新版本,该版本应该与android兼容,事实上,我已经成功地将该库添加到我的android studio项目中。我以前尝试过使用JTransforms和Minim库,但没有成功。 17年8月23日编辑:发现并修复了一些错误,重新发布了当前代码,但仍没有取得任何进展,实际问题总结如下:

小结:在我发布的第5个代码块中,在注释掉的第15行,我需要知道如何使该行正常工作,而不是抛出编译错误

我试着从麦克风录音,录音时使用tarsos库中的dsp带通滤波器,并将结果输出到.wav文件。通过使用android.media导入,我可以成功地将麦克风流式传输到.wav文件,但这不允许我添加带通滤波器,使用tarsos导入功能也不允许我使用另存为.wav方法,我知道我遗漏了什么和/或做错了什么,但我已经用谷歌搜索了将近一周,还没有找到一个有效的解决方案,我只找到了库中java文件的链接,这对我没有帮助,因为我找不到关于如何正确使用它们的教程。我做错了什么?下面是我尝试使用的tarsos方法的相关代码:

相关导入和“全局”变量

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();
    }