Воспроизведение AUGraph преобразованного аудиопотока aac->pcm звучит прерывисто на iPhone7plus, но не на iPhone6
Я построил AUGraph с AUMixer, и воспроизведение звука звучит ужасно при воспроизведении потока через обратный вызов на iPhone7plus. Вы можете услышать звук и то, что говорится, но это очень колючий. Если я собираю и запускаю на своем iPhone6, это звучит нормально.
У меня также есть настройка, реализованная с помощью единственного AudioUnit без микшера, и это прекрасно звучит как на iPhone7, так и на iPhone6, но я, конечно, теряю необходимую функциональность микшера. Я использую одну и ту же AudioStreamBasicDescription для обеих установок (график с микшером и единичный аудиоэлемент)
Идеи о том, почему это так плохо звучит именно с графиком на моем iPhone7 plus?
My current ASBD:
_pcmASBD AudioStreamBasicDescription
mSampleRate Float64 44100
mFormatID AudioFormatID 1819304813
mFormatFlags AudioFormatFlags 12
mBytesPerPacket UInt32 4
mFramesPerPacket UInt32 1
mBytesPerFrame UInt32 4
mChannelsPerFrame UInt32 2
mBitsPerChannel UInt32 16
mReserved UInt32 0
Я делаю преобразование AAC в PCM, а затем подаю эти данные в AURenderCallback и, наконец, в pendingBufferList, который воспроизводится архитектурой AudioUnit.
Мне нужно использовать микшер, так как я хочу контролировать громкость, и поэтому такой особенный подход AudioUnit (который не отображает эту ошибку, но использует тот же обратный вызов и все остальное) не будет работать для меня, так как я предпочитаю не модулировать звук, воздействуя на необработанный поток данных.
РЕДАКТИРОВАТЬ:
Собираюсь добавить еще немного кода и мыслей, чтобы, надеюсь, решить проблему.
Я обрабатываю входящий поток AAC с помощью AudioConverter, это преобразует в LPCM, который я затем передаю в мой AudioBufferList, который заполняется во время процесса рендеринга графа audiounit.
Я заметил, что если я иду 48 кГц (кодировать, затем поток) -> 48 кГц (принимать поток, декодировать, воспроизводить), это звучит хорошо, и мой процесс рендеринга аудио показывает inNumberFrames 1024.
Если я выберу 44.1 кГц -> 48 кГц, это будет звучать нечетко (мой график аудиоустройства делает звук нужным, хотя из-за преобразователя частоты дискретизации, который я в него вставил), но процесс рендеринга аудио показывает в NumberFrames как 941 или 940
Я чувствую, что это может быть то, о чем говорил hotpaw2, но когда я установил размер моего AudioBufferList, кратный 4*inNumberFrames, он все еще звучит нечетко.
@ Hotpaw2?
1 ответ
Проверьте аппаратную частоту дискретизации. На многих новых устройствах iOS частота дискретизации аудио по умолчанию может быть 48000, а не 44100, в зависимости от того, что подключено или ранее воспроизводилось аудио. Если это так, и ваш желаемый формат для 44100, ресемплер предоставит буферы различной и нечетной длины. Обратный вызов аудиоустройства, ожидающий буфера фиксированной или четной длины, может, таким образом, дать сбой.
Способ исправить это может быть проверка аппаратной частоты дискретизации. Если это 48000, тогда установите ваш формат на тот же, чтобы не нужно было выполнять повторную выборку. Также убедитесь, что все ваши блоки обратного вызова аудио контекста могут обрабатывать переменные и нечетные длины /frameCounts буферов AudioBufferList.