Ошибка анализа файла M4A, AAC с помощью служб Apple Audio File Stream Services, iOS 7

Я использую этот учебник Аудиопоток для многопользовательского подключения к Несколько одноранговых узлов и этот проект Github Repository для потоковой передачи звука из NSInputStream, который получается от:

-(void)session:didReceiveStream:withName:fromPeer:

Метод делегата MCSession.

После этого откроется новый поток аудиофайлов (TDAudioFileStreamer / Classes / AudioFileStream.m: 39):

OSStatus err = AudioFileStreamOpen((__bridge void *)self, TDAudioFileStreamPropertyListener, TDAudioFileStreamPacketsListener, 0, &_audioFileStreamID); 

Затем прочтите байты из NSInputStream и попробуйте выполнить синтаксический анализ таким образом (TDAudioFileStreamer / Classes / AudioFileStream.m: 98):

err = AudioFileStreamParseBytes(self.audioFileStreamID, length, data, kAudioFileStreamParseFlag_Discontinuity);

Or:

err = AudioFileStreamParseBytes(self.audioFileStreamID, length, data, 0);

В зависимости от потока данных.

И, наконец, заполняется буфер AudioQueue проанализированными данными для воспроизведения (я думаю - TDAudioFileStreamer / Classes / TDAudioQueueFiller.m).

Это действительно хорошо работает для файлов формата MP3, но с другими форматами при попытке синтаксического анализа байтов возникает ошибка «неподдерживаемый формат файла».

В документации Apple говорится, что службы Audio File Stream поддерживают множество форматов, и они перечислены по этой ссылке: Apple Stream Services поддерживает форматы, но для меня работает только с MP3.

Я тоже пытался, когда открываю поток аудиофайлов, передаю подсказку о таком формате файла и отправляю файл M4A или AAC:

OSStatus err = AudioFileStreamOpen((__bridge void *)self, TDAudioFileStreamPropertyListener, TDAudioFileStreamPacketsListener, kAudioFileAAC_ADTSType, &_audioFileStreamID);

Где kAudioFileAAC_ADTSType - это тип отправленного файла, который будет транслироваться, таким образом, «ошибка неподдерживаемого формата файла» исчезнет, ​​но приложение выйдет из строя и получит новую ошибку  введите описание изображения здесь

Это говорит: io: lpc и client: aac.

  • Кто-нибудь знает, что это значит?
  • Очередь ожидает файл формата AAC?
  • Почему LPCM (линейная импульсно-кодовая модуляция), я отправляю M4A или AAC, а не LPCM?

Заранее спасибо.


person Gonzalo Bahamondez    schedule 06.05.2014    source источник
comment
Привет, я столкнулся с той же проблемой. Вы нашли какое-нибудь решение этой проблемы.   -  person Adi Pop    schedule 07.10.2014
comment
Пока нет, только мне очень больно. Sry.   -  person Gonzalo Bahamondez    schedule 07.10.2014
comment
Вы, наверное, уже пробовали это, но знаете, что существуют защищенные типы звука. Я хотел сказать, что попробуйте разные типы файлов .m4a. Некоторые из них защищены и не могут быть воспроизведены. Большинство из них находятся в самом магазине iTunes и не могут быть воспроизведены.   -  person user3892683    schedule 30.04.2015


Ответы (2)


Для потоковой передачи / анализа M4A с AudioFileStream файл m4a необходимо оптимизировать для потоковой передачи.

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

Некоторые кодировщики оптимизируют m4a за вас, но некоторые - нет. Например, если вы создаете файл m4a с помощью проигрывателя itunes, просто щелкнув правой кнопкой мыши и выбрав «Создать версию AAC», будет создан файл m4a, оптимизированный для потоковой передачи.

Вы можете проверить это, используя http://ridiculousfish.com/hexfiend/.

введите описание изображения здесь

но если вы используете, скажем, encoding.com для кодирования ваших файлов m4a, вы получите другой тип кодирования.

они оба будут работать при воспроизведении всего файла с диска, но оптимизированная версия будет правильно проанализирована / передана в потоковом режиме.

Теперь ошибка, которую вы получаете, говорит вам, что синтаксический анализатор не может получить правильный AudioStreamBasicDescription из файла, который вы анализируете, файл, вероятно, отказывается предоставить информацию о битрейте ...

Попробуйте взглянуть на этот код, чтобы лучше понять обработку типов m4a. http://www.cocoawithlove.com/2010/03/streaming-mp3aac-audio-again.html

person u.gen    schedule 14.05.2015

Хитрость здесь в том, что вам нужно получить и установить необходимые свойства для формата m4a в нужном месте, а именно в обратном вызове (в вашем случае) TDAudioFileStreamPropertyListener. Проверьте аргумент AudioFileStreamPropertyID, когда он подходит для свойства kAudioFileStreamProperty_ReadyToProducePackets, а затем вставьте это:

 UInt32 cookieSize = 0;
            OSStatus error = AudioFileStreamGetPropertyInfo(audioFileStream, kAudioFilePropertyMagicCookieData, &cookieSize, NULL);
            // If there is an error here, then track from stream doesn't have a cookie
            if (error == noErr && cookieSize != 0) {
                char *cookie = malloc(cookieSize * sizeof(char));
                error = AudioFileStreamGetProperty(audioFileStream, kAudioFilePropertyMagicCookieData, &cookieSize, cookie);
                if (error == noErr) {
                    error = AudioConverterSetProperty(audioConverterRef, kAudioConverterDecompressionMagicCookie, cookieSize, cookie);
                    if (error != noErr) {
                        printf("Could not Set kAudioConverterDecompressionMagicCookie on the Audio Converter!");
                    }
                } else {
                    printf("Could not Get kAudioFilePropertyMagicCookieData from stream!");
                }
                free(cookie);
            }
person Harman    schedule 23.11.2018