1

我正在研究 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 参数提供的值。

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

还是我在叫错树?

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

4

1 回答 1

2

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

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

于 2012-02-09T23:20:59.980 回答