2017-02-11 15 views
1

이 흐름이 지금 있습니다. AudioEngine을 사용하여 오디오를 녹음하고 오디오 처리 라이브러리로 보내고 오디오 버퍼를 다시 가져온 다음 쓰기를 강요합니다. wav 파일 그러나 나는 그것을 신속하게하는 방법을 완전히 혼란스러워.신속한 wav 오디오 파일에 float 배열 쓰기

나는 또 다른 유래 응답에서이 조각을 해봤지만 빈과 손상된 파일을 작성합니다.

//get data from library 

var len : CLong = 0 
let res: UnsafePointer<Double> = getData(CLong(), &len) 
let bufferPointer: UnsafeBufferPointer = UnsafeBufferPointer(start: res, count: len) 

//tranform it to Data 

let arrayDouble = Array(bufferPointer) 
let arrayFloats = arrayDouble.map{Float($0)} 
let data = try Data(buffer: bufferPointer) 

//attempt to write in file 
    do { 
     let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 16000, channels: 2, interleaved: false) 

     var buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: AVAudioFrameCount(data.count)) 
     buffer.floatChannelData!.pointee.withMemoryRebound(to: UInt8.self, capacity: data.count) { 
      let stream = OutputStream(toBuffer: $0, capacity: data.count) 
      stream.open() 
      _ = data.withUnsafeBytes { 
       stream.write($0, maxLength: data.count) 
      } 
      stream.close() 
     } 
     //settings are from AudioEngine.inputNode!.inputFormat(forBus: 0).settings 

     var audioFile = try AVAudioFile(forWriting: url, settings: settings) 
     try audioFile.write(from: buffer) 

    } catch let error as NSError { 
     print("ERROR HERE", error.localizedDescription) 
    } 

(load a pcm into a AVAudioPCMBuffer)

그래서, 나는이 floatChannelData의 변환 않는 것 같아요 잘못 또는 모든 잘못. 어떤 제안이나 조언을 어디서 읽을 것인가?

답변

3

훌륭한 동료 도움을 통해 우리는 효과를 낼 수있었습니다. 필연적으로, AudioPCMBuffer는 새로운 크기에 대해서도 알려야합니다. 또한 나는 완전히 잘못된 형식을 사용하고있었습니다. 여기

코드입니다 :

let SAMPLE_RATE = Float64(16000.0) 

let outputFormatSettings = [ 
    AVFormatIDKey:kAudioFormatLinearPCM, 
    AVLinearPCMBitDepthKey:32, 
    AVLinearPCMIsFloatKey: true, 
    // AVLinearPCMIsBigEndianKey: false, 
    AVSampleRateKey: SAMPLE_RATE, 
    AVNumberOfChannelsKey: 1 
    ] as [String : Any] 

let audioFile = try? AVAudioFile(forWriting: url, settings: outputFormatSettings, commonFormat: AVAudioCommonFormat.pcmFormatFloat32, interleaved: true) 

let bufferFormat = AVAudioFormat(settings: outputFormatSettings) 

let outputBuffer = AVAudioPCMBuffer(pcmFormat: bufferFormat, frameCapacity: AVAudioFrameCount(buff.count)) 

// i had my samples in doubles, so convert then write 

for i in 0..<buff.count { 
    outputBuffer.floatChannelData!.pointee[i] = Float(buff[i]) 
} 
outputBuffer.frameLength = AVAudioFrameCount(buff.count) 

do{ 
    try audioFile?.write(from: outputBuffer) 

} catch let error as NSError { 
    print("error:", error.localizedDescription) 
} 
+0

녹음하는 동안 wav 파일로의 전환은 내가 레코더 파일을 변환합니다 중지 한 후 현재 내가 다음 M4A 형식으로 기록 할 수 ... 완료되면 내가 궁금 안녕 zo_chu wav 형식으로. 직접 wav 형식으로 녹음을 찾고 메신저 –

+0

@ ChinchanZu 안녕하세요, 저는 wav에 직접 쓰고 매력처럼 작동합니다. 예제의 URL은 wav 파일로 연결됩니다. –