首页 > 解决方案 > AudioKit:AKPlayer 根本不加载 AKAudioFile

问题描述

我一直在尝试用 AKPlayer 替换我的代码中的 AKAudioPlayer,因为另一个问题是 AKAudioPlayer 的播放头在暂停后给出负数并且不更新。但是,在此切换之后,我遇到了一个单独的问题,即 AKPlayer 根本不加载我的 AKAudioFIle。这是我的代码的简单版本:

import UIKit
import AudioKit
import AudioKitUI

class ViewController: UIViewController
{
    var microphone : AKMicrophone!
    var mixer : AKMixer!
    var waveformBooster: AKBooster!
    var outputBooster : AKBooster!
    var exportTape : AKAudioFile!
    var recorder : AKNodeRecorder!
    var player : AKPlayer!
    var recordingTimer : Timer!
    var playTimer : Timer!

    @IBOutlet var startRecordingButton: CircularButton!
    @IBOutlet var playAndPauseRecordingButton: UIButton!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        microphone = AKMicrophone()
        mixer = AKMixer(microphone)

        AudioKit.output = mixer
        try!AudioKit.start()

        // Initialise file to store recorder output and set recorder to route mixer
        // output to file

        exportTape = try! AKAudioFile(name: "ExportTape")
        recorder = try! AKNodeRecorder(node: mixer, file: exportTape)

        // Create player with blank tape so that we have a reference player object

        player = AKPlayer(audioFile: exportTape)
    }

    @IBAction func startRecording(_ sender: UIButton)
    {
        if player.isPlaying == false
        {
            // Delete contents of output file so it can be rewritten

            try! recorder.reset()

            microphone.start()

            do
            {
                try recorder?.record()
            } catch
            {
                AKLog("Couldn't record")
            }
        }
    }

    @IBAction func stopRecording(_ sender: UIButton)
    {
        microphone.stop()
        recorder.stop()
    }

    @IBAction func playAndPauseRecording(_ sender: UIButton)
    {
        // Replace the empty or previous tape with the newly recorded one

        //player.load(audioFile: exportTape) <-- This doesn't work either
        var player = AKPlayer(audioFile: exportTape)

        // TEST

        print("CurrentTime \(player.currentTime)")
        print("StartTime \(player.startTime)")
        print("EndTime \(player.endTime)")
        print("Duration \(player.duration)")
        print("isPlaying \(player.isPlaying)")

        // END TEST

        // If something has been recorded...

        if player.duration > 0
        {
            // If the player is currently playing...

            if player.isPlaying == true
            {   
                // ...and pause the tape

                player.pause()
            } else
            {
                AudioKit.output = player
                player.play()
                print("Playing...")

                //player.resume()
            }
        }
    }
}

使用 .load() 方法和创建新的播放器实例都不适合我 - 输出如下:

CurrentTime nan
StartTime 0.0
EndTime 0.0
Duration 0.0
isPlaying false

莫名其妙地跟着

AKPlayer.swift:deinit:918:* deinit AKPlayer

这是否意味着 AKPlayer测试打印语句后取消初始化?

需要明确的是,当文件是 AKAudioPlayer 时,文件正确加载到播放器中,只是现在我将其更改为 AKPlayer,文件才不会加载。有人知道为什么是这样吗?任何帮助将非常感激。

编辑:

这是一段更短更简单的代码,但仍然显示错误:

import UIKit
import AudioKit

class ViewController: UIViewController
{
    var file : AKAudioFile!
    var player : AKPlayer!
    var audioPlayer : AKAudioPlayer!
    var microphone : AKMicrophone!
    var mixer : AKMixer!
    var recorder : AKNodeRecorder!
    var booster : AKBooster!

    @IBOutlet var startRecordingButton: UIButton!
    @IBOutlet var stopRecordingButton: UIButton!
    @IBOutlet var playRecordingButton: UIButton!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        microphone = AKMicrophone()
        mixer = AKMixer(microphone)

        booster = AKBooster(mixer)
        booster.gain = 0

        AudioKit.output = booster
        try!AudioKit.start()

        file = try! AKAudioFile(name: "file")
        recorder = try! AKNodeRecorder(node: mixer, file: file)
    }

    @IBAction func startRecording(_ sender: UIButton)
    {
        microphone.start()
        print("Recording...")

        do
        {
            try recorder?.record()
        } catch
        {
            AKLog("Couldn't record")
        }
    }

    @IBAction func stopRecording(_ sender: UIButton)
    {
        microphone.stop()
        recorder.stop()
        print("Recording Stopped")
    }

    @IBAction func playRecording(_ sender: UIButton)
    {
        audioPlayer = try! AKAudioPlayer(file: file)
        player = AKPlayer(audioFile: file)

        AudioKit.output = player
        player.play()

//        v this works! v

//        AudioKit.output = audioPlayer 
//        audioPlayer.play()
    }
}

标签: iosswiftaudiokit

解决方案


这已在即将到来的错误修复中得到解决。问题是 AKPlayer 假设传入的 AKAudioFile 是为阅读而打开的,而 AKMicrophone 的关联文件是为写作。

AKAudioPlayer 创建了一个重复的文件对象,这就是它在那里工作的原因。应该会很快更新!


推荐阅读