1.創建
extern OSStatus
AudioConverterNewSpecific( const AudioStreamBasicDescription * inSourceFormat,
const AudioStreamBasicDescription * inDestinationFormat,
UInt32 inNumberClassDescriptions,
const AudioClassDescription * inClassDescriptions,
AudioConverterRef __nullable * __nonnull outAudioConverter)
inSourceFormat 和 inDestinationFormat 是傳入的源音頻格式和目標音頻格式
inNumberClassDescriptions 和 inClassDescriptions是傳入的音頻編碼器描述類和它的個數
outAudioConverter是傳出的AudioConverter引用
例子:
AudioStreamBasicDescription inf = {0};
inf.mSampleRate = 44100;
inf.mChannelsPerFrame = 1; //這裏只能是1,否則報錯
inf.mBitsPerChannel = 16;
inf.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;
inf.mFormatID = kAudioFormatLinearPCM;
inf.mFramesPerPacket = 1;
inf.mBytesPerFrame = inf.mBitsPerChannel * inf.mChannelsPerFrame / 8;
inf.mBytesPerPacket = inf.mFramesPerPacket*inf.mBytesPerFrame;
AudioStreamBasicDescription outf = { 0 };
outf.mFormatID = kAudioFormatMPEG4AAC;
outf.mFormatFlags = 0;
outf.mFramesPerPacket = 1024;
outf.mSampleRate = 44100;
outf.mChannelsPerFrame = 2;
<pre name="code" class="html">const OSType subtype = kAudioFormatMPEG4AAC; // kAudioEncoderComponentType的時候使用目標類型
// kAudioDecoderComponentType的時候使用源類型
AudioClassDescription requestedCodecs[2] = {
{
kAudioEncoderComponentType,
subtype,
kAppleSoftwareAudioCodecManufacturer
},
{
kAudioEncoderComponentType,
subtype,
kAppleHardwareAudioCodecManufacturer
}
};
AudioConverterRef audioConverter;
OSStatus result = AudioConverterNewSpecific(inputFormat, outputFormat,2, requestedCodecs, &audioConverter);
2.釋放
extern OSStatus
AudioConverterDispose( AudioConverterRef inAudioConverter)
inAudioConverter是AudioConverter的引用
例子:
if(audioConverter != NULL){
<span style="white-space:pre"> </span>AudioConverterDispose(audioConverter);
}
3.編碼
extern OSStatus
AudioConverterFillComplexBuffer( AudioConverterRef inAudioConverter,
AudioConverterComplexInputDataProc inInputDataProc,
void * __nullable inInputDataProcUserData,
UInt32 * ioOutputDataPacketSize,
AudioBufferList * outOutputData,
AudioStreamPacketDescription * __nullable outPacketDescription)
inAudioConverter是傳入的AudioConverter的引用
inInputDataProc是用戶自己實現的獲取編碼數據的Callback函數(
inInputDataProcUserData是獲取編碼數據的Callback函數中使用的用戶數據(一般傳輸編碼session對象)
ioOutputDataPacketSize輸出數據長度(通過獲取AudioConverter的kAudioConverterPropertyMaximumOutputPacketSize屬性獲取或自定義足夠的長度)
outOutputData輸出數據
outPacketDescription輸出數據描述
例子:
static OSStatus FillAudioDataCallback(AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets,AudioBufferList *bufferList, AudioStreamPacketDescription **outDataPacketDescription, void *inUserData)
void *data = malloc(length);
UInt32 outputDataPackets = 1;
AudioBufferList outputData;
outputData.mNumberBuffers = 1;
outputData.mBuffers[0].mNumberChannels = 2;// 輸出類型聲道數
outputData.mBuffers[0].mDataByteSize = (UInt32)length;
outputData.mBuffers[0].mData = data;
AudioStreamPacketDescription outputPacketDescription;
OSStatus status = AudioConverterFillComplexBuffer(audioConverter, FillAudioDataCallback(__bridge void *)self, &outputDataPackets, &outputData, &outputPacketDescription);