Как реализовать звуковые волны в iOS с помощью ZEGOCLOUD SDK
4 июня 2022 г.Введение
В сцене караоке часто необходимо тянуть несколько потоков и отображать говорящего пользователя. Нам нужно определить, говорит ли пользователь, громкость речи (звуковой волны) и отобразить ее в пользовательском интерфейсе.
SDK предоставляет следующие два метода для достижения этой функции:
Уровень звука относится к громкости потока. ZEGO Express SDK предоставляет возможность захвата уровня звука потока в режиме реального времени и доставляет захваченные данные об уровне звука клиенту приложения через соответствующие обратные вызовы. Типичный вариант использования этой функции заключается в том, что вы можете визуализировать данные об уровне звука в пользовательском интерфейсе вашего приложения, чтобы указать текущий активный динамик и его громкость. На следующем рисунке показан пример таких вариантов использования.
Аудиоспектр относится к ряду значений, каждое из которых представляет уровень энергии аудиосигнала в точке частотного диапазона. ZEGO Express SDK предоставляет возможность захвата данных аудиоспектра потока в режиме реального времени и доставляет захваченные данные аудиоспектра клиенту приложения через соответствующие обратные вызовы. Типичным вариантом использования этой функции является то, что вы можете использовать ее для создания и отображения визуализатора звукового спектра в пользовательском интерфейсе вашего приложения, особенно для онлайн-приложений для караоке. На следующем рисунке показан пример визуализатора звукового спектра.
Предпосылки
Прежде чем вы начнете использовать уровень звука и звуковой спектр в своем проекте, убедитесь, что вы выполнили следующие шаги:
- Создайте проект в ZEGOCLOUD Admin Console и получите AppID вашего проекта.
- В проект интегрирован ZEGO Express SDK. Подробнее см. Интеграция и Реализация.
Включить обратные вызовы уровня звука
Чтобы включить обратные вызовы уровня звука, вызовите метод startSoundLevelMonitor.
```объект
/// Включить обратные вызовы уровня звука.
- (void) startSoundLevelMonitor;
/// Включить монитор уровня звука, поддерживает включение расширенных функций.
/// @note После включения монитора SDK отправляет уведомление через обратный вызов [onCapturedSoundLevelUpdate] для доставки данных об уровне звука локально захваченного звука и через обратный вызов [onRemoteSoundLevelUpdate] для доставки данных об уровне звука удаленных потоков.
/// @note Вы можете вызвать метод [startPreview] перед входом в комнату и вместе с обратным вызовом [onCapturedSoundLevelUpdate] проверить, правильно ли работает аудиоустройство.
/// @note Интервал уведомления обратных вызовов [onCapturedSoundLevelUpdate] и [onRemoteSoundLevelUpdate] — это значение параметра.
/// @param config Конфигурация для включения монитора уровня звука.
- (void)startSoundLevelMonitorWithConfig:(ZegoSoundLevelConfig *)config;
После завершения вышеуказанного шага:
- Когда вы начинаете предварительный просмотр локального видео (вызывая метод
startPreview
или публикуя локальный поток, вызывая методstartPublishingStream
, SDK инициирует обратный вызов onCapturedSoundLevelUpdate с интервалом в 100 мс для доставки данных об уровне звука локально захваченный звук.
```объект
/// Обратный вызов для доставки данных об уровне звука локально захваченного звука.
/// @param soundLevel: значение уровня звука локально захваченного звука, которое находится в диапазоне [0,0, 100,0].
- (void) onCapturedSoundLevelUpdate:(NSNumber *)soundLevel;
/// Обратный вызов для доставки данных об уровне звука локально захваченного звука.
/// @note Чтобы запустить этот обратный вызов, вы должны вызвать метод [startSoundLevelMonitor], чтобы включить монитор уровня звука.
/// @note Интервал уведомления обратного вызова — это значение, установленное при вызове [startSoundLevelMonitor].
/// @param soundLevelInfo Значение уровня звука локально захваченного звука, которое находится в диапазоне [0,0, 100,0].
- (void) onCapturedSoundLevelInfoUpdate:(ZegoSoundLevelInfo *)soundLevelInfo;
- Когда вы начинаете воспроизводить удаленные потоки, вызывая метод startPlayingStream, SDK инициирует обратный вызов onRemoteSoundLevelUpdate с интервалом в 100 мс для доставки данных об уровне звука удаленных потоков.
```объект
/// Обратный вызов для доставки данных об уровне звука удаленных потоков.
/// @param soundLevels: данные об уровне звука (пары ключ-значение) удаленных потоков, ключом которых является идентификатор потока, а значением — значение уровня звука соответствующего потока. Каждое значение уровня звука находится в диапазоне [0,0, 100,0].
- (void) onRemoteSoundLevelUpdate:(NSDictionary
*)soundLevels;
/// Обратный вызов для доставки данных об уровне звука удаленных потоков при воспроизведении потока.
/// @note Чтобы вызвать этот обратный вызов, вы должны вызвать метод [startSoundLevelMonitor], чтобы включить монитор уровня звука при воспроизведении потоков.
/// @note Интервал уведомления обратного вызова — это значение, установленное при вызове [startSoundLevelMonitor].
/// @param soundLevelInfos Данные об уровне звука (пары ключ-значение) удаленных потоков, ключом которых является идентификатор потока, а значением — значение уровня звука соответствующего потока. Каждое значение уровня звука находится в диапазоне [0,0, 100,0].
- (void) onRemoteSoundLevelInfoUpdate:(NSDictionary
*)soundLevelInfos;
Включить обратные вызовы Audio Spectrum
Чтобы включить обратные вызовы звукового спектра, вызовите метод startAudioSpectrumMonitor.
```объект
/// Включить обратные вызовы звукового спектра
- (void) запустить AudioSpectrumMonitor;
После завершения вышеуказанного шага:
- Когда вы начинаете предварительный просмотр локального видео, вызывая метод startPreview, или публикуете локальный поток, вызывая метод startPublishingStream, SDK инициирует обратный вызов onCapturedAudioSpectrumUpdate с интервалом в 100 мс, чтобы доставить данные о спектре звука локально. захваченный звук.
```объект
/// Обратный вызов для доставки данных звукового спектра локально захваченного звука.
/// @param audioSpectrum: массив значений звукового спектра локально захваченного звука. Каждое значение звукового спектра находится в диапазоне [0, 2^30].
- (void) onCapturedAudioSpectrumUpdate:(NSArray
*)audioSpectrum;
- Когда вы начинаете воспроизводить удаленные потоки, вызывая метод startPlayingStream, SDK инициирует обратный вызов onRemoteAudioSpectrumUpdate с интервалом в 100 мс для доставки данных аудиоспектра удаленных потоков.
```объект
/// Обратный вызов для доставки данных звукового спектра удаленных потоков
/// @param audioSpectrums: данные аудиоспектра (пары ключ-значение) удаленных потоков, из которых ключ является идентификатором потока, а значение представляет собой массив значений аудиоспектра соответствующего потока. Каждое значение звукового спектра находится в диапазоне [0, 2^30].
- (void) onRemoteAudioSpectrumUpdate:(NSDictionary
*> *)audioSpectrums;
Получить данные из обратных вызовов
SDK предоставляет данные об уровне звука и данные спектра звука удаленных потоков в виде пар ключ-значение в NSDictionary. В каждой паре ключ-значение ключ — это идентификатор потока удаленного потока, опубликованного другим пользователем в той же комнате, а значение — это значение уровня звука или массив значений звукового спектра для этого потока.
Вы можете сначала получить и сохранить список удаленных потоков, опубликованных другими пользователями в текущей комнате, с помощью обратного вызова onRoomStreamUpdate, а затем использовать идентификатор каждого потока в списке в качестве индекса для получения значения уровня звука или данных спектра звука. этого потока из NSDictionary
.
В следующих примерах показано, как получить данные об уровне звука и звуковом спектре из обратных вызовов.
```объект
// Обратный вызов для доставки данных об уровне звука локально захваченного звука.
- (пусто) onCapturedSoundLevelUpdate:(NSNumber *)soundLevel {
ZGSoundLevelTableViewCell *cell = [self.tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: 0]];
ячейка.soundLevel = уровень звука;
// Обратный вызов для доставки данных об уровне звука (пар ключ-значение) удаленных потоков. В каждой паре ключ-значение ключ — это идентификатор удаленного потока, а значение — данные об уровне звука этого потока.
- (void) onRemoteSoundLevelUpdate:(NSDictionary
*)soundLevels {
NSInteger rowCount = [self.tableView numberOfRowsInSection: 1];
for (строка NSInteger = 0; строка < rowCount; строка ++) {
ZGSoundLevelTableViewCell *cell = [self.tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow: строка inSection: 1]];
если ([soundLevels objectForKey:cell.streamID]) {
cell.soundLevel = soundLevels[cell.streamID];
// Обратный вызов для доставки данных звукового спектра локально захваченного звука.
- (void) onCapturedAudioSpectrumUpdate: (NSArray
*) audioSpectrum {
ZGSoundLevelTableViewCell *cell = [self.tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: 0]];
cell.spectrumList = аудиоспектр;
// Обратный вызов для доставки данных звукового спектра (пар ключ-значение) удаленных потоков. Обратный вызов звукового спектра для удаленных потоков. В каждой паре ключ-значение ключ — это идентификатор удаленного потока, а значение — данные звукового спектра этого потока.
- (void) onRemoteAudioSpectrumUpdate:(NSDictionary
*> *)audioSpectrums {
NSInteger rowCount = [self.tableView numberOfRowsInSection: 1];
for (строка NSInteger = 0; строка < rowCount; строка ++) {
ZGSoundLevelTableViewCell *cell = [self.tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow: строка inSection: 1]];
if ([audioSpectrums objectForKey:cell.streamID]) {
cell.spectrumList = audioSpectrums[cell.streamID];
Отключить обратные вызовы уровня звука
Чтобы отключить обратные вызовы уровня звука, вызовите метод stopSoundLevelMonitor
.
```объект
/// Отключить обратные вызовы уровня звука
- (void)stopSoundLevelMonitor;
После выполнения вышеуказанного шага SDK перестанет запускать обратные вызовы onCapturedSoundLevelUpdate и onRemoteSoundLevelUpdate.
Отключить обратные вызовы Audio Spectrum
Чтобы отключить обратные вызовы звукового спектра, вызовите метод stopAudioSpectrumMonitor
.
```объект
/// Остановить прослушивание обратных вызовов звукового спектра
- (void)stopAudioSpectrumMonitor;
После выполнения вышеуказанного шага SDK перестанет запускать обратные вызовы onCapturedAudioSpectrumUpdate и onRemoteAudioSpectrumUpdate.
Оригинал