NEWS
Bräuchte untersützung bei python
-
Hi,
ich habe folgendes vor:
Einen Audistream per UDP empfangen und in eine Datei abspeichern.
Ich habe dazu ein python functions code schnipsel bekommen:import argparse import pathlib from pathlib import Path from socketserver import BaseRequestHandler, UDPServer from threading import Thread from time import sleep, monotonic_ns from wave import open as wave_open try: from pyaudio import PyAudio except ModuleNotFoundError: PyAudio = None STREAM_CHANNELS = 1 STREAM_WIDTH = 2 STREAM_RATE = 16000 def server( port, file=None, *, max_length=None, timeout=None, feedback=True, daemon=False): """Receive data on a UDP port and record to file or play as audio. Arguments: port - port number on which to listen file - file to which to write; if ending in '.wav' will record as audio samples; if None will play audio max_length - if not None, stop after this number of seconds from receipt of the first datagram timeout - if not None, once a datagram has been received, close file and return if datagrams doesn't arrive faster than this period in seconds feedback - if true, print a period on standard output for each 4kibytes received & diagnostics at shutdown daemon - if true, re-raise keyboard exception on exit """ wv = False if file is not None: file = Path(file) wv = file.suffix.lower() == '.wav' activity_timestamp_ns = None start_timestamp_ns = None count = 0 exception = None max_length_ns = None if max_length is None \ else max_length * 1000000000 timeout_ns = None if timeout is None else timeout * 1000000000 needs_starting = False class Handler(BaseRequestHandler): def handle(self): nonlocal activity_timestamp_ns, start_timestamp_ns nonlocal count, needs_starting if wv: fh.writeframesraw(self.request[0]) else: if needs_starting: needs_starting = False fh.start_stream() fh.write(self.request[0]) previous_count = count count += len(self.request[0]) if feedback and previous_count // 4096 != count // 4096: print('.', end='', flush=True) activity_timestamp_ns = monotonic_ns() if start_timestamp_ns is None: start_timestamp_ns = activity_timestamp_ns def read_stream(): nonlocal exception with UDPServer(('0.0.0.0', int(port)), Handler) as server: thread = Thread(target=server.serve_forever) thread.start() try: while True: sleep(1) now_ns = monotonic_ns() if timeout_ns is not None and \ activity_timestamp_ns is not None and \ now_ns - activity_timestamp_ns > timeout_ns: break if max_length_ns is not None and \ start_timestamp_ns is not None and \ now_ns - start_timestamp_ns > max_length_ns: break except KeyboardInterrupt as e: exception = e if feedback: diagnostic = ' & removing empty file' if \ activity_timestamp_ns is None else '' print(f'\nshutting down{diagnostic}', flush=True) server.shutdown() thread.join() if file is not None: with ( wave_open(str(file), 'wb') if wv else open(file, 'wb') ) as fh: if wv: fh.setnchannels(STREAM_CHANNELS) fh.setsampwidth(STREAM_WIDTH) fh.setframerate(STREAM_RATE) read_stream() if activity_timestamp_ns is None: file.unlink(missing_ok=True) else: if PyAudio: pya = PyAudio() else: raise ModuleNotFoundError( 'Install pyaudio for realtime streaming') needs_starting = True fh = pya.open(STREAM_RATE, STREAM_CHANNELS, pya.get_format_from_width(STREAM_WIDTH), output=True, start=not needs_starting ) read_stream() fh.stop_stream() fh.close() pya.terminate() if exception and daemon: raise exception if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("-p","--port", type=int) parser.add_argument("-f","--file", type=str) parser.add_argument("-l","--max_length", type=int) parser.add_argument("-t","--max_timeout", type=int) parser.add_argument("-fb","--feedback", type=bool) parser.add_argument("-dae","--daemon", type=bool) args = parser.parse_args() temp_file = open(args.file, "w") server(args.port,temp_file,args.max_length,args.max_timeout,args.feedback,args.daemon)Ich habe im prinzip nur den unteren main anteil dazugebaut.
Ich kenne mich mit python noch nicht so gut aus. Da kommt immer diese Fehlermeldung beim aufruf:pi@iobroker:/opt/iobroker/iobroker-data/esphome.0 $ sudo python rec_stream_to_file.py --port 12345 --file test.wav --max_length 5 --max_timeout 1 --feedback tr Traceback (most recent call last): File "/opt/iobroker/iobroker-data/esphome.0/rec_stream_to_file.py", line 136, in <module> server(args.port,temp_file,args.max_length,args.max_timeout,args.feedback,args.daemon) TypeError: server() takes from 1 to 2 positional arguments but 6 were givenhat jemand ne idee was ich falsch mache ?
ok ich hab es noch nur mit port und file versucht dann kommt eine andere meldung
pi@iobroker:/opt/iobroker/iobroker-data/esphome.0 $ sudo python rec_stream_to_file.py --port 12345 --file test.wav Traceback (most recent call last): File "/opt/iobroker/iobroker-data/esphome.0/rec_stream_to_file.py", line 136, in <module> server(args.port,temp_file) File "/opt/iobroker/iobroker-data/esphome.0/rec_stream_to_file.py", line 39, in server file = Path(file) ^^^^^^^^^^ File "/usr/lib/python3.11/pathlib.py", line 872, in __new__ self = cls._from_parts(args) ^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/pathlib.py", line 510, in _from_parts drv, root, parts = self._parse_args(args) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/pathlib.py", line 494, in _parse_args a = os.fspath(a) ^^^^^^^^^^^^ TypeError: expected str, bytes or os.PathLike object, not TextIOWrapper -
hat sich erledigt.. habs geschafft.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden