Оффлайн аудио рендеринг с AudioKit для iOS <11 - PullRequest
0 голосов
/ 08 мая 2018

У меня есть 4 AKPlayer узлы, и каждый из них связан с некоторыми эффектами, и, наконец, они смешаны вместе. Я хочу отобразить вывод в автономном режиме для iOS> 9.0, но не могу понять, как.

edit: я реализовал рендер и разделил его для iOS> 11 В то время как iOS> 11 renderToFile, кажется, работает хорошо, но для iOS <11 визуализированный файл имеет некоторые лаги и переходит вперед на несколько секунд, в результате чего в конце ничего не слышно. </p>

вот моя функция рендеринга:

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 узла AKPlayer, которые читают из файла ".caf".

1 Ответ

0 голосов
/ 09 мая 2018

Если вы хотите использовать 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 в URL:

@ доступно (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)
}
...