我正在尝试使用Python在Vizard中安排一个动作(蜂鸣声)。但是,我希望在试用开始后的某个特定时间发出提示音。

到目前为止,我得到的内容(例如,运行一次后)给我列出了几次:[1.89229142 5.2610474 9.86058804 11.43137033 13.87078666],并且正在以似乎变化的间隔播放声音,并打印出上述元素时序表。只是实际上并没有将这些元素用作播放的秒数/时间。

我的问题是:如何让Python知道这些不仅是数字,而且是函数/试用版开始以来的时间安排?也许我应该在某个地方使用time.time(),但是我不确定如何到达那里的逻辑。

import time
import numpy as np
import viztask


### Start Vizard ###
viz.go()


### Cue sound ###
cue = viz.addAudio('cues\dong.wav')
cueDuration = cue.getDuration()

### Timings ###

def uniform_min_range(a, b, n, min_dist):
    while True:
        times = np.random.uniform(a, b, size=n)
        np.sort(times)
        if np.all(np.diff(times) >= min_dist):
            return times

def timings():
    global times
    times = uniform_min_range(0, 20, 5, 1.0)
    print "times: ", times


def main():
    global times
    timesIndex =0
    for x in range(len(times)):
        cuetime = times[timesIndex]
        cue.play()
        print 'cue'
        print cuetime
        yield viztask.waitTime(cueDuration + cuetime)
        cue.stop()
        timesIndex = timesIndex + 1



timings()
viztask.schedule(main())


根据jacantebury在对他的答案的评论中的建议进行编辑:这是关闭的工作代码。我猜想时间上的不匹配与帧速率有关,正如jacanterbury建议的那样。

import time
import viztask

viz.go()

times= [1.76493425, 3.10174059, 4.49576803, 10.99379224, 18.84178369] #at these times since onset of script, a text "hello world" should be printed
time_intervals=[]
prev=0

for val in times:
    time_intervals.append( val - prev )
    prev = val
    print time_intervals

intervalsIndex = 1

start = time.time()

def main():
    global intervalsIndex
    yield viztask.waitTime(time_intervals[0])
    for x in range (len(time_intervals)):
        print ('hello world', '- now: ', time.time()- start)
        yield viztask.waitTime(time_intervals[intervalsIndex])
        intervalsIndex = intervalsIndex + 1

 viztask.schedule(main())


现在这给了我
    ('hello world','-now:',1.7820000648498535)
    ('hello world','-now:',3.133000135421753)
    ('hello world','-now:',4.5350000858306885)
    ('hello world','-now:',11.040000200271606)
    ('hello world','-now:',18.897000074386597)
这非常接近我的列表元素(即时间安排以及我最初想要的内容)。

最佳答案

busfault关于您使用FOR循环是正确的。

要使用yield对其进行测试,您需要schedule被调用的函数。
例如

import viz
import viztask

def myfunc():

    for cuetime in (2,3,4):

        mydata = yield viztask.waitTime( cuetime)
        print( 'Wait time: ' , cuetime, ' - Elapsed time: ', mydata.elapsed )

viz.go()
viztask.schedule( myfunc )


产生这样的输出...

('Wait time: ', 2, ' - Elapsed time: ', 2.002306576051085)
('Wait time: ', 3, ' - Elapsed time: ', 3.016386045747815)
('Wait time: ', 4, ' - Elapsed time: ', 4.016321305293874)


您会发现时序不匹配通常与您的帧频有关(60 Hz〜16.7ms)

由OP进行以下编辑:
..测试时序差异是否是由于帧同步引起的一种简单方法是关闭图形卡的垂直同步(V-Sync)并重新运行-我怀疑您会获得更好的时序,但是可能会导致显示屏撕裂-然后是对您来说更重要的东西,图像质量或定时精度的电话。
证明其待办事项更新的另一种选择是简单地更改您的刷新率,并查看时间差是否相应变化。

我注意到您已经回到使用time.time()了-这比根据我的演示(使用mydata = yield viztask.waitTime( cuetime) ...)从waitTime中使用返回对象要准确得多

10-06 09:51
查看更多