स्ट्रीमिंग साउंड वेव
वॉइस एक्टिविटी डिटेक्शन (VAD) के लिए, इस पेज को देखें।
एक स्ट्रीमिंग साउंड वेव एक प्रकार का इम्पोर्टेड साउंड वेव है जो डायनामिक रूप से ऑडियो डेटा जोड़ने का समर्थन करता है, यहां तक कि प्लेबैक के दौरान भी। यह एक इम्पोर्टेड साउंड वेव के समान ही फंक्शनैलिटी प्रदान करता है, जैसे रिवाइंडिंग, और इसे साउंडक्यूज़ आदि में उपयोग किया जा सकता है।
एक स्ट्रीमिंग साउंड वेव बनाना
सबसे पहले आपको एक स्ट्रीमिंग साउंड वेव बनाना चाहिए। कृपया ध्यान दें कि आपको इसे एक स्ट्रॉन्ग रेफरेंस के रूप में ट्रीट करना चाहिए ताकि समय से पहले डिस्ट्रक्शन को रोका जा सके (उदाहरण के लिए ब्लूप्रिंट्स में इसे एक अलग वेरिएबल को असाइन करके या C++ में UPROPERTY()
का उपयोग करके)।
- Blueprint
- C++
UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
ध्वनि तरंग बजाना
आप फिर उस ध्वनि तरंग को बजा सकते हैं। हालांकि, अभी ऐसा करना आवश्यक नहीं है, आप ध्वनि तरंग को बाद में बजाना शुरू कर सक ते हैं।
ऑडियो डेटा का पूर्व-आवंटन
वैकल्पिक रूप से, आप ऑडियो डेटा (बाइट्स) का पूर्व-आवंटन कर सकते हैं ताकि हर बार नया ऑडियो डेटा जोड़ने पर पूरे PCM बफर को फिर से आवंटित करने से बचा जा सके।
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->PreAllocateAudioData(12582912, FOnPreAllocateAudioDataResultNative::CreateWeakLambda(this, [StreamingSoundWave](bool bSucceeded)
{
// Handle the result
}));
ऑडियो डेटा जोड़ना
मौजूदा बफर के अंत में ऑडियो डेटा जोड़ने के लिए, डायनामिक रूप से ऑडियो डेटा जोड़ने के लिए उपयुक्त फ़ंक्शन का उपयोग करें। प्लेबैक इन अपेंड्स के क्यू अनुक्रम का पालन करेगा।
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
// Example of appending encoded audio data
TArray<uint8> AudioData = ...; // Fill with audio data
StreamingSoundWave->AppendAudioDataFromEncoded(AudioData, ERuntimeAudioFormat::Auto);
// Or, if you have raw audio data
TArray<uint8> RawAudioData = ...; // Fill with raw audio data
StreamingSoundWave->AppendAudioDataFromRAW(RawAudioData, ERuntimeRAWAudioFormat::Float32, 44100, 2);
त्वरित या विकृत ऑडियो प्लेबैक से बचना
जब आप साउंड वेव के चलते समय ऑडियो डेटा स्ट्रीम कर रहे होते हैं, तो विशिष्ट परिदृश्यों में आपको त्वरित या विकृत ऑडियो प्लेबैक का अनुभव हो सकता है। यह समस्या आमतौर पर तब होती है जब:
- साउंड वेव प्लेबैक वर्तमान बफर के अंत के निकट/पर हो
- नया ऑडियो डेटा लगातार स्ट्रीमिंग साउंड वेव में कतारबद्ध किया जा रहा हो
- प्लेबैक इनकमिंग डेटा स्ट्रीम तक पहुँच जाता है
आप बिना किसी समस्या के किसी भी समय ऑडियो डेटा को पॉप्युलेट करना बंद कर सकते हैं। हालाँकि, उन परिदृश्यों के लिए जहाँ आपको निरंतर स्ट्रीमिंग की आवश्यकता होती है (जैसे रियल-टाइम ऑडियो स्ट्रीमिंग), आपके ऑडियो डेटा स्ट्रीमिंग की विश्वसनीयता के आधार पर दो दृष्टिकोण हैं:
विश्वसनीय, सुसंगत स्ट्रीमिंग के लिए: पहला चंक प्राप्त होने के तुरंत बाद प्लेबैक शुरू करने के लिए OnPopulateAudioState डेलिगेट का उपयोग करें।
अविश्वसनीय स्ट्रीमिंग के लिए (नेटवर्क समस्याएँ, रुक-रुक कर डेटा): प्लेबैक शुरू करने से पहले एक बड़ा बफर बनाने के लिए OnPopulateAudioState ट्रिगर होने के बाद भी एक अतिरिक्त विलंब जोड़ें।
- Blueprint
- C++
// Approach 1: For reliable streaming - start immediately after first chunk
bool bHasStartedPlayback = false;
StreamingSoundWave->OnPopulateAudioStateNative.AddWeakLambda(this, [this, &bHasStartedPlayback]()
{
if (!bHasStartedPlayback)
{
UGameplayStatics::PlaySound2D(GetWorld(), StreamingSoundWave);
bHasStartedPlayback = true;
}
});
// Approach 2: For unreliable streaming - add delay after first chunk
bool bHasStartedPlayback = false;
StreamingSoundWave->OnPopulateAudioStateNative.AddWeakLambda(this, [this, &bHasStartedPlayback]()
{
if (!bHasStartedPlayback)
{
// Add delay to build up buffer for unreliable streaming
GetWorld()->GetTimerManager().SetTimer(PlaybackDelayTimer, [this]()
{
UGameplayStatics::PlaySound2D(GetWorld(), StreamingSoundWave);
}, 0.5f, false); // Half-second delay
bHasStartedPlayback = true;
}
});
नोट: आप किसी भी समय ऑडियो डेटा को पॉप्युलेट करना बंद कर सकते हैं, इससे प्लेबैक में कोई समस्या नहीं होगी। सटीक दृष्टिकोण आपके ऑडियो डेटा स्ट्रीमिंग की विश्वसनीयता पर निर्भर करता है - सुसंगत स्ट्रीम के लिए तत्काल प्लेबैक का उपयोग करें, या अविश्वसनीय स्ट्रीम (जैसे, नेटवर्क कनेक्टिविटी समस्याएं) के लिए अतिरिक्त बफरिंग विलंब जोड़ें।
उदाहरण उपयोग
अंत में, आपका कार्यान्वयन इस तरह दिख सकता है:
- Blueprint
- C++
यह ए क स्ट्रीमिंग साउंड वेव में ऑडियो डेटा जोड़ने के लिए एक बेसिक कोड उदाहरण है।
यह उदाहरण EXAMPLEMODULE
मॉड्यूल के भीतर UAppendAudioClassExample
क्लास में स्थित AppendAudioExample
फंक्शन का उपयोग करता है।
नोट: उदाहरण को सफलतापूर्वक चलाने के लिए, RuntimeAudioImporter
मॉड्यूल को .Build.cs फाइल में PublicDependencyModuleNames
या PrivateDependencyModuleNames
में, साथ ही आपके प्रोजेक्ट की .uproject फाइल में जोड़ना सुनिश्चित करें।
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "AppendAudioClassExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UAppendAudioClassExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void AppendAudioExample();
private:
// Please pay attention to making the StreamingSoundWave a hard reference, such as using UPROPERTY(), to prevent it from being prematurely garbage collected
UPROPERTY()
class UStreamingSoundWave* StreamingSoundWave;
};
#include "AppendAudioClassExample.h"
#include "Sound/StreamingSoundWave.h"
void UAppendAudioClassExample::AppendAudioExample()
{
// Create a streaming sound wave
StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
// Append audio data
TArray<uint8> StreamedAudioDataToAdd = ...; // Fill with audio data
StreamingSoundWave->AppendAudioDataFromEncoded(StreamedAudioDataToAdd, ERuntimeAudioFormat::Auto);
// Play the sound wave
UGameplayStatics::PlaySound2D(GetWorld(), StreamingSoundWave);
}
ऑडियो स्टेट पॉप्युलेट करने पर
OnPopulateAudioState डेलीगेट OnPopulateAudioData के समान ही कार्य करता है लेकिन पॉप्युलेट किए गए ऑडियो डेटा को प्रसारित नहीं करता। यह तब उपयोगी हो सकता है जब आप ऑडियो डेटा के पॉप्युलेट होने को ट्रैक करना चाहते हैं बिना पॉप्युलेट किए गए ऑडियो डेटा की सरणी पास किए, जो प्रदर्शन में सुधार कर सकता है।
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->OnPopulateAudioStateNative.AddWeakLambda(this, [this]()
{
// Handle the result
});
PCM डेटा के साथ कार्य करना
प्लेबैक के दौरान PCM डेटा तक वास्तविक समय पहुंच के लिए, PCM डेटा हैंडलिंग देखें।