Latar Belakang: Saya menggunakan Raspberry Pi rev 2 B untuk menjalankan semacam generator suara putih alami yang akan memutar trek audio secara acak dengan panjang yang bervariasi berdasarkan waktu malam/pagi. Beberapa trek hanya satu menit, beberapa beberapa jam. Saya mencari cara untuk memeriksa waktu dan mengubah jenis suara yang diputar berdasarkan waktu.

Masalah saat ini: Saya dapat memulai audio yang sesuai saat program pertama kali dijalankan, tetapi eksekusi timeloop berhenti melakukan polling setelah omxplayer dijalankan.

Saya telah mencoba menelepon OMXPlayer tanpa mengganggu pemeriksa waktu yang menentukan jenis audio yang akan diputar, tetapi setelah pemutaran audio dimulai, saya tidak dapat melanjutkan pemeriksaan waktu. Bahkan jika fungsi play_audio() tidak rekursif, saya masih menginginkan cara agar pemeriksa waktu terus mengeksekusi saat audio diputar

#!/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)

Saya juga telah mencoba menjalankan OMXPlayer dengan subprocess.run() tetapi sepertinya masih hang setelah pemutar dimulai. Saya sepenuhnya terbuka untuk rekomendasi apa pun untuk pemutar media threading latar belakang, daemon proses, atau metode eksekusi berbasis waktu.

Saya baru mengenal Python.

1
tshimkus 9 Agustus 2019, 11:05

1 menjawab

Jawaban Terbaik

Saya memiliki rekursi yang salah sehingga terjebak dalam loop tak terbatas dan fungsi timeloop tidak benar-benar layak untuk solusi ini. Alih-alih, saya memiliki fungsi yang memutar suara, dan kemudian memanggil fungsi yang memeriksa waktu dan memutar dari sub-direktori yang sesuai (atau tidak memutar apa pun dan menunggu).

Inilah yang berhasil saya dapatkan:

#!/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()
0
tshimkus 19 Agustus 2019, 09:52