ios - 使用适用于 iOS < 11 的 AudioKit 进行离线音频渲染

标签 ios swift xcode avfoundation audiokit

我有 4 个 AKPlayer 节点,每个节点都连接到一些效果器,最后将它们混合在一起。 我想离线呈现 iOS > 9.0 的输出,但我不知道如何做。

编辑:我已经为 iOS >11 实现了渲染并将其分离 虽然 iOS>11 renderToFile 似乎做得不错,但对于 iOS <11,渲染文件有一些滞后并在几秒钟内向前跳转,导致最终无声。

这是我的渲染函数:

do{
    if #available(iOS 11, *) {
        let outputFile = try AKAudioFile(forWriting: url, settings: [:])
        _ = AudioKit.engine.isRunning
        try AudioKit.renderToFile(outputFile, duration: karaPlayer.duration, prerender: {
            self.seekTo(time: 0)
        })
    }else {
        let offlineNode = AKOfflineRenderNode(self.mixer)
        AudioKit.output = offlineNode
        offlineNode.internalRenderEnabled = false
        try AudioKit.start()    
        self.seekTo(time: 0)
        try offlineNode.renderToURL(url, duration: self.karaPlayer.duration)
        self.karaPlayer.stop()
        self.voicePlayer.stop()
        offlineNode.internalRenderEnabled = true    
    }
} catch {
    print(error)
    print("Couldn't render output file")
}

混音器的输入是 2 个从“.caf”文件读取的 AKPlayer 节点。

最佳答案

如果你想使用 iOS11+,你可以使用 AudioKit 的渲染文件:

/// Render output to an AVAudioFile for a duration.
///     - Parameters
///         - audioFile: An file initialized for writing
///         - seconds: Duration to render
///         - prerender: A closure called before rendering starts, use this to start players, set initial parameters, etc...
///
@available(iOS 11.0, macOS 10.13, tvOS 11.0, *)
public func renderToFile(_ audioFile: AVAudioFile, seconds: Double, prerender: (() -> Void)? = nil) throws {

如果您需要支持 iOS9+,请使用 AKOfflineRenderNode 的 render to URL 函数:

@available(iOS,过时:11) @available(tvOS,过时:11) @available(macOS,过时:10.13) 开放类 AKOfflineRenderNode:AKNode、AKComponent、AKInput {

public typealias AKAudioUnitType = AKOfflineRenderAudioUnit
public static let ComponentDescription = AudioComponentDescription(effect: "mnrn")
private var internalAU: AKAudioUnitType?

open var internalRenderEnabled: Bool {
    get { return internalAU!.internalRenderEnabled }
    set { internalAU!.internalRenderEnabled = newValue }
}

open func renderToURL(_ url: URL, seconds: Double, settings: [String: Any]? = nil) throws {
    return try internalAU!.render(toFile: url, seconds: seconds, settings: settings)
}

关于ios - 使用适用于 iOS < 11 的 AudioKit 进行离线音频渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50238045/

相关文章:

ios - 推送通知请求授权错误-Swift

swift - 我应该使用什么替代 UITableViewAutomaticDimension 来在 NSTableView 中获得相同的效果?

xcode - 错误: 175002 (RA layer request failed)

ios - XCode 不响应工具栏上的点击(例如打开 Assistant Editor)

iphone - 申请显示早上,晚上

ios - 带有子实体的 NSFetchRequest - 在子实体内搜索

ios wants FullScreenLayout 状态栏可见

ios - LazyVGrid 中的 SwiftUI 中心项目

ios - 表单中的 SwiftUI 选择器不显示复选标记

ios - Google Places API 图片请求网址不返回图片