菜鸟教程小白 发表于 2022-12-13 09:22:00

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(&amp;audioClassDescription, 0, sizeof(audioClassDescription));


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


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

   }

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

      ioData-&gt;mBuffers.mData = audioBufferList.mBuffers.mData;
      ioData-&gt;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, &amp;inAaudioBufferList, &amp;ioOutputDataPacketSize, &amp;outAudioBufferList, NULL) ;//== 0, nil);

      NSData *data = .mData length:outAudioBufferList.mBuffers.mDataByteSize];
      DLog(@&#34;Rev Size = %d&#34;,(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]
查看完整版本: ios - 输出未生成 AudioConverterFillComplexBuffer 以从 AAC 转换为 PCM?