菜鸟教程小白 发表于 2022-12-12 22:40:59

ios - 为特定的 ASBD 缓冲区获取正确的数字数据类型转换


                                            <p><p>我有一个 <code>AudioBuffer</code>,它的 <code>void *mData</code> 充满了使用 Apple 的 CoreAudio Audio Unit API 新鲜渲染的音频样本,但我在获取样本时遇到了问题以正确的格式。该缓冲区的ASBD如下:</p>

<pre><code>Float64 mSampleRate      44100
UInt32mFormatID          1819304813
UInt32mFormatFlags       41
UInt32mBytesPerPacket    4
UInt32mFramesPerPacket   1
UInt32mBytesPerFrame   4
UInt32mChannelsPerFrame2
UInt32mBitsPerChannel    32
UInt32mReserved          0
</code></pre>

<p>我通过调试应用程序并执行 <code>AudioUnitGetProperty(rioUnit, kAudioUnitProperty_StreamFormat, ...)</code> 调用得到了这个。 <code>mFormatFlags</code> 字段意味着以下标志(我不知道任何正式的解码方法,我只是通过尝试 <code>kAudioUnitFlags</code> 的不同组合得到它,直到我得到 <code> 41</code>):</p>

<pre><code>kAudioFormatFlagIsNonInterleaved | kAudioFormatFlagIsPacked | kAudioFormatFlagIsFloat
</code></pre>

<p>我应该使用哪种类型的数据来转换缓冲区?我已经尝试过使用 <code>Float32</code>、<code>SInt32</code>,但它们不是。</p>

<p>我打算之后转换为 <code>SInt16</code>,但如果我没有先得到正确的样本格式,我就无法做到。</p>

<p>提前致谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>根据我的经验,iOS 不会直接向您提供 float 据。相反,您应该要求输入 <code>SInt16</code>(因此,也将 <code>mBitsPerChannel</code> 设置为 16),然后通过将每个数字除以 32767 手动将整数数据转换为 float 。</p ></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 为特定的 ASBD 缓冲区获取正确的数字数据类型转换,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12274427/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12274427/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 为特定的 ASBD 缓冲区获取正确的数字数据类型转换