停止失败,带有TarsosDSP的Android应用程序

停止失败,带有TarsosDSP的Android应用程序,android,button,audio,record,Android,Button,Audio,Record,我想在此链接上使用TarsosDSP包实现一个android应用程序: 我为startRecording和stopRecording创建了两个按钮,我的应用程序会“开始”,但不会“停止”。我的主要活动是: public class MainActivity extends ActionBarActivity { private Button start; private Button stop; MicrophoneAudioDispatcher audioDispatch

我想在此链接上使用TarsosDSP包实现一个android应用程序:

我为startRecording和stopRecording创建了两个按钮,我的应用程序会“开始”,但不会“停止”。我的主要活动是:

public class MainActivity extends ActionBarActivity {

    private Button start;
    private Button stop;

MicrophoneAudioDispatcher audioDispatcher = new MicrophoneAudioDispatcher(44100, 2048, 1024);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setButtonHandlers();


        start = (Button) findViewById(R.id.btStart);
        stop = (Button) findViewById(R.id.btStop);
}

    private void setButtonHandlers() {
        ((Button)findViewById(R.id.btStart)).setOnClickListener(btnClick);
        ((Button)findViewById(R.id.btStop)).setOnClickListener(btnClick);
    }




    private void startRecording() {
        audioDispatcher.run();
       }

    private void stopRecording() { 
        audioDispatcher.stop();
    }

private View.OnClickListener btnClick = new View.OnClickListener() {

        public void onClick(View v) {

            switch(v.getId()){
            case R.id.btStart:{

                startRecording();
                break;
            }
            case R.id.btStop:{

                stopRecording();

                break;

            }
            }
        };
    };
}
“MicrophoneAudioDispatcher”类位于此链接上:

我不理解这个错误。有人能帮我吗


提前感谢。

首先,您提到的链接(TarsosDSPAndroid-v3-MAD)是一个与Android兼容的TarsosDSP fork。由于一段时间后不再需要它,如上所述:

GitHub用户srubin为加州大学伯克利分校(UC Berkley)的编程任务而创建的TarsosDSP分支已经不再需要了

与您的主要问题相关的是,您不应该手动调用AudioDispatcher的
run()
,它应该从单独的线程调用,如上面的链接中所述,如下所示:

new Thread(dispatcher,"Audio Dispatcher").start();

首先,您提到的链接(TarsosDSPAndroid-v3-MAD)是一个与Android兼容的TarsosDSP fork。由于一段时间后不再需要它,如上所述:

GitHub用户srubin为加州大学伯克利分校(UC Berkley)的编程任务而创建的TarsosDSP分支已经不再需要了

与您的主要问题相关的是,您不应该手动调用AudioDispatcher的
run()
,它应该从单独的线程调用,如上面的链接中所述,如下所示:

new Thread(dispatcher,"Audio Dispatcher").start();

您必须为AudioDispatcher初始化一个线程,才能直接调用AudioDispatcher.run()

dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050, 1024, 0);
    dispatcher.addAudioProcessor(new PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.FFT_YIN, 22050, 1024, new PitchDetectionHandler() {
        @Override
        public void handlePitch(PitchDetectionResult pitchDetectionResult,
                                AudioEvent audioEvent) {
            final float pitchInHz = pitchDetectionResult.getPitch();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mFrequencyView.setText(String.valueOf(pitchInHz));
                }
            });
        }
    }));
    new Thread(dispatcher, "Audio Dispatcher").start();
该线程将一直运行,直到调用AudioDispatcher.stop()。重要的是要避免线程留在背景上

@Override
protected void onPause() {
    super.onPause();
    dispatcher.stop();
}

您必须为AudioDispatcher初始化一个线程,才能直接调用AudioDispatcher.run()

dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050, 1024, 0);
    dispatcher.addAudioProcessor(new PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.FFT_YIN, 22050, 1024, new PitchDetectionHandler() {
        @Override
        public void handlePitch(PitchDetectionResult pitchDetectionResult,
                                AudioEvent audioEvent) {
            final float pitchInHz = pitchDetectionResult.getPitch();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mFrequencyView.setText(String.valueOf(pitchInHz));
                }
            });
        }
    }));
    new Thread(dispatcher, "Audio Dispatcher").start();
该线程将一直运行,直到调用AudioDispatcher.stop()。重要的是要避免线程留在背景上

@Override
protected void onPause() {
    super.onPause();
    dispatcher.stop();
}

第一步是确保实际调用了
stopRecording
(例如,通过添加一些日志打印)。第一步是确保实际调用了
stopRecording
(例如,通过添加一些日志打印)。