本文介绍了使用iOS版AudioKit的离线音频渲染< 11的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有4个AKPlayer节点,每个节点都连接到某些效果,最后将它们混合在一起.我想离线渲染iOS> 9.0的输出,但是我不知道怎么做.

I have 4 AKPlayer nodes and each one is connected to some effects and finally they are mixed together.I want to render offline the output for iOS > 9.0 but I can't figure out how.

edit:我已经实现了渲染,并将其分离为iOS> 11尽管iOS> 11 renderToFile看起来效果不错,但对于iOS< 11,呈现的文件有些滞后并在几秒钟前跳转,最终导致静音.

edit : I have implemented the render and separated it for iOS >11While iOS>11 renderToFile seems to do well, but for iOS <11 the rendered file has some lags and jumps forward at some seconds, resulting silent in the end.

这是我的渲染函数:

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")
}

混合器的输入是从".caf"文件读取的2个AKPlayer节点.

mixer's inputs are 2 AKPlayer Nodes that read from a ".caf" file.

推荐答案

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

If you want to use iOS11+ you can use AudioKit's render to file:

/// 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的URL渲染功能:

If you need support for iOS9+ use AKOfflineRenderNode's render to URL function:

@available(iOS,已作废:11)@available(tvOS,已作废:11)@available(macOS,已作废:10.13)打开类AKOfflineRenderNode:AKNode,AKComponent,AKInput {

@available(iOS, obsoleted: 11)@available(tvOS, obsoleted: 11)@available(macOS, obsoleted: 10.13)open class 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版AudioKit的离线音频渲染&lt; 11的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-18 15:41