ExtAudioFileWrite для m4a / aac, не работающих на двухъядерных устройствах (ipad 2, iphone 4s)

Я написал цикл для кодирования аудиоданных pcm, созданных моим приложением, в aac, используя Extended Audio File Services. Кодирование происходит в фоновом потоке синхронно, а не в режиме реального времени.

Кодировка работает безупречно на ipad 1 и iphone 3gs / 4 для iOS 4 и 5. Однако для двухъядерных устройств (iphone 4s, ipad 2) третий вызов ExtAudioFileWrite выдает поток кодирования без трассировки стека и без кода ошибки ,

Вот код, о котором идет речь:

Форматы данных

AudioStreamBasicDescription AUCanonicalASBD(Float64 sampleRate, UInt32 channel){ AudioStreamBasicDescription audioFormat; audioFormat.mSampleRate = sampleRate; audioFormat.mFormatID = kAudioFormatLinearPCM; audioFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical; audioFormat.mChannelsPerFrame = channel; audioFormat.mBytesPerPacket = sizeof(AudioUnitSampleType); audioFormat.mBytesPerFrame = sizeof(AudioUnitSampleType); audioFormat.mFramesPerPacket = 1; audioFormat.mBitsPerChannel = 8 * sizeof(AudioUnitSampleType); audioFormat.mReserved = 0; return audioFormat; } AudioStreamBasicDescription MixdownAAC(void){ AudioStreamBasicDescription audioFormat; audioFormat.mSampleRate = 44100.0; audioFormat.mFormatID = kAudioFormatMPEG4AAC; audioFormat.mFormatFlags = kMPEG4Object_AAC_Main; audioFormat.mChannelsPerFrame = 2; audioFormat.mBytesPerPacket = 0; audioFormat.mBytesPerFrame = 0; audioFormat.mFramesPerPacket = 1024; audioFormat.mBitsPerChannel = 0; audioFormat.mReserved = 0; return audioFormat; } 

Цикл рендеринга

 OSStatus err; ExtAudioFileRef outFile; NSURL *mixdownURL = [NSURL fileURLWithPath:filePath isDirectory:NO]; // internal data format AudioStreamBasicDescription localFormat = AUCanonicalASBD(44100.0, 2); // output file format AudioStreamBasicDescription mixdownFormat = MixdownAAC(); err = ExtAudioFileCreateWithURL((CFURLRef)mixdownURL, kAudioFileM4AType, &mixdownFormat, NULL, kAudioFileFlags_EraseFile, &outFile); err = ExtAudioFileSetProperty(outFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &localFormat); // prep AllRenderData *allData = &allRenderData; writeBuffer = malloc(sizeof(AudioBufferList) + (2*sizeof(AudioBuffer))); writeBuffer->mNumberBuffers = 2; writeBuffer->mBuffers[0].mNumberChannels = 1; writeBuffer->mBuffers[0].mDataByteSize = bufferBytes; writeBuffer->mBuffers[0].mData = malloc(bufferBytes); writeBuffer->mBuffers[1].mNumberChannels = 1; writeBuffer->mBuffers[1].mDataByteSize = bufferBytes; writeBuffer->mBuffers[1].mData = malloc(bufferBytes); memset(writeBuffer->mBuffers[0].mData, 0, bufferBytes); memset(writeBuffer->mBuffers[1].mData, 0, bufferBytes); UInt32 framesToGet; UInt32 frameCount = allData->gLoopStartFrame; UInt32 startFrame = allData->gLoopStartFrame; UInt32 lastFrame = allData->gLoopEndFrame; // write one silent buffer ExtAudioFileWrite(outFile, bufferFrames, writeBuffer); while (frameCount < lastFrame){ // how many frames do we need to get if (lastFrame - frameCount > bufferFrames) framesToGet = bufferFrames; else framesToGet = lastFrame - frameCount; // get dem frames err = theBigOlCallback((void*)&allRenderData, NULL, NULL, 1, framesToGet, writeBuffer); // write to output file ExtAudioFileWrite(outFile, framesToGet, writeBuffer); frameCount += framesToGet; } // write one trailing silent buffer memset(writeBuffer->mBuffers[0].mData, 0, bufferBytes); memset(writeBuffer->mBuffers[1].mData, 0, bufferBytes); processLimiterInPlace8p24(limiter, writeBuffer->mBuffers[0].mData, writeBuffer->mBuffers[1].mData, bufferFrames); ExtAudioFileWrite(outFile, bufferFrames, writeBuffer); err = ExtAudioFileDispose(outFile); 

Рамки pcm создаются правильно, но ExtAudioFileWrite не выполняет второй или третий раз, когда он вызывается.

Есть идеи? Спасибо!

У меня была очень похожая проблема, когда я пытался использовать расширенные аудиофайлы для потоковой передачи звука PCM в файл m4a на iPad 2. Все работало, за исключением того, что каждый вызов ExtAudioFileWrite возвращал код ошибки -66567 (kExtAudioFileError_MaxPacketSizeUnknown) , Исправление, которое я в конечном итоге нашел, заключалось в том, чтобы установить «Codec Manufacturer» вместо программного обеспечения. Итак, место

 UInt32 codecManf = kAppleSoftwareAudioCodecManufacturer; ExtAudioFileSetProperty(FileToWrite, kExtAudioFileProperty_CodecManufacturer, sizeof(UInt32), &codecManf); 

перед установкой формата данных клиента.

Это заставило бы меня поверить, что аппаратные кодеки Apple могут поддерживать только очень специфическую кодировку, но программные кодеки могут более надежно делать то, что вы хотите. В моем случае перевод программного кодека в m4a занимает на 50% больше времени, чем запись того же самого файла в формат LPCM.

Кто-нибудь знает, указывает ли Apple где-то то, на что способен их оборудование для аудиокодеков? Похоже, что разработчики программного обеспечения застряли в игре с часовым угадыванием, устанавливая параметры 20 в AudioStreamBasicDescription и AudioChannelLayout для клиента и для файла для каждой возможной перестановки до тех пор, пока что-то не будет работать …

  • Как узнать, високосный год текущего года или нет в iphone
  • Как использовать AVAssetWriter вместо AVAssetExportSession для повторного кодирования существующего видео
  • Как читать информацию с основного устройства bluetooth
  • Установите фиксированную ширину и высоту для «CropRect» в Swift
  • Возможна ли программная инверсия цветов изображения?
  • Как заставить UILabel реагировать на нажатие?
  • Задержка клика 300 мс не отключена в полноэкранном режиме (сафари iOS)
  • почему я не могу объявить переменную типа «newVariable» в Obj-C?
  • как удалить строки только в одном разделе
  • UICollectionView не может свернуть или удалить дополнительный вид
  • Невозможно выровнять по правому краю с помощью противопоказаний
  • Давайте будем гением компьютера.