Как реализовать звуковые волны в iOS с помощью ZEGOCLOUD SDK

Как реализовать звуковые волны в iOS с помощью ZEGOCLOUD SDK

4 июня 2022 г.

Введение


В сцене караоке часто необходимо тянуть несколько потоков и отображать говорящего пользователя. Нам нужно определить, говорит ли пользователь, громкость речи (звуковой волны) и отобразить ее в пользовательском интерфейсе.


SDK предоставляет следующие два метода для достижения этой функции:


Уровень звука относится к громкости потока. ZEGO Express SDK предоставляет возможность захвата уровня звука потока в режиме реального времени и доставляет захваченные данные об уровне звука клиенту приложения через соответствующие обратные вызовы. Типичный вариант использования этой функции заключается в том, что вы можете визуализировать данные об уровне звука в пользовательском интерфейсе вашего приложения, чтобы указать текущий активный динамик и его громкость. На следующем рисунке показан пример таких вариантов использования.


Аудиоспектр относится к ряду значений, каждое из которых представляет уровень энергии аудиосигнала в точке частотного диапазона. 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.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE