Opensl es discord что это
Здравствуйте, уважемые хабражители!
Недавно, читая хабр, я увидел статью об Android NDK и OpenAL. А в комментариях был задан вопрос о OpenSL ES. Тогда у меня и родилась мысль написать статью об этой библиотеке. Я занимался этой темой, когда мне понадобилось добавить звуки и музыку в игру под Android, написанную на C++, под NDK. Статья не претендует на полноту, здесь будут лишь основы.
- Краткое описание структур OpenSL ES
- Инициализация механизма библиотеки и создание объекта для работы с динамиками
- Проигрывание PCM(wav)
- Проигрывание MP3, OGG
- Заключение
1. Краткое описание структур
- Объект(SLObjectItf) – абстракция набора ресурсов, предназначенная для выполнения определенного круга задач и хранения информации об этих ресурсах. При создании объекта определяется его тип, определяющий круг задач, которые можно решать с его помощью. Объект напоминает Object языка Java, может считаться подобием класса в С++
- Интерфейс(SLEngineItf, SLPlayItf, SLSeekItf и тд) – абстракция набора взаимосвязанных функциональных возможностей, предоставляемых конкретным объектом. Интерфейс включает в себя множество методов, используемых для выполнения действий над объектом. Интерфейс имеет тип, определяющий точный перечень методов, поддерживаемых данным интерфейсом. Интерфейс определяется его идентификатором, который можно использовать в коде для ссылки на тип интерфейса.
Проще говоря, объекты нужны для выделения ресурсов и получения интерфейсов, а интерфейсы обеспечивают доступ к возможностям объектов. Один объект может иметь несколько интерфейсов. В зависимости от устройства, некоторые интерфейсы могут быть недоступны. Однако, я с этим не сталкивался.
2. Инициализация механизма библиотеки и создание объекта для работы с динамиками
Чтобы подключить OpenSL ES в Android NDK, достаточно добавить в секцию LOCAL_LDLIBS файла Android.mk флаг lOpenSLES:
Используемые заголовочные файлы:
Для начала работы с OpenSL ES необходимо инициализировать объект механизма OpenSL ES(SLObjectItf) с помощью вызова slCreateEngine, указав, что для работы с ним будет использоваться интерфейс SL_IID_ENGINE. Это нужно для того, чтобы иметь возможность создавать другие объекты. Объект, полученный с помощью такого вызова, становится центральным объектом для доступа к OpenSL ES API. Далее объект необходимо реализовать, используя псевдометод Realize, который является аналогом конструктора в С++. Первым параметром Realize указывается сам реализуемый объект(аналог this), а вторым — флаг async, указывающий будет ли объект асинхронным.
Текущая реализация Android NDK дает возможность создать только один механизм библиотеки и до 32 объектов вообще. Тем не менее, любая операция создания объекта может закончиться неудачей (например, из-за недостатка системных ресурсов).
Далее необходимо получить интерфейс SL_IID_ENGINE, с помощью которого мы будем иметь доступ к динамикам, проигрыванию музыки, звуков и тд.
- Получить объект, указав желаемые интерфейсы
- Реализовать его, вызвав (*obj)->Realize(obj, async);
- Получить необходимые интерфейсы вызвав (*obj)-> GetInterface (obj, ID, &itf);
- Работать с интерфейсами
- Удалить объект, вызвав (*obj)->Destroy(obj);
SLOutputMixItf – это объект, представляющий устройство вывода звука(динамик, наушники). Спецификация OpenSL ES предусматривает возможность получения списка доступных устройств ввода/вывода, но реализация Android NDK недостаточно полна и не поддерживает ни получение перечня устройств, ни выбор желаемого (официально для этого предназначен интерфейс SLAudioIODeviceCapabilitiesItf).
3. Проигрывание PCM(wav)
Сразу оговорюсь, что для упрощения я не использую данные из заголовка WAV. При желании, добавить поддержку этого достаточно легко. Здесь заголовок нужен лишь для корректного определения размера данных.
Теперь займемся настройкой быстрого буферного вывода звука. Для этого используем специализированное расширение SLDataLocator_AndroidSimpleBufferQueue. Также, для воспроизведения музыки необходимо заполнить две структуры: SLDataSource и SLDataSink, описывающие ввод и вывод аудиоканала соответственно.
Реализация OpenSL ES в Android NDK не является строгой. Если какие-то интерфейсы не указаны, это не значит, что их невозможно получить. Но лучше так не делать. Самостоятельно укажите интерфейс SL_IID_PLAY выше.
- SL_IID_VOLUME для управления громкостью
- SL_IID_MUTESOLO для управления каналами (только для многоканального звука, это указывается в поле numChannels структуры SLDataFormat_PCM).
- SL_IID_EFFECTSEND для наложения эффектов(по спецификации – только эффект реверберации)
Вот и все, простейший проигрыватель wav готов.
Следует обратить внимание, что в пику спецификации, Android NDK не поддерживает буферизованный вывод музыки в отличных от PCM форматах.
4. Проигрывание MP3, OGG
Описанная выше схема плохо подходит для проигрывания длинных музыкальных файлов. В первую очередь из-за того, что длинный wav файл будет весить очень и очень много. Здесь лучше использовать MP3 или OGG. OpenSL ES поддерживает стриминг файлов «из коробки». Отличие от буферизованого вывода так же в том, что на каждый музыкальный файл необходимо создавать отдельный объект-плеер. Поменять файл в процессе воспроизведения для данного плеера невозможно.
Подготовимся к проигрыванию музыки:
Далее вновь заполняем SLDataSource и SLDataSink. И создаем аудиоплеер.
Для описания исходных данных используем MIME-тип, это обеспечивает автоматическое определение типа файла.
Далее получим интерфейсы SL_IID_PLAY и SL_IID_SEEK. Последний нужен для изменения позиции воспроизведения в файле и зацикливания. Его можно использовать вне зависимости от состояния воспроизведения и скорости.
В теории, механизм зацикливания должен быть удобен для установки фоновой музыки в игре. На практике между концом композиции и ее началом проходит 0.5-1.0 секунд (время на слух, на разных девайсах плавает). Я поборол это, сделав в фоновой музыке несколько плавных затуханий в середине и конце. Т.о. разрыв незаметен.
По спецификации, на интерфейс SLPlayItf можно навесить различные callback’и. В Android NDK фича не поддерживается (метод возвращает SL_RESULT_SUCCESS, но callback’и не отрабатывают).
Для остановки или паузы плеера можно воспользоваться методом SetPlayState интерфейса SLPlayItf со значениями SL_PLAYSTATE_STOPPED или SL_PLAYSTATE_PAUSED соответственно. Узнать состояние плеера позволяет метод GetPlayState, возвращающий те же значения.
5. Заключение
OpenSL ES API достаточно богато, и кроме воспроизведения звука, позволяет записывать его. Здесь я не буду касаться записи звука, скажу лишь, что она есть и работает достаточно хорошо. Для получения данных используется очередь буферов. Данные приходят в формате PCM.
Библиотеку сложно использовать в кроссплатформенной разработке, т.к. многие фичи реализованы специализированными для Android методами. Тем не менее, она показалась мне достаточно удобной.
В минусах видится вольная реализация, не поддерживаются многие вещи из спецификации. Кроме того, это API не быстрее, чем API, доступные в Android SDK.
Discord - отличное приложение для смартфонов и компьютерных систем, которое позволяет пользователям эффективно общаться с людьми во время видеоигр. По крайней мере, это основная функция, для которой он предназначен. Вы также можете участвовать в голосовых чатах, когда не играете в игры, а также пользоваться всевозможными другими функциями.
Но нужно сказать, что главной и наиболее ценной функцией Discord действительно является голосовой чат, но даже это иногда не работает должным образом. Если вы один из многих пользователей, которые не могут подключиться к голосовым вызовам Discord и заставить их работать, вот несколько решений, которые помогут вам снова заставить эту функцию работать.
Популярные уроки Discord
Невозможность подключиться к голосовому чату Discord является проблемой сети. Проблемы с сетью являются основной причиной, по которой вы не можете подключиться к голосовым вызовам в Discord, и один из лучших способов решения проблем с сетью также является одним из самых простых способов. Все, что вам нужно сделать, это перезагрузить модем или маршрутизатор, а затем снова попытаться подключиться к голосовой связи в Discord. Если это не сработало, есть еще несколько решений.
QoS, сокращение от Quality of Service, - это функция Discord, которую можно включить или отключить в любой момент в настройках Discord. Как правило, у него есть свои преимущества, но есть и несколько недостатков. Один из этих недостатков заключается в том, что включение QoS может привести к невозможности подключения к голосовым вызовам Discord. Но, как уже упоминалось, QoS можно включить или отключить в любой момент.
Это означает, что не о чем беспокоиться, даже если QoS включено через Discord, так как вы можете просто перейти в настройки и отключить его. Перейдите к пользовательским настройкам через приложение Discord, а затем перейдите к опции, которая говорит «Голос и видео». Нажмите на нее, и вы увидите совершенно новое меню. В указанном новом меню найдите параметр «Включить качество обслуживания» и отключите его. Теперь попробуйте подключиться к голосовому чату Discord, и на этот раз он должен работать. Если QoS уже отключено, но голосовые чаты по-прежнему не работают, попробуйте еще кое-что.
Еще одна функция Discord, имеющая свои недостатки и преимущества, - это OpenSL ES. Но в отличие от QoS OpenSL ES может быть весьма выгодным для голосовых вызовов на Discord. Включите эту функцию сразу и попробуйте подключиться к голосовому чату Discord. Если вы не знаете, как включить этот параметр, все, что вам нужно сделать, это перейти в меню голоса и видео в пользовательских настройках Discord. Теперь вы найдете в этом меню параметр «Принудительно использовать OpenSL ES для вызовов». Включите его, и теперь вы сможете подключаться к голосовым вызовам Discord и обеспечить их правильную работу.
Голосовой чат Discord может не работать из-за неправильной конфигурации голосовых настроек Discord (режим ввода, OpenSL SE и т. Д.). Кроме того, к обсуждаемой ошибке может привести устаревшее приложение Discord. Затронутый пользователь сталкивается с ошибкой при попытке голосового чата с контактом. Проблема не ограничивается конкретной ОС. В некоторых случаях проблема возникала через 2–3 минуты голосового чата.
Кроме того, включите микрофон и говорите, чтобы проверить, не является ли проблема временной. Убедитесь, что микрофон включен в настройках устройства и Discord. Кроме того, убедитесь, что ваша гарнитура не неисправна или несовместима с Discord (в некоторых случаях причиной проблемы была Hyperx Cloud II).
И последнее, но не менее важное: внимательно ознакомьтесь с нашими статьями: микрофон в Discord не работает и никого не слышит в Discord. Для иллюстрации приведенные здесь решения предназначены для телефонов Android; возможно, вам придется копнуть глубже, чтобы эти решения работали в вашей ОС.
Объектно-ориентированный интерфейс на основе языка Си
OpenSL ES реализован на основе языка C, но предоставляемый им интерфейс реализован объектно-ориентированным образом, и большинство API-интерфейсов OpenSL ES вызываются через объекты. Например, в следующем фрагменте кода основная логика заключается в создании экземпляра объекта engine и получении интерфейса объекта engine:
Решение 3. Обновите приложение Discord до последней сборки / бета-версии
Discord регулярно обновляется, чтобы исправлять известные ошибки и добавлять новые функции в соответствии с предложениями пользователей. Наличие устаревшего приложения может стать причиной проблем с голосовым чатом в приложении. В этом контексте обновление приложения Discord до последней сборки / бета-версии может решить проблему. В качестве иллюстрации мы проведем вас через процесс обновления на телефоне Android.
С самого начала мы так спланировали инженерные и продуктовые решения, чтобы Discord хорошо подходил для голосовых чатов во время игры с друзьями. Эти решения позволили сильно масштабировать систему, обладая небольшой командой и ограниченными ресурсами.
В статье рассматриваются различных технологии, которые использует Discord для аудио/видеочатов.
Для ясности всю группу пользователей и каналов мы будем называть «группа» (guild) — в клиенте они называются «серверами». Вместо этого здесь термин «сервер» относится к нашей серверной инфраструктуре.
Каждый аудио/видеочат в Discord поддерживает много участников. Мы наблюдали, как в больших групповых чатах тысяча человек разговаривают по очереди. Такая поддержка требует клиент-серверной архитектуры, потому что одноранговая пиринговая сеть становится непомерно дорогой при увеличении числа участников.
Маршрутизация сетевого трафика через серверы Discord также гарантирует, что ваш IP-адрес никогда не виден — и никто не запустит DDoS-атаку. У маршрутизация через серверы есть и другие преимущества: например, модерация. Администраторы могут быстренько отключить звук и видео нарушителям.
Discord работает на многих платформах.
- Веб (Chrome/Firefox/Edge и т. д.)
- Автономное приложение (Windows, MacOS, Linux)
- Телефон (iOS/Android)
Аудио и видео в Discord работает на WebRTC. Таким образом, браузерное приложение полагается на реализацию WebRTC в браузере. Однако приложения для десктопов, iOS и Android используют единый мультимедийный движок C++, построенный поверх собственной библиотеки WebRTC, специально адаптированной к потребностям наших пользователей. Это означает, что некоторые функции в приложении работают лучше, чем в браузере. Например, в наших нативных приложениях мы можем:
- Обойти приглушение громкости в Windows по умолчанию, когда все приложения автоматически приглушаются при использовании гарнитуры. Это нежелательно, когда вы с друзьями пошли в рейд и координируете действия в чате Discord.
- Использовать собственный регулятор громкости вместо глобального микшера операционной системы.
- Обрабатывать исходные аудиоданные для обнаружения голосовой активности и трансляции звука и видео в играх.
- Уменьшате пропускную способность и потребление ресурсов CPU в периоды тишины — даже в самых многочисленных голосовых чатов в любой момент времени одновременно говорят всего несколько человек.
- Обеспечить общесистемную функциональность режима «рации» (push to talk).
- Отправлять вместе с аудио- видеопакетами дополнительную информацию (например, индикатор приоритета в чате).
В Discord голосовая и видеосвязь инициируется путём ввода голосового канала или вызова. То есть связь всегда инициируется клиентом — это снижает сложность клиентской и серверной части, а также повышает устойчивость к ошибкам. В случае сбоя инфраструктуры участники могут просто повторно подключиться к новому внутреннему серверу.
Под нашим контролем
Контроль нативной библиотеки позволяет реализовать некоторые функции иначе, чем в браузерной реализации WebRTC.
Во-первых, WebRTC полагается на протокол Session Description Protocol (SDP) для согласования аудио/видео между участниками (до 10 КБ на каждый обмен пакетами). В собственной библиотеке для создания обоих потоков — входящего и исходящего — используется API более низкого уровня от WebRTC ( webrtc::Call ). При подключении к голосовому каналу происходит минимальный обмен информацией. Это адрес и порт сервера бэкенда, метод шифрования, ключи, кодек и идентификация потока (около 1000 байт).
Кроме того, для определения наилучшего маршрута между участниками WebRTC использует Interactive Connectivity Establishment (ICE). Поскольку у нас каждый клиент подключается к серверу, нам не нужен ICE. Это позволяет обеспечить гораздо более надёжное соединение, если вы находитесь за NAT, а также сохранить ваш IP-адрес в секрете от других участников. Клиенты периодически пингуются, чтобы файрвол сохранял открытое соединение.
Наконец, WebRTC использует Secure Real-time Transport Protocol (SRTP) для шифрования носителей. Ключи шифрования устанавливаются с помощью протокола Datagram Transport Layer Security (DTLS) на основе стандартного TLS. Встроенная библиотека WebRTC позволяет реализовать собственный транспортный уровень с помощью webrtc::Transport API.
Вместо DTLS/SRTP мы решили использовать более быстрое шифрование Salsa20. Кроме того, мы не отправляем аудиоданные в периоды тишины — частое явление, особенно в больших чатах. Это приводит к значительной экономии пропускной способности и ресурсов CPU, однако и клиент, и сервер должны быть готовы в любой момент прекратить приём данных и переписать порядковые номера аудио/видеопакетов.
Поскольку веб-приложение использует браузерную реализацию WebRTC API, тут нельзя отказаться от SDP, ICE, DTLS и SRTP. Клиент и сервер обмениваются всей необходимой информацией (менее 1200 байт при обмене пакетами) — и у клиентов на основе этой информации устанавливается сессия SDP. Бэкенд отвечает за устранение различий между десктопными и браузерными приложениями.
На бэкенде работает несколько сервисов для голосовых чатов, но мы сосредоточимся на трёх: Discord Gateway, Discord Guilds и Discord Voice. Все наши сигнальные серверы написаны на Elixir, что позволяет многократно повторно использовать код.
При подключении к голосовому каналу статус подключения отображается объектом состояния голосовой связи. Клиент обновляет этот объект по шлюзовому подключению.
При подключении к голосовому каналу вам назначают один из серверов Discord Voice. Он отвечает за передачу звука каждому участнику канала. Все голосовые каналы в группе назначаются одному серверу. Если вы первый в чате, сервер Discord Guilds отвечает за назначение сервера Discord Voice всей группе с помощью описанного ниже процесса.
Аудио движок объектов и интерфейсов
Объекты и интерфейсы звукового движка, а именно Engine Object и SLEngineItf Interface. Основной функцией Engine Object является управление жизненным циклом Audio Engine и предоставление интерфейса управления для объектов Engine. Способ использования объекта двигателя заключается в следующем:
NDK Android OpenSL ES захват и воспроизведение аудио
Эта статья впервые была опубликована в общедоступной учетной записи WeChat «Byte Flow».
Эта серия блогов статей о разработке NDK:
OpenSL ES - это открытая аппаратная библиотека ускорения звука для встраиваемых систем, которую также можно рассматривать как набор стандартов звука для встраиваемых платформ. Полное название: Open Sound Library для встраиваемых систем, которая обеспечивает набор высокой производительности, низкий Способ реализации функции отложенного звука и межплатформенное развертывание аппаратных и программных характеристик звука значительно снизили сложность разработки приложений для обработки звука на верхнем уровне.
При разработке Android Google официально поддерживал стандарт OpenSL ES из Android 2.3 (API 9) и расширил его. OpenSL ES, представленный в этой статье, предназначен для разработки Android NDK.
Назначение сервера Discord Voice
Каждый сервер Discord Voice периодически сообщает о своём состоянии и нагрузке. Эта информация помещается в систему обнаружения сервисов (мы используем etcd), как обсуждалось в предыдущей статье.
Сервер Discord Guilds следит за системой обнаружения сервисов и назначает группе наименее используемый сервер Discord Voice в данном регионе. Когда он выбран, все объекты состояния голосовой связи (также поддерживаемые сервером Discord Guilds) передаются на сервер Discord Voice, чтобы тот мог настроить переадресацию аудио/видео. Клиенты уведомляются о выбранном сервере Discord Voice. Тогда клиент открывает второе соединение WebSocket с голосовым сервером (мы называем его голосовым соединением WebSocket), которое используется для настройки переадресации мультимедиа и индикации речи.
Сервер Discord Voice содержит два компонента: сигнальный модуль и блок ретрансляции мультимедиа, называемый блоком избирательной пересылки, SFU (selective forwarding unit). Сигнальный модуль полностью контролирует SFU и отвечает за генерацию идентификаторов потоков и ключей шифрования, перенаправление индикаторов речи и т. д.
Наш SFU (на C++) отвечает за направление аудио- и видеотрафика между каналами. Он разработан своими силами: для нашего конкретного случая SFU обеспечивает максимальную производительность и, таким образом, самую большую экономию. При модерации нарушителей (отключение звука на сервере), их аудиопакеты не обрабатываются. SFU также работает мостом между нативными и браузерными приложениями: он реализует транспорт и шифрование и для браузера и для нативных приложений, преобразуя пакеты в процессе передачи. Наконец, SFU отвечает за обработку протокола RTCP, который используется для оптимизации качества видео. SFU собирает и обрабатывает отчёты RTCP от получателей — и уведомляет отправителей, какая полоса доступна для передачи видео.
Поскольку напрямую из интернета у нас доступны только сервера Discord Voice, речь пойдёт о них.
Сигнальный модуль непрерывно контролирует SFU. Если тот сбоит, он мгновенно перезапускается с минимальной паузой в обслуживании (несколько потерянных пакетов). Состояние SFU восстанавливается сигнальным модулем без какого-либо взаимодействия с клиентом. Хотя сбои SFU редки, мы используем тот же механизм для обновления SFU без перерывов в обслуживании.
Когда падает сервер Discord Voice, он не отвечает на пинг — и удаляется из системы обнаружения сервисов. Клиент также замечает сбой сервера из-за разрыва голосового соединения WebSocket, тогда он запрашивает пинг голосового сервера через шлюзовое соединение WebSocket. Сервер Discord Guilds подтверждает сбой, консультируется с системой обнаружения сервисов и назначает группе новый сервер Discord Voice. Затем Гильдии Discordов отправляют все объекты состояния голоса на новый голосовой сервер. Все клиенты получают уведомление о новом сервере и подключаются к нему для запуска настройки мультимедиа.
Довольно часто серверы Discord Voice попадают под DDoS (мы видим это по быстрому увеличению входящих IP-пакетов). В этом случае мы выполняем такую же процедуру, как при сбое сервера: удаляем его из системы обнаружения сервисов, выбираем новый сервер, переводим на него все объекты состояния голосовой связи и уведомляем клиентов о новом сервере. Когда DDoS-атака утихает, сервер возвращается обратно в систему обнаружения служб.
Если владелец группы решает выбрать новый регион для голоса, мы выполняем очень похожую процедуру. Сервер Discord Guilds выбирает наилучший доступный голосовой сервер в новом регионе, консультируясь с системой обнаружения сервисов. Затем он переводим на него все объекты состояния голосовой связи и уведомляем клиентов о новом сервере. Клиенты разрывают текущее соединение WebSocket со старым сервером Discord Voice и создают новое соединение с новым сервером Discord Voice.
Вся инфраструктура Discord Gateway, Discord Guilds и Discord Voice поддерживает горизонтальное масштабирование. Discord Gateway и Discord Guilds работают в облаке Google.
У нас более 850 голосовых серверов в 13 регионах (размещёнными более чем в 30 дата-центрах) по всему миру. Такая инфраструктура обеспечивает большую избыточность на случай сбоев в дата-центрах и DDoS. Мы работаем с несколькими партнёрами и используем свои физические серверы в их дата-центрах. Совсем недавно добавили регион Южной Африки. Благодаря инженерным усилиям как в клиентской, так и в серверной архитектуре, теперь Discord способен обслуживать одновременно более 2,6 миллиона пользователей голосового чата с исходящим трафиком более 220 Гбит/с и 120 млн пакетов в секунду.
Мы постоянно следим за качеством голосовой связи (метрики поступают с клиентской стороны на серверы бэкенда). В будущем эта информация поможет в автоматическом обнаружении и устранении деградаций.
Для скринкастов нужно ещё больше полосы, чем для видео, из-за более высокого FPS и разрешения, чем у обычной веб-камеры. Мы сейчас работаем над поддержкой аппаратное кодирования видео в десктопном приложении.
Решение 1. Измените режим ввода приложения Discord на голосовое управление
У вас могут возникнуть проблемы с голосовым чатом Discord, если режим ввода / настройки звука в приложении Discord настроены неправильно. В этом контексте изменение режима ввода на голосовую активность в настройках Discord / вызова может решить проблему.
- Запустите приложение Discord, а затем откройте его настройки.
- Теперь нажмите на Голос и видео.Откройте настройки голоса и видео в Discord
- Затем измените режим ввода на «Голосовое действие».Измените режим вывода на голосовую активность
- Теперь при звонке убедитесь, что режим ввода также установлен на «Активность голоса».
- Затем перезагрузите телефон и после перезапуска проверьте, устранена ли проблема с голосовым чатом в Discord.
SLRecordItf и SLPlayItf
SLRecordItf и SLPlayItf абстрагируют мультимедийные функции устройства записи и воспроизведения соответственно и создают экземпляры объектов проигрывателя и устройства записи с помощью методов SLEngineItf CreateAudioPlayer и CreateAudioRecorder соответственно.
Жизненный цикл объекта
Объект OpenSL ES обычно имеет три состояния, а именно: SL_OBJECT_STATE_UNREALIZED (недоступно), SL_OBJECT_STATE_REALIZED (доступно), SL_OBJECT_STATE_SUSPENDED (зависание).
Когда объект находится в состоянии SL_OBJECT_STATE_UNREALIZED (недоступно), система не будет выделять ему ресурсы, после вызова метода Realize он перейдет в состояние SL_OBJECT_STATE_REALIZED (доступно), когда к различным функциям и ресурсам объекта можно будет обращаться нормально, когда к аппаратным средствам, связанным с системным звуком, обращаются. Когда другие процессы заняты, объект ES OpenSL войдет в состояние SL_OBJECT_STATE_SUSPENDED (приостановлено), а затем вызовет метод Resume для возврата объекта в состояние SL_OBJECT_STATE_REALIZED (доступно); когда объект будет завершен, вызовите метод Destroy для освобождения ресурса, объект вернется к SL_OBJECT_STATE_UNED (Недоступно) статус.
SLDataSource и SLDataSink
Структуры SLDataSource и SLDataSink в OpenSL ES в основном используются для создания объектов аудиоплеера и рекордера, где SLDataSource представляет информацию об источнике аудиоданных, а SLDataSink представляет информацию о выходе аудиоданных.
Audio Recorder
Audio Player
PS: источником данных аудиоплеера также могут быть аудиоданные, сохраненные или кэшированные локально. Изображение выше из блога Jhuster.
Следующий код в основном реализует сбор, хранение и воспроизведение аудиоданных.
Решение 2. Включите «Принудительные вызовы для использования OpenSL ES» в настройках Discord
Для улучшения функциональности Discord были добавлены различные функции. Одной из таких функций является API «Открытая звуковая библиотека для встроенных систем» (OpenSL ES), позволяющая решить различные проблемы со звуком в приложении Discord. Переход на указанный API может решить проблему с голосовым чатом.
- Запустите приложение Discord, а затем откройте его Настройки. Теперь нажмите на Голос и видео.
- Затем в разделе «Аппаратное ускорение с низкой задержкой» выберите «Принудительные вызовы для использования OpenSL ES».Включите опцию принудительных вызовов для использования OpenSL ES
- Затем выйдите из приложения Discord.
- Теперь запустите настройки вашего телефона, а затем откройте его диспетчер приложений.Открыть диспетчер приложений
- Затем откройте Discord и нажмите Force Stop.Принудительно остановить приложение Discord
- Теперь подтвердите принудительную остановку приложения Discord.Принудительно остановить приложение Discord
- Теперь запустите приложение Discord и проверьте, решена ли проблема с голосовым чатом.
Концепции объектов и интерфейсов
Объект и интерфейс Две основные концепции в OpenSL ES можно сравнить с объектами и интерфейсами в Java. В OpenSL ES каждый объект может существовать серией Интерфейса и предоставляет серию основных операций для каждого объекта, таких как Realize, GetState, Destroy и так далее. Важным моментом является то, что вы можете использовать только функции, предоставленные Object, получив интерфейс Object через метод GetInterface.
Читайте также: