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

Введение

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

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

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

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

Предварительные условия

Прежде чем начать использовать уровень звука и звуковой спектр в своем проекте, выполните следующие шаги:

  • Создайте проект в ZEGOCLOUD Admin Console и получите AppID вашего проекта.
  • В проект интегрирован ZEGO Express SDK. Подробности см. в разделе Интеграция и внедрение.

Включение обратных вызовов уровня звука

Чтобы включить обратные вызовы уровня звука, вызовите метод startSoundLevelMonitor.

/// Enable sound level callbacks.
///
- (void)startSoundLevelMonitor;

/// Enable the sound level monitor, supports enabling advanced features.
///
/// @note After enabled the monitor, the SDK sends out notification through the callback [onCapturedSoundLevelUpdate] to deliver the sound level data of locally captured audio, and through the callback [onRemoteSoundLevelUpdate] to deliver sound level data of remote streams.
/// @note You can call the [startPreview] method before entering a room, and together with the callback [onCapturedSoundLevelUpdate] to check whether the audio device is working properly. 
/// @note The notification interval of the [onCapturedSoundLevelUpdate] and [onRemoteSoundLevelUpdate] callbacks is the value of the parameter.
///
/// @param config The configuration to enable sound level monitor. 
- (void)startSoundLevelMonitorWithConfig:(ZegoSoundLevelConfig *)config;
Вход в полноэкранный режим Выйдите из полноэкранного режима

После завершения вышеописанного шага:

  • Когда вы начнете предварительный просмотр локального видео (вызвав метод startPreview или публикацию локального потока, вызвав метод startPublishingStream, SDK запустит обратный вызов onCapturedSoundLevelUpdate с интервалом в 100 мс для доставки данных об уровне звука локально захваченного аудио.
/// The callback to deliver the sound level data of locally captured audio.
///
/// @param soundLevel: The sound level value of the locally captured audio, which is in the range [0.0, 100.0].
- (void)onCapturedSoundLevelUpdate:(NSNumber *)soundLevel;

/// The callback to deliver the sound level data of locally captured audio.
///
/// @note To trigger this callback, you must call the [startSoundLevelMonitor] method to enable the sound level monitor.
/// @note The callback notification interval is the value set when [startSoundLevelMonitor] is called.
///
/// @param soundLevelInfo The sound level value of the locally captured audio, which is in the range [0.0, 100.0].
- (void)onCapturedSoundLevelInfoUpdate:(ZegoSoundLevelInfo *)soundLevelInfo;               
Вход в полноэкранный режим Выход из полноэкранного режима
  • Когда вы начинаете воспроизводить удаленные потоки, вызывая метод startPlayingStream, SDK будет запускать обратный вызов onRemoteSoundLevelUpdate с интервалом в 100 мс для доставки данных об уровне звука удаленных потоков.
/// The callback to deliver the sound level data of remote streams.
///
/// @param soundLevels: The sound level data (key-value pairs) of the remote streams, of which the key is a stream ID, and the value is the sound level value of the corresponding stream. Each sound level value is in the range [0.0, 100.0].
- (void)onRemoteSoundLevelUpdate:(NSDictionary<NSString *, NSNumber *> *)soundLevels;

/// The callback to deliver the sound level data of remote streams when stream playing.
///
/// @note To trigger this callback, you must call the [startSoundLevelMonitor] method to enable the sound level monitor when playing streams. 
/// @note The callback notification interval is the value set when [startSoundLevelMonitor] is called.
///
/// @param soundLevelInfos The sound level data (key-value pairs) of the remote streams, of which the key is a stream ID, and the value is the sound level value of the corresponding stream. Each sound level value is in the range [0.0, 100.0].
- (void)onRemoteSoundLevelInfoUpdate:(NSDictionary<NSString *, ZegoSoundLevelInfo *> *)soundLevelInfos;
Вход в полноэкранный режим Выход из полноэкранного режима

Включение обратных вызовов звукового спектра

Чтобы включить обратные вызовы звукового спектра, вызовите метод startAudioSpectrumMonitor.

/// Enable audio spectrum callbacks
///
- (void)startAudioSpectrumMonitor;
Вход в полноэкранный режим Выйдите из полноэкранного режима

После завершения вышеописанного шага:

  • Когда вы начнете предварительный просмотр локального видео, вызвав метод startPreview или публикацию локального потока, вызвав метод startPublishingStream, SDK запустит обратный вызов onCapturedAudioSpectrumUpdate с интервалом в 100 мс, чтобы доставить данные аудиоспектра локально захваченного звука.
/// The callback to deliver the audio spectrum data of locally captured audio.
///
/// @param audioSpectrum: An array of audio spectrum values of the locally captured audio. Each audio spectrum value is in the range [0, 2^30].
- (void)onCapturedAudioSpectrumUpdate:(NSArray<NSNumber *> *)audioSpectrum;
Вход в полноэкранный режим Выход из полноэкранного режима
  • Когда вы начинаете воспроизводить удаленные потоки, вызывая метод startPlayingStream, SDK будет запускать обратный вызов onRemoteAudioSpectrumUpdate с интервалом в 100 мс для доставки данных аудиоспектра удаленных потоков.
/// The callback to deliver the audio spectrum data of remote streams
///
/// @param audioSpectrums: The audio spectrum data (key-value pairs) of remote streams, of which the key is a stream ID, and the value is an array of audio spectrum values of the corresponding stream. Each audio spectrum value is in the range [0, 2^30].
- (void)onRemoteAudioSpectrumUpdate:(NSDictionary<NSString *, NSArray<NSNumber *> *> *)audioSpectrums;
Вход в полноэкранный режим Выход из полноэкранного режима

Получение данных из обратных вызовов

SDK предоставляет данные об уровне звука и аудиоспектре удаленных потоков в виде пар ключ-значение в NSDictionary. В каждой паре ключ-значение ключом является идентификатор потока удаленного потока, опубликованного другим пользователем в той же комнате, а значением — значение уровня звука или массив значений аудиоспектра этого потока.

Вы можете сначала получить и сохранить список удаленных потоков, опубликованных другими пользователями в текущей комнате, с помощью обратного вызова onRoomStreamUpdate, а затем использовать каждый идентификатор потока в списке в качестве индекса для получения значения уровня звука или данных звукового спектра этого потока из NSDictionary.

В следующих примерах показано, как получить данные уровня звука и звукового спектра из обратных вызовов.

// The callback to deliver the sound level data of locally captured audio.
- (void)onCapturedSoundLevelUpdate:(NSNumber *)soundLevel {
    ZGSoundLevelTableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    cell.soundLevel = soundLevel;
}

// The callback to deliver the sound level data (key-value pairs) of remote streams. In each key-value pair, the key is the stream ID of a remote stream, and the value is the sound level data of that stream.
- (void)onRemoteSoundLevelUpdate:(NSDictionary<NSString *,NSNumber *> *)soundLevels {
    NSInteger rowCount = [self.tableView numberOfRowsInSection:1];
    for (NSInteger row = 0; row < rowCount; row++) {
        ZGSoundLevelTableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:1]];
        if ([soundLevels objectForKey:cell.streamID]) {
            cell.soundLevel = soundLevels[cell.streamID];
        }
    }
}

// The callback to deliver the audio spectrum data of locally captured audio.
- (void)onCapturedAudioSpectrumUpdate:(NSArray<NSNumber *> *)audioSpectrum {
    ZGSoundLevelTableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    cell.spectrumList = audioSpectrum;
}

// The callback to deliver the audio spectrum data (key-value pairs) of the remote streams. Audio spectrum callback for remote streams. In each key-value pair, the key is the stream ID of a remote stream, and the value is the audio spectrum data of that stream.
- (void)onRemoteAudioSpectrumUpdate:(NSDictionary<NSString *,NSArray<NSNumber *> *> *)audioSpectrums {
    NSInteger rowCount = [self.tableView numberOfRowsInSection:1];
    for (NSInteger row = 0; row < rowCount; row++) {
        ZGSoundLevelTableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:1]];
        if ([audioSpectrums objectForKey:cell.streamID]) {
            cell.spectrumList = audioSpectrums[cell.streamID];
        }
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Отключение обратных вызовов уровня звука

Чтобы отключить обратные вызовы уровня звука, вызовите метод stopSoundLevelMonitor.

/// Disable sound level callbacks
- (void)stopSoundLevelMonitor;
Вход в полноэкранный режим Выйдите из полноэкранного режима

После выполнения этого шага SDK перестанет запускать обратные вызовы onCapturedSoundLevelUpdate и onRemoteSoundLevelUpdate.

Отключение обратных вызовов звукового спектра

Чтобы отключить обратные вызовы аудиоспектра, вызовите метод stopAudioSpectrumMonitor.

/// Stop listening for audio spectrum callbacks
///
- (void)stopAudioSpectrumMonitor;
Вход в полноэкранный режим Выход из полноэкранного режима

После выполнения вышеуказанного шага SDK перестанет запускать обратные вызовы onCapturedAudioSpectrumUpdate и onRemoteAudioSpectrumUpdate.

Оцените статью
Procodings.ru
Добавить комментарий