Unity Microphone.Start() 滞后,如何摆脱它?

Posted

技术标签:

【中文标题】Unity Microphone.Start() 滞后,如何摆脱它?【英文标题】:Unity Microphone.Start() lag, how to get rid of it? 【发布时间】:2021-12-29 12:20:38 【问题描述】:

使用 unity 2020.3 和 XR 插件(目前只有 oculus,但我希望将迁移到 openxr)并在按下辅助按钮时尝试启动麦克风。它可以工作,但启动麦克风会导致延迟。协程无济于事,我尝试了线程来停止延迟,但随后无法对音频剪辑做任何事情。多年来,这个问题已经被问过几次,但还没有答案。代码如下:

 void Update()

    foreach(var d in devices)
        if (d.TryGetFeatureValue(CommonUsages.secondaryButton, out isPressed))
            if (isPressed && !wasTalking)
                 
                    wasTalking = true;
                    asource.PlayOneShot(walkietalkie);
                    //start_recording = new Thread(startRecording);
                    //start_recording.Start();
                    startRecording();  
                
            else if (wasTalking && !isPressed)
                finishRecording();
                wasTalking = false;
            
        

private void startRecording()
    
    recording = Microphone.Start(null, false, 30, freq);
    startRecordingTime = Time.time;
    yield return null;

编辑:我已经删除了无用的协程。为什么我的问题是 -1?

【问题讨论】:

仅供参考,您的协程实际上并没有做任何事情..它完全在一帧内执行;)..我也很确定你不能在线程中执行此异步/大多数 Unity API 只能在主线程上调用 我知道 :),只是我尝试过的一长串事情,因为我在 posibilites 中报废了桶底 【参考方案1】:

我认为缓解口吃的主要方法是将这项工作转移到另一个线程,这对于 Unity 来说是出了名的困难。

对此的解决方案可能是使用或调整另一种录制音频的方法,例如NAudio。

【讨论】:

我正在努力使这个项目尽可能精简。我正在考虑使用 30 秒循环开始录制。然后获取用户何时按下按钮以及何时松开。 30秒以内应该没问题 @jason 想一想你的问题,卡顿很可能来自大量垃圾收集,所以你认为你可以禁用自动垃圾收集并编写自己的脚本来管理它吗?跨度> hmm,我不认为这是垃圾收集,因为无论游戏运行多长时间,当我启动麦克风时都会导致卡顿。也许问题在于在内存中创建空间,而不是访问它。 我的意思是启动麦克风会导致产生大量垃圾。值得一试。

以上是关于Unity Microphone.Start() 滞后,如何摆脱它?的主要内容,如果未能解决你的问题,请参考以下文章

unity怎么保存 unity保存的教程

unity怎么unity判断动画结束

unity和unity3D的区别

Unity3D资源文件 ③ ( Unity 资源包简介 | 导出 Unity 资源包 | 导出资源包的包含依赖选项 | 导入 Unity 资源包 | Unity 资源商店 )

Unity前景如何?现在unity还能找到工作吗?

Unity学习笔记:unity介绍