2015-07-29 2 views
2

Привет Я пытаюсь преобразовать AAC буфер PCM с помощью AudioConverterFillComplexBuffer..Here мой кодВыход не сгенерирован AudioConverterFillComplexBuffer для преобразования из AAC в PCM?

-(void)initDecoder{ 
     AudioStreamBasicDescription outAudioStreamBasicDescription; 
     outAudioStreamBasicDescription.mSampleRate = 44100.0; 
     outAudioStreamBasicDescription.mFormatID = kAudioFormatLinearPCM; 
     outAudioStreamBasicDescription.mFormatFlags = 0xc; 
     outAudioStreamBasicDescription.mBytesPerPacket = 2; 
     outAudioStreamBasicDescription.mFramesPerPacket = 1; 
     outAudioStreamBasicDescription.mBytesPerFrame = 2; 
     outAudioStreamBasicDescription.mChannelsPerFrame = 1; 
     outAudioStreamBasicDescription.mBitsPerChannel = 16; 

     AudioStreamBasicDescription inAudioStreamBasicDescription; 

     inAudioStreamBasicDescription.mSampleRate = 44100; 
     inAudioStreamBasicDescription.mFormatID = kAudioFormatMPEG4AAC; 
     inAudioStreamBasicDescription.mFormatFlags = kMPEG4Object_AAC_SSR; 
     inAudioStreamBasicDescription.mBytesPerPacket = 0; 
     inAudioStreamBasicDescription.mFramesPerPacket = 1024; 
     inAudioStreamBasicDescription.mBytesPerFrame = 0; 
     inAudioStreamBasicDescription.mChannelsPerFrame = 1; 
     inAudioStreamBasicDescription.mBitsPerChannel = 0; 
     inAudioStreamBasicDescription.mReserved = 0; 


     AudioClassDescription audioClassDescription; 
     memset(&audioClassDescription, 0, sizeof(audioClassDescription)); 


     audioClassDescription.mManufacturer = kAppleSoftwareAudioCodecManufacturer; 
     audioClassDescription.mSubType = outAudioStreamBasicDescription.mFormatID; 
     audioClassDescription.mType = kAudioFormatLinearPCM; 
     NSAssert(audioClassDescription.mSubType == outAudioStreamBasicDescription.mFormatID && audioClassDescription.mManufacturer == kAppleSoftwareAudioCodecManufacturer, nil); 


     NSAssert(AudioConverterNewSpecific(&inAudioStreamBasicDescription, &outAudioStreamBasicDescription, 1, &audioClassDescription, &audioConverterDecode) == 0, nil); 

    } 

    OSStatus inInputDataProc(AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets, AudioBufferList *ioData, AudioStreamPacketDescription **outDataPacketDescription, void *inUserData) 
    { 
     AudioBufferList audioBufferList = *(AudioBufferList *)inUserData; 

     ioData->mBuffers[0].mData = audioBufferList.mBuffers[0].mData; 
     ioData->mBuffers[0].mDataByteSize = audioBufferList.mBuffers[0].mDataByteSize; 

     return noErr; 
    } 

    -(void)decodeSample:(AudioBufferList)inAaudioBufferList{ 
     //inAaudioBufferList is the AAC buffer 

     if (!audioConverterDecode) { 

      [self initDecoder]; 
     } 

     NSAssert(inAaudioBufferList.mNumberBuffers == 1, nil); 

     uint32_t bufferSize = 1024*2;//inAaudioBufferList.mBuffers[0].mDataByteSize; 
     uint8_t *buffer = (uint8_t *)malloc(1024*2); 
     memset(buffer, 0, bufferSize); 
     AudioBufferList outAudioBufferList; 
     outAudioBufferList.mNumberBuffers = 1; 
     outAudioBufferList.mBuffers[0].mNumberChannels = 1; 
     outAudioBufferList.mBuffers[0].mDataByteSize = bufferSize; 
     outAudioBufferList.mBuffers[0].mData = buffer; 

     UInt32 ioOutputDataPacketSize = bufferSize; 


     OSStatus ret = AudioConverterFillComplexBuffer(audioConverterDecode, inInputDataProc, &inAaudioBufferList, &ioOutputDataPacketSize, &outAudioBufferList, NULL) ;//== 0, nil); 

     NSData *data = [NSData dataWithBytes:outAudioBufferList.mBuffers[0].mData length:outAudioBufferList.mBuffers[0].mDataByteSize]; 
     DLog(@"Rev Size = %d",(unsigned int)outAudioBufferList.mBuffers[0].mDataByteSize); 
     free(buffer); 

    } 

декодированного длина выходной равна нулю, а код OSStatus для AudioConverterFillComplexBuffer является 561015652

Так что может быть неправильно ..?

+0

Есть мой пример, как декодировать AAC для PCM http://stackoverflow.com/a/39958181/6250364 –

ответ

1

Это выстрел в темноте, и вы, вероятно, уже нашли решение этого, но я считаю, что вам нужно изменить
UInt32 ioOutputDataPacketSize = bufferSize;
к этому

UInt32 ioOutputDataPacketSize = bufferSize/2; 

Лично для меня это сделать в метод inInputDataProc и всегда посылал

UInt32 ioOutputDataPacketSize = 1; 

в метод AudioConverterFillComplexBuffer, а затем установить его в inInputDataProc как го является.

UInt32 maxPackets = audioBufferList.mBuffers[0].mDataByteSize/2; 
*ioNumberDataPackets = maxPackets;  

Надеюсь, это поможет.