C++ 中的 UE4 播放时间
UE4 Playback time in C++
我最近在研究声音处理,但是我遇到了一个大问题。
我想要实现的是获得播放时间(到目前为止声音播放了多长时间,例如我有 10 秒的声音,我在 3 秒后暂停播放,所以我应该得到 7 的值)。这是我当前的功能:
float MyAudioClass::GetPlaybackTime(UAudioComponent* AComponent, float &PlaybackTime)
{
if (AComponent)
{
FAudioDevice* AudioDevice = AComponent->GetAudioDevice();
if (AudioDevice)
{
FActiveSound* ActiveSound = AudioDevice->FindActiveSound(AComponent->GetAudioComponentID());
if (ActiveSound)
{
PlaybackTime = ActiveSound->PlaybackTime;
return PlaybackTime;
}
return 0;
}
return 0;
}
return 0;
}
然而,当我尝试使用它时,整个引擎崩溃了,我收到了这个错误:
Assertion failed: IsInAudioThread()
myaudioclass.cpp:173
myaudioclass.h:41
错误行顺序为:
if (ActiveSound) //173
GENERATED_BODY() //41
我在这里做错了什么?如果有人愿意帮助我,我将不胜感激 :3
我想象声音系统在游戏线程的单独线程中播放。因此,当您进行调用时,您正在错误的线程中执行代码。
如果在启动声音时,在同一个调用中执行 FindActiveSound
调用(假设您没有获得返回的 FActiveSound 的引用),并将其存储在 MyAudioClass 的变量中。
然后当您调用检索播放时间时,使用这个存储的 FActiveSound 对象引用来检索 PlaybackTime。
HTH
正如 Graeme 所说,您必须 运行 音频线程中的代码。
这是 AudioComponent.cpp
中使用的片段:
if (FAudioDevice* AudioDevice = GetAudioDevice())
{
const uint64 MyAudioComponentID = AudioComponentID;
FAudioThread::RunCommandOnAudioThread([AudioDevice, MyAudioComponentID, InName, InFloat]()
{
FActiveSound* ActiveSound = AudioDevice->FindActiveSound(MyAudioComponentID);
if (ActiveSound)
{
ActiveSound->SetFloatParameter(InName, InFloat);
}
}, GET_STATID(STAT_AudioSetFloatParameter));
}
我最近在研究声音处理,但是我遇到了一个大问题。 我想要实现的是获得播放时间(到目前为止声音播放了多长时间,例如我有 10 秒的声音,我在 3 秒后暂停播放,所以我应该得到 7 的值)。这是我当前的功能:
float MyAudioClass::GetPlaybackTime(UAudioComponent* AComponent, float &PlaybackTime)
{
if (AComponent)
{
FAudioDevice* AudioDevice = AComponent->GetAudioDevice();
if (AudioDevice)
{
FActiveSound* ActiveSound = AudioDevice->FindActiveSound(AComponent->GetAudioComponentID());
if (ActiveSound)
{
PlaybackTime = ActiveSound->PlaybackTime;
return PlaybackTime;
}
return 0;
}
return 0;
}
return 0;
}
然而,当我尝试使用它时,整个引擎崩溃了,我收到了这个错误:
Assertion failed: IsInAudioThread()
myaudioclass.cpp:173
myaudioclass.h:41
错误行顺序为:
if (ActiveSound) //173
GENERATED_BODY() //41
我在这里做错了什么?如果有人愿意帮助我,我将不胜感激 :3
我想象声音系统在游戏线程的单独线程中播放。因此,当您进行调用时,您正在错误的线程中执行代码。
如果在启动声音时,在同一个调用中执行 FindActiveSound
调用(假设您没有获得返回的 FActiveSound 的引用),并将其存储在 MyAudioClass 的变量中。
然后当您调用检索播放时间时,使用这个存储的 FActiveSound 对象引用来检索 PlaybackTime。
HTH
正如 Graeme 所说,您必须 运行 音频线程中的代码。
这是 AudioComponent.cpp
中使用的片段:
if (FAudioDevice* AudioDevice = GetAudioDevice())
{
const uint64 MyAudioComponentID = AudioComponentID;
FAudioThread::RunCommandOnAudioThread([AudioDevice, MyAudioComponentID, InName, InFloat]()
{
FActiveSound* ActiveSound = AudioDevice->FindActiveSound(MyAudioComponentID);
if (ActiveSound)
{
ActiveSound->SetFloatParameter(InName, InFloat);
}
}, GET_STATID(STAT_AudioSetFloatParameter));
}