如何在Python2.7中根据当前时间播放随机音频文件?

2024-04-26 10:07:59 发布

您现在位置:Python中文网/ 问答频道 /正文

背景:我正在使用as Raspberry Pi rev 2 B运行一个自然声音白噪声发生器,它可以根据夜晚/早晨的时间随机播放不同长度的音频曲目。有些曲目只有一分钟,有些长达数小时。我正在寻找一种方法来检查时间,并根据时间改变播放哪种声音。你知道吗

当前问题:我可以在程序第一次执行时启动相应的音频,但一旦启动omxplayer,执行就会停止轮询。你知道吗

我试着调用OMXPlayer而不中断时间检查器,时间检查器决定播放哪种音频,但是一旦音频播放开始,我就无法继续检查时间。即使play_audio()函数不是递归函数,我仍然希望时间检查器能够在音频播放时继续执行

#!/usr/bin/env python
import datetime, time, os, subprocess, random
from timeloop import Timeloop
from datetime import timedelta
from time import sleep
from omxplayer.player import OMXPlayer
from pathlib import Path

tl = Timeloop()
running_cycle = "off" # default value for the time cycle currently running

#function to check current time cycle
def check_time () :
    dt_now = datetime.datetime.now()
    t_now = dt_now.time()
    t_night = datetime.time(hour=2,minute=0)
    t_twilight = datetime.time(hour=4,minute=45)
    t_morning = datetime.time(hour=7,minute=0)
    t_end = datetime.time(hour=10,minute=0)
    if t_night <= t_now < t_twilight:
        return "night"
    elif t_twilight <= t_now < t_morning:
        return "twilight"
    elif t_morning <= t_now < t_end:
        return "morning"
    else:
        return "off"

# function that plays the audio
def play_audio (time_cycle):
    subprocess.call ("killall omxplayer", shell=True)
    randomfile = random.choice(os.listdir("/home/pi/music/nature-sounds/" + time_cycle))
    file = '/home/pi/music/nature-sounds/' + time_cycle + '/' + randomfile
    path = Path(file)
    player = OMXPlayer(path)
    play_audio (time_cycle)

# function that determines whether to maintain current audio cycle or play another
def stay_or_change():
    global running_cycle
    current_cycle = check_time()
    if running_cycle != current_cycle:
        if current_cycle == "off" :
            player.quit()
        else:
            running_cycle = current_cycle
            print "Now playing: " + running_cycle + " @{}".format(time.ctime())
            play_audio(running_cycle)

#starts timeloop checker to play audio - works until stay_or_change() calls play_audio
@tl.job(interval=timedelta(seconds=10))
def job_10s():
    print "10s job - running cycle: " + running_cycle + " -  current time: {}".format(time.ctime())
    stay_or_change() 

# starts the timeloop
if __name__ == "__main__":
    tl.start(block=True)

我也尝试过用subprocess.run()运行OMXPlayer,但在播放器启动后它似乎仍然挂断了。对于后台线程媒体播放器、进程守护进程或基于时间的执行方法,我完全愿意接受任何建议。你知道吗

我对Python还不熟悉。你知道吗


Tags: fromimportplaydatetimetimedef时间current
1条回答
网友
1楼 · 发布于 2024-04-26 10:07:59

我把递归都搞错了,所以它陷入了一个无限循环,而timeloop函数对于这个解决方案来说并不是真正可行的。相反,我使用了一个函数来播放声音,然后调用这个函数来检查时间并从相应的子目录播放(或者不播放任何内容并等待)。你知道吗

以下是我的想法:

#!/usr/bin/env python
import datetime, time, os, subprocess, random
from datetime import timedelta
from time import sleep
from omxplayer.player import OMXPlayer

def check_time () :
    dt_now = datetime.datetime.now()
    t_now = dt_now.time()
    t_night = datetime.time(hour=0,minute=0)
    t_twilight = datetime.time(hour=5,minute=45)
    t_morning = datetime.time(hour=7,minute=45)
    t_end = datetime.time(hour=10,minute=0)
    if t_night <= t_now < t_twilight:
        return "night"
    elif t_twilight <= t_now < t_morning:
        return "twilight"
    elif t_morning <= t_now < t_end:
        return "morning"
    else:
        return "off"

def play_audio (time_cycle):
    randomfile = random.choice(os.listdir("/home/pi/music/nature-sounds/" + time_cycle))
    file = '/home/pi/music/nature-sounds/' + time_cycle + '/' + randomfile
    print "playing track: " + randomfile
    cmd = 'omxplayer  vol -200 ' + file
    subprocess.call (cmd, shell=True)
    what_to_play()

def what_to_play():
    current_cycle = check_time()
    if current_cycle == "off" :
        print "sounds currently off - @{}".format(time.ctime())
        time.sleep(30)
        what_to_play()
    else:
        print "Now playing from " + current_cycle + " @{}".format(time.ctime())
        play_audio(current_cycle)

what_to_play()

相关问题 更多 >