IOS音頻轉換器 AudioConverterRef

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章