2016-10-06 10 views
0

私はAudioUnit Renderでオフラインレンダリングをしようとしていますが、どのパラメータが間違っているかわかりません。おそらくバッファリングのサイズです。paramErr -50 from AudioUnitRender swift

私はこの問題に迅速かつコアオーディオを使用しています。ここでは、GenericOutput audioUnitからコードを取得するときのコードを少し紹介します。

おかげ

func pullGenericOutput(_ player: UnsafeMutablePointer<AUGraphPlayer>){ 
     //var player = AUGraphPlayer() 

    do { 
    var flags = AudioUnitRenderActionFlags() 
    var inTimeStamp = AudioTimeStamp() 
    inTimeStamp.mFlags = .sampleTimeValid 

    var busNumber:UInt32 = 0 
    var numberFrames:UInt32 = 512 
    inTimeStamp.mSampleTime = 0 
    var channelCount = 2 

    print("Final numberFrames :\(numberFrames)") 
    var totFrms = MaxSampleTime 

    while totFrms > 0 { 

     if totFrms < numberFrames { 
      numberFrames = totFrms 
      print("Final numberFrames :\(numberFrames)") 
      print("stuck") 
      } 
     else { 
      totFrms -= numberFrames 
     } 
     var bufferList = AudioBufferList() 
    bufferList.mNumberBuffers = UInt32(channelCount) 

    for j in 0..<channelCount { 
     var buffer = AudioBuffer() 
    buffer.mNumberChannels = 1 
    buffer.mDataByteSize = numberFrames * UInt32(MemoryLayout.size(ofValue: UInt32.self)) 
    buffer.mData = calloc(Int(numberFrames), MemoryLayout.size(ofValue: UInt32.self)) 

    bufferList.mBuffers = buffer 
    }//for loop end 
     //var actionFlags = AudioUnitRenderActionFlags(rawValue: UInt32(flags)) 
     // print(actionFlags) 
    Utility.check(AudioUnitRender(player.pointee.mGIO!, &flags, &inTimeStamp, busNumber, numberFrames, &bufferList), operation: "AudioUnitRender mGIO") 

     inTimeStamp.mSampleTime += inTimeStamp.mSampleTime 

    Utility.check(ExtAudioFileWrite(player.pointee.extAudioFile!, numberFrames, &bufferList), operation: ("extaudiofilewrite fail")) 
    }//while loop end 
    self.filesSavingCompleted(player) 
    } 
    } 
+0

オーディオ-50エラーには、サポートされていないオーディオ形式が設定されていることがよくあります。あなたのフォーマット仕様(ビット、バイト、チャンネル、サンプルレートなど)は何ですか? – hotpaw2

+0

私はこれを使用しています http://imgur.com/a/E9N72 私はgetpropertyを使って残りの部分を埋める – masaldana2

答えて

1

これをお試しください!

var flags: AudioUnitRenderActionFlags = AudioUnitRenderActionFlags(rawValue: 0) 
var inTimeStamp = AudioTimeStamp() 

memset(&inTimeStamp, 0, MemoryLayout.size(ofValue: inTimeStamp)) 
inTimeStamp.mFlags = .smpteTimeValid 

let busNumber: UInt32 = 0 
var numberFrames: UInt32 = 1024 
inTimeStamp.mSampleTime = 0 
let channelCount: Int = 2 
var totFrms: Int = Int(maxSampleTime) 

while totFrms > 0 { 

    if UInt32(totFrms) < numberFrames { 
     numberFrames = UInt32(totFrms) 
    } else { 
     totFrms -= Int(numberFrames) 
    } 

    let bufferList = AudioBufferList.allocate(maximumBuffers: Int(channelCount)) 

    for i in 0...channelCount-1 { 

     var buffer = AudioBuffer() 
     buffer.mNumberChannels = 1 
     buffer.mDataByteSize = numberFrames * 4 
     buffer.mData = calloc(Int(numberFrames), 4) 
     bufferList[i] = buffer 

     var result: OSStatus = AudioUnitRender(mGIO!, &flags, &inTimeStamp, busNumber, numberFrames, bufferList.unsafeMutablePointer) 
       print(result)    
     if result == 0 { 
      result = ExtAudioFileWrite(extAudioFile!, numberFrames, bufferList.unsafeMutablePointer) 
     } 
     inTimeStamp.mSampleTime += Float64(numberFrames) 
    } 
} 
関連する問題