[Android High Performance Audio] Управление буфером AAudio (XRun | UnderRun | OverRun | Получить размер буфера | Установить размер буфера)
[Android High Performance Audio] Управление буфером AAudio (XRun | UnderRun | OverRun | Получить размер буфера | Установить размер буфера)

Каталог статей

Уведомление : Эта статья о AAudio Аудиопотокконтроль плеера буфера , Под количеством кадров можно понимать количество аудиосэмплов. ; Фактическое количество инструментов выборки , и количество выборок на кадр , размер каждого кадра Управляется самим пользователем , К AAudio аудиопоток Читай и пиши Сколько байт сэмплов , Управляется самим пользователем ; 2 буфер : буфер игрока и Образец буфера ;

  • ① буфер игрока : Эта статья объясняет буфер игрока настраиватьи Корректирование ;
  • ② Образец буфера : Образец буфера относится к , Сколько байт данных собирается за один раз? , Написать игроку ;
  • ③ понимать : Эти два буфера имеют разную концепцию ,Уведомлениеразличать ;

Выборок на кадр : Это значение представляет собой количество каналов , Если это моно , Только один образец на кадр , в случае двухканальное стерео , Каждый кадр имеет 2 образцы ;

I . AAudio аудиопоток контроль буфера

1. Определить текущую ситуацию : Сначала определите ток AAudio аудиопоток Это необходимо Корректирование , Основанием для вынесения решения является наличие XRun , Прямо сейчас Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) статус ;

2. Рассчитайте значение настройки буфера: получите значение XRun для этого времени, а затем сравните его с прошлым разом. Если значение XRun для этого времени выше, чем в прошлый раз, увеличьте количество кадров в этом буфере;

3. Пример кода:

Язык кода:javascript
копировать
    //получать Недогрузка или Превышение лимита считать , вот игра , Недогрузка
    // Долженценить используется только для определения того, является ли текущая Недогрузка
    int32_t underrunCount = AAudioStream_getXRunCount(playStream_);

// получать AAudio аудиопотоксуществовать Нетблокироватьситуация Вниз, умею читать или Максимальное количество записанных кадров ( Документация чувствует себя нехорошо )
    // получать ценить текущий буфер
    aaudio_result_t bufferSize = AAudioStream_getBufferSizeInFrames(playStream_);

    // Увеличивается ли количество Недогрузкиценить?
    bool hasUnderrunCountIncreased = false;

    // Должен Изменить размер буфера
    bool shouldChangeBufferSize = false;

    // иметь дело с Закончил играть данные не успели записать ситуацию
    // playStreamUnderrunCount_ Это когда открываешь аудиопоток Недогрузкаценить , Обычно 0
    // Если текущая Недогрузкаценить больше, чем в последний раз Недогрузкаценить
    // На этот раз Недогрузкаценить возобновлять
    // На этот раз Недогрузкаценить будет использоваться в качестве основы для изменения размера буфера Корректирования.
    if (underrunCount > playStreamUnderrunCount_) {

        // Записывать На этот раз Недогрузкаценить
        playStreamUnderrunCount_ = underrunCount;

        // настраивать需要возобновлять缓冲区大小
        hasUnderrunCountIncreased = true;
    }


    if (hasUnderrunCountIncreased && bufferSizeSelection_ == BUFFER_SIZE_AUTOMATIC) {

        // У пользователя нет возможности Установить размер буфера , в это время bufferSizeSelection_ изценить для BUFFER_SIZE_AUTOMATIC , Прямо сейчас 0

        /**
         * Это алгоритм корректирования размера буфера. ;
         * Если на этот раз Недогрузка ( UnderRun ) ценить и Сравните Недозагрузкуценить с момента вашего последнего возвращения. , В этот раз выше, чем в прошлый раз ценить ,
         *  в это нужно увеличить размер буфера , Увеличить количествоценитьдля Размер одной записи ( Burst Size ) ;
         *  повысился Burst Size предотвратит будущие происшествия Недогрузка ситуация , В то же время операция «Должен» будет осуществляться за счет увеличения задержки ;
         *
         * Недогрузка ( UnderRun ) Прямо сейчас существующийданные Закончил играть , Новые данные еще не записаны , Возникает разрыв , вызывая ток ;
         *      Невозможно предоставить достаточно данных для выборки аудио. ;
         */
        bufferSize += framesPerBurst_; // Размер буфера увеличен Размер рамки на запись Increase buffer size by one burst
        shouldChangeBufferSize = true;

    } else if (bufferSizeSelection_ > 0 && (bufferSizeSelection_ * framesPerBurst_) != bufferSize) {

        // Пользователь имеет Установить размер буфера , и этот размери之前из大小Нет一致ситуация , Измените только размер буфера
        // Каждый раз, когда пользователь изменяет размер буфера , Логика кода ветки Должен будет выполнена один раз

        // Если пользователь изменяет размер буфера , Затем выполните логику Должена
        bufferSize = bufferSizeSelection_ * framesPerBurst_;
        shouldChangeBufferSize = true;
    }

    // Был ли изменен размер буфера
    if (shouldChangeBufferSize) {
        LOGD("Setting buffer size to %d", bufferSize);

        //Установим количество кадров в текущем буфере
        bufferSize = AAudioStream_setBufferSizeInFrames(stream, bufferSize);
        if (bufferSize > 0) {
            //возобновить Количество размеров покадрового буфера, поддерживаемых в текущем классеценить
            bufSizeInFrames_ = bufferSize;
        } else {
            LOGE("Error setting buffer size: %s", AAudio_convertResultToText(bufferSize));
        }
    }
II . AAudio аудиопоток XRun ( UnderRun | OverRun )

1. XRun концепция : XRun относится к AAudio аудиопоток Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) ;

  • ① Недогрузка ( UnderRun ) : При воспроизведении аудиопоток , Если текущие существующие данные были воспроизведены , Новые данные еще не успели записаться , в это время произойдет Недогрузка ситуации ;
  • ② Превышение лимита ( OverRun ) : При записи аудиопоток , Если не прочитать вовремя аудиопотокданные , и данные не сохраняются должным образом , Произошло переполнение , что приводит к потере данных , Эта ситуация называется Превышение лимита ;

2. Получите данные XRun: используйте метод AAudioStream_getXRunCount(), чтобы получить значение XRun;

3. Прототип функции AAudioStream_getXRunCount:

Язык кода:javascript
копировать
AAUDIO_API int32_t AAudioStream_getXRunCount(
  AAudioStream *stream
)

4. AAudioStream_getXRunCount параметры метода : входящий AAudio аудиопоток тип указателя , доступный Долженаудиопоток Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) ценить ;

5. Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) проблемы, вызванные : Может вызвать текущие проблемы ;

6. Не поддерживается XRun статистика ситуация : Некоторые устройства могут быть поддерживаетсястатистика Долженданные , вернулся в это время XRun ценитьдля 0 ;

III . AAudio аудиопоток Текущее количество кадров, читаемых и записываемых каждый раз

1. AAudio аудиопоток Количество кадров на чтение и запись :

  • ① текущий Читай и пиши Рамкизапрос : существовать AAudio аудиопоток Читай и пиши Аудиоданные , Для лучшей производительности , Нужно один раз проверить текущий аудиопоток Читай и пишииз Рамки ;
  • ② Метод запроса : Для достижения наилучшей производительности потокового чтения и записи ,Можетиспользовать AAudioStream_getFramesPerBurst метод,Запрос Долженчислоценить ;
  • ③ Рамки Корректирование : В приложении вы можете AAudio аудиопоток Читай и пиши Данные выборки аудио из разных Рамок , но чтобы избежать Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) , Можем добавить Долженценить ,предотвращать данные Нет足 или данныепереполнение ситуация ;
  • ④ Рамки Последствия перемен : Актуальная аудиотехника одноразовая Читай и пишиданные Возможное количествои Должен Рамки Нет匹配 ; Для некоторых аудиоустройств , Должен Brust ( Одноразовые Читай и пишиданныеколичество ) Размер может быть динамическим. Изменить. ; Должен-операции могут увеличить задержку Аудио ;
  • ⑤ Выборок на кадр : Это значение представляет собой количество каналов , Если это моно , Только один образец на кадр , в случае двухканальное стерео , Каждый кадр имеет 2 образцы ;

2. Функция для получения количества кадров, прочитанных и записанных каждый раз:

  • ① прототип функции :
Язык кода:javascript
копировать
AAUDIO_API int32_t AAudioStream_getFramesPerBurst(
  AAudioStream *stream
)
  • ② метод Введение : Долженметод входящий AAudioStream тип параметры указателя ( представлять AAudio аудиопоток ) , доступный Должен AAudio аудиопоток Количество кадров на чтение и запись ;
  • ③ пример кода :
Язык кода:javascript
копировать
            // получать Рамки, написанные каждый раз
            framesPerBurst_ = AAudioStream_getFramesPerBurst(playStream_);
IV . AAudio аудиопоток Получите максимальное количество кадров

AAudio аудиопоток Получите максимальное количество кадров : вызов AAudioStream_getBufferSizeInFrames() метод ,доступный AAudio аудиопотоксуществовать Нетблокироватьситуация Вниз, умею читать или Максимальное количество записанных кадров ;

  • ① методпрототип :
Язык кода:javascript
копировать
AAUDIO_API int32_t AAudioStream_getBufferSizeInFrames(
  AAudioStream *stream
)
  • ② пример кода :
Язык кода:javascript
копировать
// получать AAudio аудиопотоксуществовать Нетблокироватьситуация Вниз , умею читать или Максимальное количество записанных кадров 
    aaudio_result_t bufferSize = AAudioStream_getBufferSizeInFrames(playStream_);
V . AAudio аудиопоток Установить размер буфера

1. функциональный эффект : при воспроизведении аудиопотока , Может быть препятствие , Прямо сейчас Воспроизведение сэмпла завершено , Новые образцы еще не поступили , Эта функция может проходить Изменять порог размера буфераценить , Корректирование задержка буфера , Прямо сейчас если появится блокировать , Размер этого буфера можно увеличить ( Рамки ) ;

2. объединить XRun ценитьиспользовать : проходить AAudioStream_getXRunCount() метод ,доступный Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) изценить, Согласно XRun ценить размер буфера переноса Корректирование , Достичь цели установки соответствующей задержки для каждого аудиоустройства. ;

3. Устанавливаемая максимальная цена : проходить AAudioStream_getBufferCapacityInFrames() функциядоступный Максимальное количество Рамок, которое можно установить в буфер , При установке Рамки , Невозможно превысить количество Долженценить ;

4. Просмотр текущего размера буфера : вызов AAudioStream_getBufferSizeInFrames() метод , Вы можете просмотреть текущий буфер Рамки ;

В документации говорится,что : получать AAudio аудиопотоксуществовать Нетблокироватьситуация Вниз, умею читать или Максимальное количество записанных кадров , Не могу понять ;

5. Введение в функцию AAudioStream_setBufferSizeInFrames:

  • ① прототип функции : numFrames это новый набор буферов Рамки , stream представлять AAudio указатель аудиопоток ;
Язык кода:javascript
копировать
AAUDIO_API aaudio_result_t AAudioStream_setBufferSizeInFrames(
  AAudioStream *stream,
  int32_t numFrames
)
  • ② пример кода :
Язык кода:javascript
копировать
        //Установим количество кадров в текущем буфере
        bufferSize = AAudioStream_setBufferSizeInFrames(stream, bufferSize);

Выборок на кадр : Это значение представляет собой количество каналов , Если это моно , Только один образец на кадр , в случае двухканальное стерео , Каждый кадр имеет 2 образцы ;

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose