Оффлайн-рендеринг с The Amazing Audio Engine
Это сообщение также размещено на форуме The Amazing Audio Engine.
Привет всем, я новичок в The Amazing Audio Engine и разработчике iOS и пытаюсь выяснить, как получить BPM трека.
На данный момент я нашел две статьи о оффлайн рендеринге на форуме:
- http://forum.theamazingaudioengine.com/discussion/comment/1743/
- 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.