UE4在C 中播放时间
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
正如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
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- SFML纹理像播放器
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- SDL_Mixer再次播放时,从随机位置开始一段时间,然后从头开始
- UE4在C 中播放时间
- MF SinkWriter mp4文件的播放持续时间是添加音频样本时的一半,图像的播放速度也是添加音频样本的两倍
- sTD :: Chrono Clocks之间的播放时间_points
- 确定声音开始在端口音频中播放的确切时间
- 如何从一个特定的点(时间码)使用Qt播放声音