2016-08-29 4 views
1

Я пытаюсь преобразовать записанный аудиофайл в необработанные данные PCM типа [Double]. Я нашел способ загрузки и конвертирования аудио в PCM данных типа [float32], как это:Преобразование аудио в необработанные данные PCM типа [Double]

// 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))) 

Проблема заключается в том, мне нужны данные как [Double] и AVAudioPCMBuffer() только знает .PCMFormatFloat32. Кто-нибудь знает обходное решение? Спасибо.

ответ

1

Но AVAudioFormatли знать .PCMFormatFloat64:

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

Может быть, вы имеете в виду AVAudioPCMBuffer не имеет свойство float64ChannelData удобство?

Это нормально, вы можете использовать суперкласс AVAudioPCMBuffer «s, AVAudioBuffer имеет everying вы должны быть в состоянии получить на сырье Double/Float64 образцов:

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

этот код больше не работает.
здесь новый рабочий код.

Swift 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)))