ios - 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()
}
}
解决方案
这已在即将到来的错误修复中得到解决。问题是 AKPlayer 假设传入的 AKAudioFile 是为阅读而打开的,而 AKMicrophone 的关联文件是为写作。
AKAudioPlayer 创建了一个重复的文件对象,这就是它在那里工作的原因。应该会很快更新!
推荐阅读
- swift - Swiftui coredata foreach 滚动视图:删除按钮
- java - 如何在不实例化包含方法的类的情况下从其他类调用方法
- lua - 我怎样才能让它改变 IntValue 是永久性的?
- javascript - React - URL 已更新,但页面未呈现
- sql - 组合分组的行
- blazor-webassembly - 在 OnInitializedAsync 方法中获取页面数据后如何检查标记?
- javascript - React 如何防止在每次状态更改时调用反向映射函数?
- javascript - 删除 iframe 调用的某些脚本
- java - 用户通过 Internet 进行身份验证后,如何从登录活动转发或移至家庭活动?
- sql-server - Sql Server 不更新记录