Как использовать AudioConverterConvertBuffer для преобразования между PCM и IMA4? - PullRequest
0 голосов
/ 07 сентября 2018

Я записываю в 16-битном Linear PCM и хочу конвертировать его в IMA4 в режиме реального времени. Мне нужны оба формата: PCM для некоторой автономной обработки и IMA4 для локального хранилища. Я надеялся использовать AudioConverterConvertBuffer, так как оба формата, которые я использую, задают одинаковую частоту дискретизации. Однако, когда я вызываю AudioConverterConvertBuffer с моим PCM в качестве входного буфера, я получаю -50 как OSStatus (который, по-видимому, не сопоставляется ни с одним из состояний, возвращаемых API-интерфейсами AudioConverter).

Я написал это в Swift, так что, возможно, я испортил перевод моих объектов данных в небезопасные байты, но вот код, который я запускаю:

var inputFormat = AudioStreamBasicDescription()  
inputFormat.mSampleRate = 16000.0  
inputFormat.mFormatID = kAudioFormatLinearPCM  
inputFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked  
inputFormat.mBytesPerPacket = 2  
inputFormat.mFramesPerPacket = 1  
inputFormat.mBytesPerFrame = 2  
inputFormat.mChannelsPerFrame = 1  
inputFormat.mBitsPerChannel = 16  
inputFormat.mReserved = 0  

var outputFormat = AudioStreamBasicDescription()  
outputFormat.mSampleRate = 16000.0  
outputFormat.mFormatID = kAudioFormatAppleIMA4  
outputFormat.mFormatFlags = 0  
outputFormat.mBytesPerPacket = 34  
outputFormat.mFramesPerPacket = 64  
outputFormat.mBytesPerFrame = 0  
outputFormat.mChannelsPerFrame = 1  
outputFormat.mBitsPerChannel = 0  
outputFormat.mReserved = 0  

var audioConverter: AudioConverterRef?  
let inData = Data() // This contains 16000 bytes of 16-bit Linear PCM audio data  
var outData = Data(count: 32 * 1024) // Should be more than enough space  
var outByteCount = UInt32(outData.count)  

let result = AudioConverterNew(&inputFormat, &outputFormat, &audioConverter)  // result is noErr here  

let obc = inData.withUnsafeBytes { (inU8ptr: UnsafePointer) -> UInt32 in  
     outData.withUnsafeMutableBytes { (outU8ptr: UnsafeMutablePointer) -> UInt32 in  
          let result = AudioConverterConvertBuffer(audioConverter!,  
                                                   UInt32(inData.count), inU8ptr,  
                                                   &outByteCount, outU8ptr)  
          if result != noErr {  
               return UInt32(0)  
          }  

          return outByteCount  
     }  
}  

print("outputBytes after conversion = \(obc)"  

У кого-нибудь есть опыт с этим, который мог бы помочь? Я даже на правильном пути?

Спасибо

Sean

...