代码之家  ›  专栏  ›  技术社区  ›  bastibe

使用扩展音频文件服务读取音频(extaudiofileread)

  •  4
  • bastibe  · 技术社区  · 14 年前

    我正在努力理解核心音频,或者更确切地说: Extended Audio File Services

    这里,我想用 ExtAudioFileRead() 从文件中读取一些音频数据。
    只要我使用一个巨大的缓冲区来存储我的音频数据(也就是说,一个 AudioBuffer )一旦我使用多个 音频缓冲器 , extaudiofileread()。 返回错误代码 -50 (“参数列表错误”)。据我所知,这意味着 extaudiofileread()。 是错的。大概是 audioBufferList .

    我不能使用一个巨大的缓冲区,因为那时, dataByteSize 会溢出它的 UInt32 -包含大量文件的整数范围。

    这是创建 音频缓冲表 :

    AudioBufferList *audioBufferList;
    audioBufferList = malloc(sizeof(AudioBufferList) + (numBuffers-1)*sizeof(AudioBuffer));
    audioBufferList->mNumberBuffers = numBuffers;
    for (int bufferIdx = 0; bufferIdx<numBuffers; bufferIdx++ ) {
        audioBufferList->mBuffers[bufferIdx].mNumberChannels = numChannels;
        audioBufferList->mBuffers[bufferIdx].mDataByteSize = dataByteSize;
        audioBufferList->mBuffers[bufferIdx].mData = malloc(dataByteSize);
    }
    

    这里是工作的,但溢出的代码:

    UInt32 dataByteSize = fileLengthInFrames * bytesPerFrame; // this will overflow
    AudioBufferList *audioBufferList = malloc(sizeof(audioBufferList));
    audioBufferList->mNumberBuffers = 1;
    audioBufferList->mBuffers[0].mNumberChannels = numChannels;
    audioBufferList->mBuffers[0].mDataByteSize = dataByteSize;
    audioBufferList->mBuffers[0].mData = malloc(dataByteSize);
    

    最后,是 extaudiofileread()。 (应适用于两种版本):

    UInt32 numFrames = fileLengthInFrames;
    error = ExtAudioFileRead(extAudioFileRef,
                             &numFrames,
                             audioBufferList);
    

    你知道我在这里做错了什么吗?

    4 回复  |  直到 7 年前
        1
  •  5
  •   lucius    14 年前

    我认为你误解了mNumberBuffers字段的用途。这是典型的 1 用于单声道和交错立体声数据。将其设置为其他值的唯一原因是多轨数据,其中每个通道都在单独的数据缓冲区中。

    如果您想读取文件的一部分,您可以将缓冲区的databytesize设置为一个合理的大小,当您读取文件时,告诉API只给您这么多的字节,并循环它。

        2
  •  1
  •   atnmachine    14 年前

    我对mNumerBuffers也有同样的问题。 我的工作涉及到创建自己的内部缓冲区:

    类似:

    char buffer1[字节大小]; char buffer2[字节大小]; ……

    您还可以使用指针使事情更简单,例如:

    缓冲区[索引][字节大小];

    然后您必须手动迭代它们,并在主线程上填充它们,以避免音频中出现问题。

    extaudiofileread将只填充audiobufferlist中的缓冲区[0],然后您可以让它指向音频播放时手动分配的不同缓冲区。

    希望这有帮助。

        3
  •  0
  •   Christopher Schardt    7 年前

    当您处理非交错立体声时,mNumberBuffers==2。它是未交错时的音频通道数。

        4
  •  -3
  •   bastibe    14 年前

    可可似乎根本不接受mNumerBuffers>1。这是一个耻辱,因为它使整个结构无用。(我希望这是对的…)