【问题标题】:Getting NullPointer exception using Tarsos DSP in dispatcher.addAudioProcessor(p);在 dispatcher.addAudioProcessor(p) 中使用 Tarsos DSP 获取 NullPointer 异常;
【发布时间】:2018-03-12 16:36:59
【问题描述】:

我使用 Tarsos DSP 来确定声音的频率,即从麦克风输入的声音。它可以在大多数设备上完美运行,但其中一些会出错。

错误:

    java.lang.RuntimeException: 
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2695)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2769)
at android.app.ActivityThread.access$900 (ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1430)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:135)
at android.app.ActivityThread.main (ActivityThread.java:5910)
at java.lang.reflect.Method.invoke (Native Method)
at java.lang.reflect.Method.invoke (Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200)
    Caused by: java.lang.NullPointerException: 
at com.example.denissobolevsky.mmm.MainActivity.onCreate (MainActivity.java:1546)
at android.app.Activity.performCreate (Activity.java:6178)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2648)

代码(第 1545-1547 行):

AudioProcessor p = new PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.FFT_YIN, 22050, 1024, pdh);
    dispatcher.addAudioProcessor(p);
    new Thread(dispatcher, "Audio Dispatcher").start();

而调度员是:

  AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050, 1024, 0);

【问题讨论】:

  • dispatcher 只是空值。在第 1546 行之前添加一个空检查。if (dispatcher != null) { dispatcher.addAudioProcessor(p); new Thread(dispatcher, "Audio Dispatcher").start();}
  • 谢谢,它消除了错误。但是你知道为什么dispatcher被定义为null吗?
  • 请看我的回答。谢谢。

标签: android nullpointerexception frequency tarsosdsp


【解决方案1】:

因此,这不仅仅是NullPointerException 的问题,它可以通过在从对象中取出某些内容之前检查空值来轻松解决。因此,只需这样做,您就可以摆脱这个错误。

if (dispatcher != null) { 
    dispatcher.addAudioProcessor(p); 
    new Thread(dispatcher, "Audio Dispatcher").start();
}

现在下一个问题是为什么dispatcher 变为空。因此,我也可以给你一些见解。

AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050, 1024, 0);

这是您用来初始化dispatcher 的代码。第一个参数是采样率,第二个参数表示缓冲区大小,最后一个参数表示重叠缓冲区大小。因此,它应该在大多数设备中完美运行,因为我认为大多数设备都支持您提供的采样率。不支持 22050 采样率的设备正在抛出异常/错误。

要获得 Android 设备支持的采样率和缓冲区大小,您可以查看this answer of mine here

希望对您有所帮助。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多