2016-08-29 12 views
1

녹음 된 오디오 파일을 [Double] 유형의 원시 PCM 데이터로 변환하려고합니다.오디오를 [Double] 유형의 원시 PCM 데이터로 변환

는 문제가
// load audio from path 
    let file = try! AVAudioFile(forReading: self.soundFileURL) 
    // declare format 
    let format = AVAudioFormat(commonFormat: .PCMFormatFloat32, sampleRate: file.fileFormat.sampleRate, channels: 1, interleaved: false) 
    // initialize audiobuffer with the length of the audio file 
    let buf = AVAudioPCMBuffer(PCMFormat: format, frameCapacity: UInt32(file.length)) 
    // write to file 
    try! file.readIntoBuffer(buf) 
    // copy to array 
    let floatArray = Array(UnsafeBufferPointer(start: buf.floatChannelData[0], count:Int(buf.frameLength))) 

, 나는 [더블] 및 AVAudioPCMBuffer (같은 데이터가 필요) 만이 .PCMFormatFloat32 알고 : I로드와 같은 유형 [Float32]의 데이터를 PCM 오디오로 변환 할 수있는 방법을 발견했다. 아무도 해결 방법을 알고 있습니까? 감사합니다.

답변

1

그러나 AVAudioFormat.PCMFormatFloat64을 알고 않습니다

let format = AVAudioFormat(commonFormat: .PCMFormatFloat64, sampleRate: file.fileFormat.sampleRate, channels: 1, interleaved: false) 

은 어쩌면 당신은 AVAudioPCMBufferfloat64ChannelData 편의 속성이 없습니다 의미? 전체에서

let abl = buf.audioBufferList.memory 
let doubles = UnsafePointer<Double>(abl.mBuffers.mData) 
doubles[0] // etc... 

:

let file = try! AVAudioFile(forReading: self.soundFileURL) 
let format = AVAudioFormat(commonFormat: .PCMFormatFloat64, sampleRate: file.fileFormat.sampleRate, channels: 1, interleaved: false) 

let buf = AVAudioPCMBuffer(PCMFormat: format, frameCapacity: UInt32(file.length)) 
try! file.readIntoBuffer(buf) 
let abl = buf.audioBufferList.memory 
let doubles = UnsafePointer<Float64>(abl.mBuffers.mData) 
+0

어떤 때'readIntoBuffer()'됩니까? 그것은 나를 위해 작동합니다. 전체 코드를 표시하도록 질문을 업데이트했습니다. –

+0

대답 해 주셔서 감사합니다. 내 문제를 해결했습니다! 나는 여전히 AVAudioPCMBuffer를 사용했다는 것을 알지 못했다. – user967493

0

괜찮아요, 당신이 AVAudioPCMBuffer의 슈퍼 클래스를 사용할 수 AVAudioBuffer는 원시 Double/Float64 샘플을 얻을 수 있어야합니다 everying있다 그 코드는 더 이상 작동하지 않을 수도 있습니다.
여기에 새로운 작업 코드가 있습니다. 스위프트

3.2

let file = try! AVAudioFile(forReading: soundFileURL) 
let format = AVAudioFormat(commonFormat: .PCMFormatFloat64, sampleRate: file.fileFormat.sampleRate, channels: file.fileFormat.channelCount, interleaved: false) 
let buf = AVAudioPCMBuffer(PCMFormat: format, frameCapacity: AVAudioFrameCount(file.length)) 
try! file.readIntoBuffer(buf) 
let abl = Array(UnsafeBufferPointer(start: buf.audioBufferList, count: Int(buf.audioBufferList.pointee.mNumberBuffers))) 
let buffer = audioBufferList[0].mBuffers 
let mDataList = Array(UnsafeMutableRawBufferPointer(start: buffer.mData, count: Int(buffer.mDataByteSize)))