我正在研究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(用户参数列表中的错误)。显而易见的罪魁祸首是我为帧参数提供的值。
那么我问,那么我应该提供什么价值?
还是我在错误的树上吠叫?
(旁注:我怀疑,尽管存在与param相关的错误值,但真正的问题可能是缓冲区设置,所以我尝试使用一个归零的虚拟缓冲区来查看会发生什么。同样的错误。)< / p>
答案 0 :(得分:2)
对于ExtAudioFileWrite,帧数等于要写入的样本数。如果您正在使用32位浮点交错数据,那么它将是mDataByteSize /(sizeof(Float32)/ mNumberChannels)。它不应该是1,除非你打算只写一个样本,如果你正在写一个压缩格式,我想它会有一定数量的样本。也可能是-50错误是另一个问题。
要检查的一件事是ExtAudioFile只需要一个缓冲区。所以你的fillBufList-&gt; mNumberBuffers应该总是等于1,如果你需要做立体声,你需要交错音频数据,这样mBuffers [0] .mNumberChannels等于2立体声。