【问题标题】:What is the appropriate value for the ExtAudioFileWrite inNumberFrames parameter?ExtAudioFileWrite inNumberFrames 参数的适当值是多少?
【发布时间】:2012-02-06 05:52:22
【问题描述】:

我正在开发 FLAC-to-ALAC 转码器并尝试使用 ExtAudioFile 写入 ALAC。我正在使用 FLAC 库的基于回调的系统来读取 FLAC 文件,这意味着 FLAC 文件中的每一帧都会导致一个函数调用。在该调用中,我设置了缓冲区并调用 ExtAudioFileWrite 代码,如下所示:

AudioBufferList * fillBufList;
fillBufList = malloc(sizeof *fillBufList + (frame->header.channels - 1) * sizeof fillBufList->mBuffers[0]);
fillBufList->mNumberBuffers = frame->header.channels;

for (int i = 0; i < fillBufList->mNumberBuffers; i++) {
    fillBufList->mBuffers[i].mNumberChannels = 1; // non-interleaved
    fillBufList->mBuffers[i].mDataByteSize = frame->header.blocksize * frame->header.bits_per_sample / 8;
    fillBufList->mBuffers[i].mData = (void *)(buffer[i]);
    NSLog(@"%i", fillBufList->mBuffers[i].mDataByteSize);
}

OSStatus err = ExtAudioFileWrite (outFile, 1, fillBufList);

现在,最后一行中的数字 1 是我选择的一个神奇数字,因为我认为 FLAC 文件中的一帧可能对应于相应 ALAC 文件中的一帧,但这似乎不是就是这样。每次调用 ExtAudioFileWrite 都会返回一个错误值 -50(用户参数列表中的错误)。明显的罪魁祸首是我为 frame 参数提供的值。

那么我问,我应该提供什么价值?

还是我找错树了?

(旁注:我怀疑,尽管存在与参数相关的错误值,但真正的问题可能是缓冲区设置,因此我尝试分配一个归零的虚拟缓冲区以查看会发生什么。同样的错误。)

【问题讨论】:

  • 在进一步的反思和研究中,似乎“框架”一词在 FLAC 文档和 CoreAudio 中的含义可能截然不同。我尝试提供每个通道的样本数(frame->header.blocksize),但我仍然收到该参数错误。

标签: macos core-audio lossless-compression flac


【解决方案1】:

对于 ExtAudioFileWrite,帧数等于您要写入的样本数。如果您使用的是 32 位浮点交错数据,则为 mDataByteSize / (sizeof(Float32) / mNumberChannels)。除非您打算只编写一个样本,否则它不应该是 1,并且如果您正在编写压缩格式,我认为它需要一定数量的样本。 -50 错误也可能是另一个问题。

要检查的一点是 ExtAudioFile 只需要一个缓冲区。所以你的 fillBufList->mNumberBuffers 应该总是等于 1,如果你需要做立体声,你需要交错音频数据,让 mBuffers[0].mNumberChannels 等于 2 来做立体声。

【讨论】:

  • 我相信您提出的最后一个问题正是问题所在;我只需要在fillBufList 中使用一个缓冲区。但这带来了一个子问题:当 mNumberBuffers 总是 应该等于 1 时,他们为什么要使用“fillBufList”结构?为什么不让 ExtAudioFileWrite 函数简单地接受原始缓冲区?
  • 我不知道为什么Apple会这样做,但我的经验是拥有非交错立体声音频数据(即mNumberBuffers为2,并且有两个mBuffers带有音频数据)有从来没有工作过。只有交错的音频数据有效。他们可能希望能够在 API 中的其他地方使用 AudioBufferList 结构来获得多个缓冲区,但对于 ExtAudioFile API,它不是这样使用的。
猜你喜欢
  • 2018-11-27
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 2011-05-26
  • 2011-02-10
  • 2020-02-07
相关资源
最近更新 更多