Какое значение подходит для параметра ExtAudioFileWrite inNumberFrames? - PullRequest
1 голос
/ 06 февраля 2012

Я работаю над транскодером FLAC-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.

Итак, я спрашиваю, какое значение я должен предоставить?

Или я лаю не на том дереве?

(Примечание: я подозревал, что, несмотря на значение ошибки, связанное с параметром, истинной проблемой может быть настройка буфера, поэтому я попытался использовать нулевой буфер-пустышку, чтобы посмотреть, что произойдет. Та же ошибка.) * +1010 *

1 Ответ

2 голосов
/ 10 февраля 2012

Для ExtAudioFileWrite число кадров равно количеству сэмплов, которые вы хотите записать.Если вы работаете с 32-битными данными с чередованием с плавающей точкой, это будет mDataByteSize / (sizeof (Float32) / mNumberChannels).Это не должно быть 1, если вы не собираетесь писать только один образец, и если вы пишете сжатый формат, я думаю, что определенное количество образцов, я думаю.Также возможно, что ошибка -50 является другой проблемой.

Одна вещь, которую нужно проверить, - это то, что ExtAudioFile ожидает только один буфер.Поэтому ваш fillBufList-> mNumberBuffers всегда должен быть равен 1, а если вам нужно сделать стерео, вам нужно чередовать аудиоданные, чтобы mBuffers [0] .mNumberChannels было равно 2 для стерео.

...