Форум сайта python.su
Есть задача запускать музыку на разных устройствах одновременно на raspberry pi. Так как единственная библиотека, подходящая по большему числу критериев - python-sounddevice, выбрал ее.
Но столкнулся с проблемой она написана не классом. Собственно написал отдельный скрипт запуска и обработки музыки, и запускаю этот скрипт с основной программы. Но тут возникла еще одна проблема - время загрузки разных треков разное и время на запуск скрипта не постоянно.
Можно ли каким-нибудь образом более точно и стабильно управлять этими процессами. (например загрузить все треки в память и давать указатели, неявное управление этими процессами)
Буду благодарен за пинок в нужную сторону.
Скрипт воспроизведения и записи треков:
import argparse import os import sys import sounddevice as sd import soundfile as sf class Music: __record_flag = False __playing_flag = False __current_time = 0 __fs = 48000 __duration = 5 # seconds sd.default.samplerate = __fs def __init__(self): self.parser = self.create_parser() self.myrecording = None self.file_name = self.parser.file sd.default.channels = tuple(map(int, self.parser.channels)) sd.default.device = tuple(map(int, self.parser.device)) self.mode = self.parser.mode self.__duration = int(self.parser.time) self.__loop = self.parser.loop.__contains__("True") @staticmethod def create_parser(): parser = argparse.ArgumentParser() parser.add_argument('-c', '--channels', nargs='+') parser.add_argument('-d', '--device', nargs='+') parser.add_argument('-m', '--mode', default="play") parser.add_argument('-f', '--file', default="./resources/sounds/game.wav") parser.add_argument('-t', '--time', default="20") parser.add_argument('-p', '--pid', default="pid.txt") parser.add_argument('-l', '--loop', default="False") # print(parser.parse_args(sys.argv[1:])) return parser.parse_args(sys.argv[1:]) def record(self): print("Start recording") myrecording = sd.rec(self.__duration * self.__fs) sd.wait() print("Recorded successful") # self.sd.play(myrecording) # self.sd.wait() sf.write(self.file_name, myrecording, self.__fs) def play_audio(self, arr): # print(self.__playing_flag) sd.play(arr, loop=self.__loop) sd.wait() def play_rec(self, arr): sd.playrec(arr) sd.wait() def stop_playing(self): # self.sd.play("./res/non.wav") sd.stop() def play_file(self): print("playing track") data, fs = sf.read(self.file_name) self.play_audio(data) def do_reverse(self): data, fs = sf.read(self.file_name) sf.write(self.file_name, data[::-1], fs) def show(self): print(sd.query_devices()) music = Music() # music.show() if music.mode == 'play': music.f = open(music.parser.pid, 'w') music.pid = str(os.getpid()) # print(music.pid) music.f.write(music.pid) music.f.close() music.play_file() elif music.mode == 'record': music.record() elif music.mode == "reverse": music.do_reverse() elif music.mode == "stop": music.stop_playing() elif music.mode == 'play_rec': music.f = open(music.parser.pid, 'w') music.pid = str(os.getpid()) # print(music.pid) music.f.write(music.pid) music.f.close() music.play_file() # print("thats all")
Отредактировано mamol27 (Авг. 23, 2017 11:51:43)
Офлайн