标签: avaudioengine

插入/拔出耳机时SKAudioNode()崩溃

我正在使用一个SKAudioNode()在我的游戏中播放背景音乐.我有一个播放/暂停功能,一切正常,直到我插入耳机.根本没有声音,当我调用暂停/播放功能时,我收到此错误

AVAudioPlayerNode.mm:333:开始:必需条件为false:_engine-> IsRunning()com.apple.coreaudio.avfaudio',原因:'必需条件为false:_engine-> IsRunning()

有谁知道这意味着什么?

码:

import SpriteKit

class GameScene: SKScene {

let loop = SKAudioNode(fileNamed: "gameloop.mp3")
let play = SKAction.play()
let pause = SKAction.pause()
var isPlaying = Bool()

override func didMoveToView(view: SKView) {  
    loop.runAction(play)
    isPlaying = true
    self.addChild(loop)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    _ = touches.first as UITouch!

    for _ in touches {
        if isPlaying {
            loop.runAction(pause)
            isPlaying = false
        } else {
            loop.runAction(play)
            isPlaying = true
        } 
    }
}
}
Run Code Online (Sandbox Code Playgroud)

sprite-kit swift avaudioengine swift2 skaudionode

12
推荐指数
1
解决办法
889
查看次数

重启录制时AVAudioEngine inputNode installTap崩溃

我正在我的应用程序中实现语音识别.当我第一次使用语音识别逻辑呈现视图控制器时,一切正常.但是,当我再次尝试呈现视图控制器时,我得到以下崩溃:

ERROR:    [0x190bf000] >avae> AVAudioNode.mm:568: CreateRecordingTap: required condition is false: IsFormatSampleRateAndChannelCountValid(format)
*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: IsFormatSampleRateAndChannelCountValid(format)'
Run Code Online (Sandbox Code Playgroud)

以下是用于启动和停止录制的代码:

@available(iOS 10.0, *)
extension DictationViewController {

fileprivate func startRecording() throws {
    guard let recognizer = speechRecognizer else {
        debugLog(className, message: "Not supported for the device's locale")
        return
    }

    guard recognizer.isAvailable else {
        debugLog(className, message: "Recognizer is not available right now")
        return
    }

    mostRecentlyProcessedSegmentDuration = 0
    guard let node = audioEngine.inputNode else {
        debugLog(className, message: …
Run Code Online (Sandbox Code Playgroud)

speech-recognition ios avaudioengine swift3 sfspeechrecognizer

12
推荐指数
4
解决办法
5680
查看次数

AVAudioEngine中的Vexing崩溃

我编写了以下AVAudioEngine代码,用于初始化我的一个自定义AUAudioUnit子类并将其连接到引擎的主混音器节点.

class AudioEngine {

    let engine = AVAudioEngine()

    init() {

        let sess = AVAudioSession.sharedInstance()
        try! sess.setCategory(AVAudioSessionCategoryPlayback)
        try! sess.setActive(true)


        let desc = AudioComponentDescription(componentType: kAudioUnitType_Generator, componentSubType: 0x00000001, componentManufacturer: 0x00000002, componentFlags: 0, componentFlagsMask: 0)

        AUAudioUnit.registerSubclass(MyAudioUnit.self, as: desc, name: "MyAudioUnit", version: 2)


        let format = engine.outputNode.outputFormat(forBus: 0)

        engine.connect(engine.mainMixerNode, to: engine.outputNode, format: format)

        AVAudioUnit.instantiate(with: desc, options: []) { (audiounit, error) in

            guard let au = audiounit else { return }

            self.engine.attach(au)
            let stereoFormat = AVAudioFormat(standardFormatWithSampleRate: format.sampleRate, channels: 2)

            // CRASHES HERE
            self.engine.connect(au, to: …
Run Code Online (Sandbox Code Playgroud)

core-audio audiounit avaudioengine

12
推荐指数
0
解决办法
406
查看次数

使用AVAudioEngine为低延迟节拍器安排声音

我正在创建一个节拍器作为更大的应用程序的一部分,我有一些非常短的wav文件用作单独的声音.我想使用AVAudioEngine,因为NSTimer存在严重的延迟问题,而Core Audio在Swift中实现起来似乎相当艰巨.我正在尝试以下方法,但我目前无法实现前3个步骤,我想知道是否有更好的方法.

代码大纲:

  1. 根据节拍器的当前设置(每个节拍的节拍数和每个节拍的细分数;节拍的文件A,细分的文件B)创建文件URL数组
  2. 以编程方式根据文件的速度和长度创建具有适当静音帧数的wav文件,并将其插入每个声音之间的数组中
  3. 将这些文件读入单个AudioBuffer或AudioBufferList
  4. audioPlayer.scheduleBuffer(buffer, atTime:nil, options:.Loops, completionHandler:nil)

到目前为止,我已经能够播放单个声音文件的循环缓冲区(步骤4),但我无法从文件数组构建缓冲区或以编程方式创建静默,也没有在StackOverflow上找到任何答案解决这个问题.所以我猜这不是最好的方法.

我的问题是:是否可以使用AVAudioEngine安排一系列低延迟的声音,然后循环该序列?如果没有,哪个框架/方法最适合在Swift编码时调度声音?

ios swift avaudioengine avaudioplayernode

11
推荐指数
2
解决办法
1918
查看次数

使用 Avaudioengine iOS 的低通滤波器 + 采样率转换

我们正在开发一个项目,该项目允许我们使用一些低通滤波器和高通滤波器以 5k Hz 采样率从麦克风录制一些声音。

我们正在使用什么

为此,我们使用AvaudioEngine 。

我们使用AVAudioConverter来降低采样率。

我们使用AVAudioUnitEQ作为低通和高通滤波器。

代码

let bus = 0
let inputNode = engine.inputNode

let equalizer = AVAudioUnitEQ(numberOfBands: 2)

equalizer.bands[0].filterType = .lowPass
equalizer.bands[0].frequency = 3000
equalizer.bands[0].bypass = false

equalizer.bands[1].filterType = .highPass
equalizer.bands[1].frequency = 1000
equalizer.bands[1].bypass = false
engine.attach(equalizer) //Attach equalizer

// Connect nodes
engine.connect(inputNode, to: equalizer, format: inputNode.inputFormat(forBus: 0))
engine.connect(equalizer, to: engine.mainMixerNode, format: inputNode.inputFormat(forBus: 0))
engine.connect(engine.mainMixerNode, to: engine.outputNode, format: inputNode.inputFormat(forBus: 0))

let outputFormat = AVAudioFormat(commonFormat: .pcmFormatInt16,
                                            sampleRate: 5000,
                                            channels: 1,
                                            interleaved: …
Run Code Online (Sandbox Code Playgroud)

frequency lowpass-filter swift highpass-filter avaudioengine

10
推荐指数
1
解决办法
837
查看次数

在AVAudioEngine中从网络流数据,是否可能?

我有一个应用程序,我用它AVAudioEngine来使用AVAudioPlayerNodes和从本地文件系统播放文件AVAudioFiles.这完全没问题.

现在我想让我的设置也支持从互联网上的服务器流式传输MP3文件.

到目前为止我尝试过的

我希望我可以从NSURL指向网络地址的对象创建某种缓冲区,然后我可以使用它AVAudioPlayerNode.

我一直在搜索Stack Overflow互联网,但没有找到任何有关如何实现这一目标的好建议.

我知道这个AVAudioEngine阵容包括:

  • AVAudioPlayerNode,可播放来自AVAudioFile或的音频AVAudioBuffer.我AVAudioFile今天已经用于我的"本地文件设置"了.
  • AVAudioFile,用于本地文件.'AVAudioFile'是使用'NSURL'创建的,所以我尝试使用指向服务器上的MP3文件的URL,就像在Playground中一样:

    var fileError: NSError? = nil
    let file = AVAudioFile(forReading: someURL, error: &fileError)
    if fileError != nil {
        fileError
    }
    
    Run Code Online (Sandbox Code Playgroud)

这会给我带来这个错误的回报:

Error Domain=com.apple.coreaudio.avfaudio Code=2003334207 "The operation couldn’t be completed. (com.apple.coreaudio.avfaudio error 2003334207.)" UserInfo=0x7fbfab424480 {failed call=ExtAudioFileOpenURL((CFURLRef)fileURL, &_extAudioFile)}
Run Code Online (Sandbox Code Playgroud)
  • AVAudioPCMBuffer,这是我希望使用的类,但我找不到用数据实例化它的方法.

我的问题(只是为了说清楚:-))

那些有光明的人知道如何使用AVAudioEngine从互联网上的服务器流式传输MP3文件吗?

或者我应该放弃并使用AVPlayer它?

期待您的回音.

macos objective-c ios swift avaudioengine

9
推荐指数
1
解决办法
1552
查看次数

来自AVAudioPCMBuffer的频谱图使用Swift中的Accelerate框架

我正试图从AVAudioPCMBufferSwift中生成一个谱图.我安装了一个tap AVAudioMixerNode并接收带有音频缓冲区的回调.我想将缓冲区中的信号转换为[Float:Float]字典,其中键表示频率,值表示相应频率上的音频幅度.

我尝试使用Apple的Accelerate框架,但我得到的结果似乎很可疑.我确定这只是我转换信号的方式.

我查看了这篇博客文章以供参考.

这是我有的:

self.audioEngine.mainMixerNode.installTapOnBus(0, bufferSize: 1024, format: nil, block: { buffer, when in
    let bufferSize: Int = Int(buffer.frameLength)

    // Set up the transform
    let log2n = UInt(round(log2(Double(bufferSize))))
    let fftSetup = vDSP_create_fftsetup(log2n, Int32(kFFTRadix2))

    // Create the complex split value to hold the output of the transform
    var realp = [Float](count: bufferSize/2, repeatedValue: 0)
    var imagp = [Float](count: bufferSize/2, repeatedValue: 0)
    var output = DSPSplitComplex(realp: &realp, imagp: &imagp)

    // Now I need to …
Run Code Online (Sandbox Code Playgroud)

audio ios accelerate-framework swift avaudioengine

9
推荐指数
1
解决办法
2888
查看次数

是否可以录制iPhone发出的音频?

我正在开发一个允许用户创建一种配音的应用程序.有一个音频文件播放,用户可以在某些时刻点击插入声音(有点像检查按钮.)我想​​知道如何捕获最终产品.

直接从iPhone捕获音频似乎是最简单的路线,因为用户已经听到成品的制作.但是,我找不到任何关于如何做到这一点.如果不可能,有什么建议吗?

avaudioplayer avaudiosession swift avaudioengine

9
推荐指数
1
解决办法
1293
查看次数

AvaudioEngine - 以特定采样率录制语音 AvaudioEngine for Analysis

我们正在开发一个从外部麦克风录制声音的项目。出于分析目的,我们需要大约 5k Hz 的采样率。

我们正在使用AvAudioEngine来录制语音。我们知道 Apple 设备希望能够以特定速率进行录制,因此我们使用AVAudioConverter来降低采样率。

但正如您所知,它与压缩类似,因此我们降低采样率越低,文件大小和文件持续时间影响相同。目前正在发生什么(如果我错了,请纠正我)。

问题

**问题是降低采样率、缩短文件长度及其对计算和分析的影响。例如,1小时的录音被降级为45分钟。所以假设如果我们对 5 分钟的时间间隔进行分析,就会出错

对此最好的解决方案是什么?**

询问

我们在互联网上进行了搜索,但我们无法弄清楚installTap上的缓冲区大小有何影响?在当前代码中,我们将其设置为2688。

谁能澄清一下吗?

代码

let bus = 0
let inputNode = engine.inputNode

let equalizer = AVAudioUnitEQ(numberOfBands: 2)

equalizer.bands[0].filterType = .lowPass
equalizer.bands[0].frequency = 3000
equalizer.bands[0].bypass = false

equalizer.bands[1].filterType = .highPass
equalizer.bands[1].frequency = 1000
equalizer.bands[1].bypass = false
engine.attach(equalizer) //Attach equalizer

// Connect nodes
engine.connect(inputNode, to: equalizer, format: inputNode.inputFormat(forBus: 0))
engine.connect(equalizer, to: engine.mainMixerNode, format: inputNode.inputFormat(forBus: 0))

// call before creating converter because this changes …
Run Code Online (Sandbox Code Playgroud)

audio core-audio sample-rate swift avaudioengine

9
推荐指数
1
解决办法
349
查看次数

使用Swift使用AVAudioEngine进行实时转换

我正在使用Swift在OSX上开发音频效果应用程序,我对集成音高效果感兴趣.

我希望能够实时地将音调调高或调高八度.目前我只收到一个干燥的信号.

我不确定这是否可行,并且想知道这是否可能,或者任何人可能有任何帮助或建议.

与该问题相关的当前代码如下:

import Cocoa
import AVFoundation


class ViewController: NSViewController {
       var engine = AVAudioEngine()
       var timePitch = AVAudioUnitTimePitch()


    override func viewDidLoad() {
         timePitch.pitch = 1200

        // Setup engine and node instances
        var mixer = engine.mainMixerNode
        var input = engine.inputNode
        var output = engine.outputNode
        var format = input.inputFormatForBus(0)
        var error:NSError?

       engine.attachNode(timePitch)

       engine.connect(input, to: timePitch, format: format)
       engine.connect(timePitch, to: output, format: format)

      engine.startAndReturnError(&error)

        super.viewDidLoad()
    }

   override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        } …
Run Code Online (Sandbox Code Playgroud)

avfoundation pitch pitch-shifting swift avaudioengine

8
推荐指数
1
解决办法
5205
查看次数