ios - 输出未生成 AudioConverterFillComplexBuffer 以从 AAC 转换为 PCM?
<p><p>您好,我正在尝试使用 AudioConverterFillComplexBuffer 将 AAC 缓冲区转换为 PCM。这是我的代码</p>
<pre><code> -(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.mData = audioBufferList.mBuffers.mData;
ioData->mBuffers.mDataByteSize = audioBufferList.mBuffers.mDataByteSize;
returnnoErr;
}
-(void)decodeSample:(AudioBufferList)inAaudioBufferList{
//inAaudioBufferList is the AAC buffer
if (!audioConverterDecode) {
;
}
NSAssert(inAaudioBufferList.mNumberBuffers == 1, nil);
uint32_t bufferSize = 1024*2;//inAaudioBufferList.mBuffers.mDataByteSize;
uint8_t *buffer = (uint8_t *)malloc(1024*2);
memset(buffer, 0, bufferSize);
AudioBufferList outAudioBufferList;
outAudioBufferList.mNumberBuffers = 1;
outAudioBufferList.mBuffers.mNumberChannels = 1;
outAudioBufferList.mBuffers.mDataByteSize = bufferSize;
outAudioBufferList.mBuffers.mData = buffer;
UInt32 ioOutputDataPacketSize = bufferSize;
OSStatus ret = AudioConverterFillComplexBuffer(audioConverterDecode, inInputDataProc, &inAaudioBufferList, &ioOutputDataPacketSize, &outAudioBufferList, NULL) ;//== 0, nil);
NSData *data = .mData length:outAudioBufferList.mBuffers.mDataByteSize];
DLog(@"Rev Size = %d",(unsigned int)outAudioBufferList.mBuffers.mDataByteSize);
free(buffer);
}
</code></pre>
<p>解码后的输出长度为零,AudioConverterFillComplexBuffer 的 OSStatus 代码为 561015652</p>
<p>那么可能出了什么问题..?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>这是在黑暗中拍摄的,您可能已经找到了解决方案,但我相信您需要更改它<br/>
<code>UInt32 ioOutputDataPacketSize = bufferSize;</code><br/>
到这个</p>
<pre><code>UInt32 ioOutputDataPacketSize = bufferSize/2;
</code></pre>
<p>就我个人而言,我在 inInputDataProc 方法中执行此操作并始终发送 </p>
<pre><code>UInt32 ioOutputDataPacketSize = 1;
</code></pre>
<p>进入 AudioConverterFillComplexBuffer 方法,然后像这样在 inInputDataProc 中设置它。 </p>
<pre><code>UInt32 maxPackets = audioBufferList.mBuffers.mDataByteSize / 2;
*ioNumberDataPackets = maxPackets;
</code></pre>
<p>希望这会有所帮助。</p></p>
<p style="font-size: 20px;">关于ios - 输出未生成 AudioConverterFillComplexBuffer 以从 AAC 转换为 PCM?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/31691361/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/31691361/
</a>
</p>
页:
[1]