【问题标题】:AudioKit 4.9.5 Microphone doesn't work, all 0 readingsAudioKit 4.9.5 麦克风不工作,全部为 0 读数
【发布时间】:2020-04-08 15:11:53
【问题描述】:

我一直在尝试将 microhpone 与 AudioKit 一起使用。

代码编译并运行,还请求访问麦克风的权限,但所有频率和幅度读数均为 0。

这是我编写的用于将麦克风读数作为事件发送的类。

我看到了其他可能相关的问题并尝试了所有问题,就像我尝试更改输入但没有运气一样。

我的猜测是要么我没有正确理解 AudioKit 生命周期,要么@objc 标签改变了行为。

这段代码曾经在旧的 ios 版本上工作,但在 13.3 上似乎有变化。 (@objc 的原因是我需要将它与 react native bridge 一起使用)

我认为这可能与 info.plist 有关,但我已使用字符串将 info.plist 配置为麦克风隐私但仍然没有运气。

我错过了什么吗?

谢谢 请在此处查看代码:

import Foundation
import AudioKit


@objc(AudioKitWrapper)
class AudioKitWrapper: NSObject {

  @objc  var mic: AKMicrophone!
  @objc  var timer: Timer!
  @objc  var tracker: AKFrequencyTracker!

  override init(){

    super.init()

    do {
        try AKSettings.setSession(category: .playAndRecord)
    } catch {
        AKLog("Could not set session category.")
    }

    AKSettings.defaultToSpeaker = true
    if let inputs = AudioKit.inputDevices {
      do {
        print(inputs)
        try AudioKit.setInputDevice(inputs[0])
        AKSettings.audioInputEnabled = true
        mic = AKMicrophone()
        try mic?.setDevice(inputs[0])
      }
      catch {
        print("microphone not supported")
      }
    }

    try? AudioKit.start()
    mic?.stop()

    self.tracker = AKFrequencyTracker.init(mic, hopSize: 4_096, peakCount: 20)
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.loop), userInfo: nil, repeats: true)

  }


  @objc func start()  {
    if (mic?.isStarted == true) {
      print("stop")
      mic?.stop()
      try! AudioKit.stop()
    }
    else {
      print("start")
      mic?.start()
//      try! AudioKit.start()
       var silence = AKBooster(tracker, gain: 0)
      AudioKit.output = silence

    }

  }

  @objc static func requiresMainQueueSetup() -> Bool {
      return false
  }

  @objc func loop() {
    if (mic?.isStarted == true){
      print(self.tracker.amplitude, self.tracker.frequency)
      EventEmitter.sharedInstance.dispatch(name: "onChange",
                                           body: ["amplitude": tracker.amplitude, "frequency":tracker.frequency])

    }


  }



}

【问题讨论】:

    标签: swift audiokit


    【解决方案1】:

    我观看了从沙盒到生产的视频,并改变了一些东西。

    我意识到我的代码的主要问题不是使用 AKBooster。将变量声明更改为视频中提到的内容并开始工作。

    这是有效的快速代码:

    import Foundation
    import AudioKit
    
    
    @objc(AudioKitWrapper)
    class AudioKitWrapper: NSObject {
    
      @objc  var mic: AKMicrophone!
      @objc  var timer: Timer!
      @objc  var tracker: AKFrequencyTracker!
      @objc  var silence: AKBooster!
      @objc  var micCopy1: AKBooster!
    
    
      @objc override init(){
        super.init()
        mic = AKMicrophone()
        micCopy1 = AKBooster(mic)
           do {
               try AKSettings.setSession(category: .playAndRecord)
               AKSettings.defaultToSpeaker = true
           } catch {
               print("Could not set session category.")
             return
           }
        if let inputs = AudioKit.inputDevices {
          do {
            try AudioKit.setInputDevice(inputs[0])
            try mic.setDevice(inputs[0])
          }
          catch {
            print("microphone not supported")
            return
          }
        }
        do {
          tracker = AKFrequencyTracker.init(micCopy1, hopSize: 4_096, peakCount: 20)
          silence = AKBooster(tracker, gain: 0)
          AudioKit.output = silence
          try AudioKit.start()
          mic.stop()
        }
        catch {
          print("AudioKit did not start")
        }
        timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(loop), userInfo: nil, repeats: true)
      }
    
      @objc func start()  {
    
        print("started?", mic?.isStarted == true)
        if (mic?.isStarted == true) {
          print("stop")
          mic?.stop()
        }
        else {
          print("start")
          mic.start()
        }
    
      }
    
      @objc static func requiresMainQueueSetup() -> Bool {
          return true
      }
    
      @objc func loop() {
        if (mic.isStarted == true){
          print("dispatch", tracker.frequency, tracker.amplitude)
          EventEmitter.sharedInstance.dispatch(name: "onChange",
                                               body: ["amplitude": self.tracker.amplitude, "frequency": self.tracker.frequency])
        }
      }
    
    
    
    }
    

    对于那些有兴趣让 AudioKit 在 React Native 上工作的人,这里是 ObjectiveC 代码:

    AudioKitBridge.m

    #import <Foundation/Foundation.h>
    #import "React/RCTBridgeModule.h"
    
    @interface RCT_EXTERN_MODULE(AudioKitWrapper, NSObject)
    
        RCT_EXTERN_METHOD(start)
    @end
    

    AudioKitBridge.h

    #ifndef AudioKitBridge_h
    #define AudioKitBridge_h
    
    #import <React/RCTBridgeModule.h>
    
    @interface AudioKitBridge: NSObject
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      相关资源
      最近更新 更多