Przejdź do głównej zawartości

Streaming Sound Wave

Do wykrywania aktywności głosowej (VAD), zapoznaj się z tą stroną.

Streaming sound wave to rodzaj importowanej fali dźwiękowej, która obsługuje dynamiczne dodawanie danych audio, nawet podczas odtwarzania. Oferuje tę samą funkcjonalność co importowana fala dźwiękowa, np. przewijanie, i może być używana w SoundCues itp.

Tworzenie streaming sound wave

Najpierw należy utworzyć streaming sound wave. Należy pamiętać, że należy traktować to jako silne odniesienie, aby zapobiec przedwczesnemu zniszczeniu (np. przypisując je 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ą. Jednak nie jest to konieczne do zrobienia teraz, możesz rozpocząć odtwarzanie fali dźwiękowej później.

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

Prealokacja danych audio

Opcjonalnie możesz prealokować dane audio (bajty), aby uniknąć ponownego alokowania 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 następować po kolejności kolejki tych dołączeń.

Węzeł Append Audio Data

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 dźwięku w określonych scenariuszach. Ten problem występuje zazwyczaj, 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 każdej chwili przestać wypełniać danymi audio bez problemów. Jednak w scenariuszach, w których potrzebujesz ciągłego przesyłania strumieniowego (takich jak przesyłanie strumieniowe dźwięku w czasie rzeczywistym), istnieją dwa podejścia w zależności od niezawodności przesyłania strumieniowego danych audio:

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

Dla zawodnego przesyłania strumieniowego (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 twojego strumienia danych audio - użyj natychmiastowego odtwarzania dla stabilnych strumieni lub dodaj dodatkowe opóźnienie buforowania dla zawodnych strumieni (np. problemy z łącznością sieciową).

Przykład użycia

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

Przykład użycia strumieniowej fali dźwiękowej

O Populate Audio State

Delegat OnPopulateAudioState działa podobnie do OnPopulateAudioData, ale nie przesyła wypełnionych danych audio. Może to być przydatne, gdy chcesz śledzić moment wypełnienia danych audio bez przekazywania tablicy z wypełnionymi danymi audio, 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.