What we talk about when we talk about Technology

技術について語ります。

Extended Audio File Service でリニアPCM→AppleLossless

Extended Audio File Serviceを使えばお手軽にリニアPCMファイルを圧縮ファイルに変換することができる。

1.読み出すファイルを開く

var error: OSStatus
        
var infile : ExtAudioFileRef = nil
error = ExtAudioFileOpenURL(fromURL, &infile)

2.クライアントデータとして目標のデータフォーマットをセットする

error = ExtAudioFileSetProperty(infile,
                                kExtAudioFileProperty_ClientDataFormat,
                                UInt32(sizeof(AudioStreamBasicDescription)),
                                &format)

3.書き出すファイルを作成する

error = ExtAudioFileCreateWithURL(toURL,
                                  kAudioFileM4AType,
                                  &format,
                                  nil,
                                  1,
                                  &outfile)

4.開始位置に合わせる

error = ExtAudioFileSeek(infile, 0)

5.バッファを用意する

var readFrameSize: UInt32 = 1024
        
let bufferSize: UInt32 = UInt32(sizeof(CChar)) * readFrameSize * outputFormat.mBytesPerPacket
let buffer = malloc(Int(bufferSize))
        
var audioBuffer = AudioBuffer()
audioBuffer.mNumberChannels = outputFormat.mChannelsPerFrame
audioBuffer.mDataByteSize = bufferSize
audioBuffer.mData = buffer
var audioBufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: audioBuffer)

6.すべて読み出すまでループを回す

while true {
            
    readFrameSize = 1024
            
    // read to buffer
    error = ExtAudioFileRead(infile,
                             &readFrameSize,
                             &audioBufferList)
            
    if readFrameSize == 0 {
                
        break
    }
            
    // write from buffer
    error = ExtAudioFileWrite(outfile,
                              readFrameSize,
                              &audioBufferList)
}

7.後片付け

ExtAudioFileDispose(infile)
ExtAudioFileDispose(outfile)
free(buffer)