Оффлайн-рендеринг с The Amazing Audio Engine

Это сообщение также размещено на форуме The Amazing Audio Engine.

Привет всем, я новичок в The Amazing Audio Engine и разработчике iOS и пытаюсь выяснить, как получить BPM трека.

На данный момент я нашел две статьи о оффлайн рендеринге на форуме:

  1. http://forum.theamazingaudioengine.com/discussion/comment/1743/
  2. http://forum.theamazingaudioengine.com/discussion/comment/649

Насколько я знаю AEAudioControllerRenderMainOutput функция только правильно реализована в этом форке.

Я пытаюсь сделать автономный рендеринг для обработки дорожки, а затем использовать алгоритм, описанный здесь (JavaScript) и реализованный здесь.

До сих пор я загружаю эту вилку и использую Swift (в настоящее время я являюсь частью Летней академии Make School, которая преподает Swift).


При воспроизведении трека этот код работает для меня (нет оффлайн рендеринга!)

let file = NSBundle.mainBundle().URLForResource("track", withExtension: 
"m4a")
let channel: AnyObject! = AEAudioFilePlayer.audioFilePlayerWithURL(file, audioController: audioController, error: nil)


audioController = AEAudioController(audioDescription: AEAudioController.nonInterleavedFloatStereoAudioDescription())

let receiver = AEBlockAudioReceiver { (source, time, frames, audioBufferList) -> Void in

    let leftSamples = UnsafeMutablePointer<Float>(audioBufferList[0].mBuffers.mData)
    // Advance the buffer sizeof(float) * 512
    let rightSamples = UnsafeMutablePointer<Float>(audioBufferList[0].mBuffers.mData) + 512

    println("leftSamples: \(leftSamples) rightSamples: \(rightSamples)")


}

audioController.addChannels([channel])
audioController.addOutputReceiver(receiver)

audioController.start()

Попытка рендеринга в автономном режиме

Это код, который я пытаюсь запустить, пока я использую этот форк

audioController = AEAudioController(audioDescription: AEAudioController.nonInterleaved16BitStereoAudioDescription())

let file = NSBundle.mainBundle().URLForResource("track", withExtension: "mp3")
let channel: AnyObject! = AEAudioFilePlayer.audioFilePlayerWithURL(file, audioController: audioController, error: nil)

audioController.addChannels([channel])
audioController.start(nil)
audioController.stop()

var t = AudioTimeStamp()
let bufferLength: UInt32 = 4096
var buffer = AEAllocateAndInitAudioBufferList(audioController.audioDescription, Int32(bufferLength))
AEAudioControllerRenderMainOutput(audioController, t, bufferLength, buffer)

var renderDuration: NSTimeInterval = channel.duration
var sampleRate: Float64 = audioController.audioDescription.mSampleRate
var lengthInFrames: UInt32 = UInt32(renderDuration * sampleRate)
var songBuffer: [Float64]

t.mFlags = UInt32(kAudioTimeStampSampleTimeValid)
var frequencyAnalyzer = FrequencyAnalyzer()

println("renderDuration \(renderDuration)")

var outIsOpen = Boolean()

AUGraphClose(audioController.audioGraph)

AUGraphIsOpen(audioController.audioGraph, &outIsOpen)

println("AUGraphIsOpen: \(outIsOpen)")

for (var i: UInt32 = 0; i < lengthInFrames; i += bufferLength) {
    AEAudioControllerRenderMainOutput(audioController, t, bufferLength, buffer);
    t.mSampleTime += Float64(bufferLength)

    println(t.mSampleTime)
    let leftSamples = UnsafeMutablePointer<Int16>(buffer[0].mBuffers.mData)
    let rightSamples = UnsafeMutablePointer<Int16>(buffer[0].mBuffers.mData) + 512
    println("leftSamples: \(leftSamples.memory) rightSamples: \(rightSamples.memory)")
}



AEFreeAudioBufferList(buffer)


AUGraphOpen(audioController.audioGraph)
audioController.start(nil)
audioController.stop()

Оффлайн рендеринг у меня не работает. Второй пример не работает, он приносит мне много смешанных ошибок, которые я не понимаю.

Очень распространенный внутри channelAudioProducer функция на этой линии:

// Tell mixer/mixer's converter unit to render into audio status = AudioUnitRender(group->converterUnit ? group->converterUnit : group->mixerAudioUnit, arg->ioActionFlags, &arg->originalTimeStamp, 0, *frames, audio);

Это дает мне EXC_BAD_ACCESS (code=EXC_I386_GPFLT), Среди других ошибок эта очень распространена.

Извините, я абсолютный нуб в этой области, но кое-что я не совсем понимаю. Должен ли я использовать nonInterleaved16BitStereoAudioDescription или же nonInterleavedFloatStereoAudioDescription? Как это реализует mData?

Я хотел бы получить некоторую помощь по этому вопросу, так как сейчас я немного потерян. Пожалуйста, когда вы мне ответите, постарайтесь объяснить это как можно полнее, я новичок в этом деле.

ПРИМЕЧАНИЕ. Размещение кода в Objective-C - это хорошо, если вы не знаете Swift.

0 ответов

Другие вопросы по тегам