Уведомление : Эта статья о AAudio Аудиопотокконтроль плеера буфера , Под количеством кадров можно понимать количество аудиосэмплов. ; Фактическое количество инструментов выборки , и количество выборок на кадр , размер каждого кадра Управляется самим пользователем , К AAudio аудиопоток Читай и пиши Сколько байт сэмплов , Управляется самим пользователем ; 2 буфер : буфер игрока и Образец буфера ;
Выборок на кадр : Это значение представляет собой количество каналов , Если это моно , Только один образец на кадр , в случае двухканальное стерео , Каждый кадр имеет 2 образцы ;
1. Определить текущую ситуацию : Сначала определите ток AAudio аудиопоток Это необходимо Корректирование , Основанием для вынесения решения является наличие XRun , Прямо сейчас Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) статус ;
2. Рассчитайте значение настройки буфера: получите значение XRun для этого времени, а затем сравните его с прошлым разом. Если значение XRun для этого времени выше, чем в прошлый раз, увеличьте количество кадров в этом буфере;
3. Пример кода:
//получать Недогрузка или Превышение лимита считать , вот игра , Недогрузка
// Долженценить используется только для определения того, является ли текущая Недогрузка
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));
}
}
1. XRun концепция : XRun относится к AAudio аудиопоток Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) ;
2. Получите данные XRun: используйте метод AAudioStream_getXRunCount(), чтобы получить значение XRun;
3. Прототип функции AAudioStream_getXRunCount:
AAUDIO_API int32_t AAudioStream_getXRunCount(
AAudioStream *stream
)
4. AAudioStream_getXRunCount параметры метода : входящий AAudio аудиопоток тип указателя , доступный Долженаудиопоток Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) ценить ;
5. Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) проблемы, вызванные : Может вызвать текущие проблемы ;
6. Не поддерживается XRun статистика ситуация : Некоторые устройства могут быть поддерживаетсястатистика Долженданные , вернулся в это время XRun ценитьдля 0 ;
1. AAudio аудиопоток Количество кадров на чтение и запись :
2. Функция для получения количества кадров, прочитанных и записанных каждый раз:
AAUDIO_API int32_t AAudioStream_getFramesPerBurst(
AAudioStream *stream
)
// получать Рамки, написанные каждый раз
framesPerBurst_ = AAudioStream_getFramesPerBurst(playStream_);
AAudio аудиопоток Получите максимальное количество кадров : вызов AAudioStream_getBufferSizeInFrames() метод ,доступный AAudio аудиопотоксуществовать Нетблокироватьситуация Вниз, умею читать или Максимальное количество записанных кадров ;
AAUDIO_API int32_t AAudioStream_getBufferSizeInFrames(
AAudioStream *stream
)
// получать AAudio аудиопотоксуществовать Нетблокироватьситуация Вниз , умею читать или Максимальное количество записанных кадров
aaudio_result_t bufferSize = AAudioStream_getBufferSizeInFrames(playStream_);
1. функциональный эффект : при воспроизведении аудиопотока , Может быть препятствие , Прямо сейчас Воспроизведение сэмпла завершено , Новые образцы еще не поступили , Эта функция может проходить Изменять порог размера буфераценить , Корректирование задержка буфера , Прямо сейчас если появится блокировать , Размер этого буфера можно увеличить ( Рамки ) ;
2. объединить XRun ценитьиспользовать : проходить AAudioStream_getXRunCount() метод ,доступный Недогрузка ( UnderRun ) или Превышение лимита ( OverRun ) изценить, Согласно XRun ценить размер буфера переноса Корректирование , Достичь цели установки соответствующей задержки для каждого аудиоустройства. ;
3. Устанавливаемая максимальная цена : проходить AAudioStream_getBufferCapacityInFrames() функциядоступный Максимальное количество Рамок, которое можно установить в буфер , При установке Рамки , Невозможно превысить количество Долженценить ;
4. Просмотр текущего размера буфера : вызов AAudioStream_getBufferSizeInFrames() метод , Вы можете просмотреть текущий буфер Рамки ;
В документации говорится,что : получать AAudio аудиопотоксуществовать Нетблокироватьситуация Вниз, умею читать или Максимальное количество записанных кадров , Не могу понять ;
5. Введение в функцию AAudioStream_setBufferSizeInFrames:
AAUDIO_API aaudio_result_t AAudioStream_setBufferSizeInFrames(
AAudioStream *stream,
int32_t numFrames
)
//Установим количество кадров в текущем буфере
bufferSize = AAudioStream_setBufferSizeInFrames(stream, bufferSize);
Выборок на кадр : Это значение представляет собой количество каналов , Если это моно , Только один образец на кадр , в случае двухканальное стерео , Каждый кадр имеет 2 образцы ;