UE4在C 中播放时间

UE4 Playback time in C++

本文关键字:播放 时间 UE4      更新时间:2023-10-16

我最近正在从事声音处理,但是我遇到了大问题。我想实现的是要获得播放时间(例如,直到现在播放了多长时间的声音,例如我有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

正如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));
}

我想声音系统在游戏线程的单独线程中播放。因此,当您打电话时,您将在错误的线程中执行代码。

如果您启动声音时,在同一呼叫中,您执行FindActiveSound调用(假设您没有返回的fortivesound引用(,然后将其存储在myaudioclass的变量中。

然后,当您打电话以检索播放时间时,使用此存储的fortivesound对象的引用,以检索播放时间。

hth