Przejdź do głównej zawartości

Streaming Sound Wave

Streaming Sound Wave to typ zaimportowanej fali dźwiękowej, który obsługuje dynamiczne dodawanie danych audio, nawet podczas odtwarzania. Oferuje tę samą funkcjonalność co zaimportowana fala dźwiękowa, np. przewijanie, i może być używana w SoundCues itp.

wskazówka

W celu wykrywania aktywności głosu (VAD) zapoznaj się z tą stroną.

Tworzenie streamingowej fali dźwiękowej

Najpierw należy utworzyć streamingową falę dźwiękową. Należy pamiętać, aby traktować ją jako silne odniesienie, aby zapobiec przedwczesnemu zniszczeniu (np. przypisując ją do osobnej zmiennej w Blueprints lub używając UPROPERTY() w C++).

Węzeł Create Streaming Sound Wave

Odtwarzanie fali dźwiękowej

Następnie możesz odtworzyć tę falę dźwiękową. Nie jest to jednak konieczne do zrobienia teraz, możesz rozpocząć odtwarzanie fali dźwiękowej później.

Różne przykłady odtwarzania fali dźwiękowej

Wstępne alokowanie danych audio

Opcjonalnie możesz wstępnie zaalokować dane audio (bajty), aby uniknąć ponownej alokacji całego bufora PCM za każdym razem, gdy dołączane są nowe dane audio.

Węzeł Pre Allocate Audio Data

Dołączanie danych audio

Aby dodać dane audio na koniec istniejącego bufora, użyj odpowiednich funkcji do dynamicznego dołączania danych audio. Odtwarzanie będzie podążać za sekwencją kolejki tych dołączeń.

Append Audio Data node

Unikanie przyspieszonego lub zniekształconego odtwarzania dźwięku

Podczas przesyłania strumieniowego danych audio, gdy fala dźwiękowa jest odtwarzana, możesz doświadczyć przyspieszonego lub zniekształconego odtwarzania w określonych scenariuszach. Ten problem zazwyczaj występuje, gdy:

  1. Odtwarzanie fali dźwiękowej jest blisko/na końcu bieżącego bufora
  2. Nowe dane audio są ciągle dodawane do kolejki w strumieniowej fali dźwiękowej
  3. Odtwarzanie dogania przychodzący strumień danych

Możesz w dowolnym momencie przestać dostarczać dane audio bez problemów. Jednak w scenariuszach, w których potrzebujesz ciągłego przesyłania strumieniowego (takiego jak przesyłanie strumieniowe dźwięku w czasie rzeczywistym), istnieją dwa podejścia w zależności od niezawodności strumieniowania danych audio:

Dla niezawodnego, spójnego strumieniowania: Użyj delegata OnPopulateAudioState, aby rozpocząć odtwarzanie natychmiast po otrzymaniu pierwszego fragmentu.

Dla zawodnego strumieniowania (problemy z siecią, przerywane dane): Dodaj dodatkowe opóźnienie nawet po wyzwoleniu OnPopulateAudioState, aby zbudować większy bufor przed rozpoczęciem odtwarzania.

Używanie OnPopulateAudioState do unikania problemów z odtwarzaniem

Uwaga: Możesz w dowolnym momencie przestać dostarczać dane audio bez powodowania problemów z odtwarzaniem. Dokładne podejście zależy od niezawodności strumieniowania danych audio - użyj natychmiastowego odtwarzania dla stabilnych strumieni lub dodaj dodatkowe opóźnienie buforowania dla niestabilnych strumieni (np. problemy z łącznością sieciową).

Przykładowe użycie

Ostatecznie, twoja implementacja może wyglądać następująco:

Przykład użycia strumieniującej fali dźwiękowej

On Populate Audio State

Delegat OnPopulateAudioState działa podobnie do OnPopulateAudioData, ale nie przesyła dalej wypełnionych danych audio. Może to być przydatne, gdy chcesz śledzić moment wypełnienia danych audio bez przekazywania tablicy z tymi danymi, co może poprawić wydajność.

On Populate Audio State delegate

Praca z danymi PCM

Aby uzyskać dostęp w czasie rzeczywistym do danych PCM podczas odtwarzania, zobacz Obsługa danych PCM.