Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Audio aufnehmen bei Alarmierung #164

Closed
hhansen06 opened this issue Nov 20, 2016 · 15 comments
Closed

Audio aufnehmen bei Alarmierung #164

hhansen06 opened this issue Nov 20, 2016 · 15 comments

Comments

@hhansen06
Copy link

Moin,
wie aufwendig schätzt ihr den Aufwand ein, eine Alarmierung aufzunehmen?
Da bei uns aktuell noch mit ZVIE Alarmiert wird, wäre eine Aufzeichnung der Durchsage sinnvoll.

@Schrolli91
Copy link
Owner

Genau das war damals der Grund, weshalb ich begonnen hab BOSWatch zu entwickeln.
Mit ging es damals nur um den ZVEI Support und die Aufzeichnung der Meldung.
Hinbekommen habe ich es nie so Richtig.

Da wir Inzwischen aber ziemlich viele Leute hier sind, hat evtl jemand die Entscheidende Idee?

@hhansen06
Copy link
Author

Theoretisch den stdin stream von rtl_fm in nen FiFo Packen, der ne definierte Größe hat.
Wenn Alarm erkannt, in Datei schreiben.

Ich stehe mit python leider absolut auf Kriegsfuß...

@dabenzel
Copy link
Contributor

Problem ist hierbei aber glaub ich, dass BosMon bzw. multimon den Stream blockiert und es somit nicht möglich ist, hier zu lauschen. Man müsste das Signal erst duplizieren und denn können beide Dienste hier lauschen. (So aktuell mein Verständnis. Wenn ich falsch liege, berechtigt mich bitte)

@hhansen06
Copy link
Author

boswatch.py Zeile 317 übergibt den Stream vom rtl_fm process an den multimon-ng proc.
An der stelle müsste man hooken können... wie gesagt, mein python ist echt schlimm.

@fwmarcel
Copy link
Contributor

fwmarcel commented Nov 20, 2016

Problem ist hierbei aber glaub ich, dass BosMon bzw. multimon den Stream blockiert und es somit nicht möglich ist, hier zu lauschen. Man müsste das Signal erst duplizieren und denn können beide Dienste hier lauschen. (So aktuell mein Verständnis. Wenn ich falsch liege, berechtigt mich bitte)

Ich meine das wäre so. Mit einem 2ten DVB-T stick sollte das aber kein Problem darstellen. Realisierbar wäre das ganze als Pluigin, welches bei Alarm rtl_fm und ein entsprechendes aufnahme programm startet.

@Schrolli91
Copy link
Owner

Irgendwie muss es doch auch möglich sein, den Stream aufzunehmen ohne einen 2ten Stick zu nutzen. Da gibt es sicher eine Möglichkeit, den entsprechend umzuleiten bzw zu duplizieren...

@hhansen06
Copy link
Author

ich habe mir jetzt auf basis eines zweiten sticks und dem udp plugin, nen kleines script (nicht python) gebaut was ne aufnahme startet, und diese dann ins archiv packt.

@DaGuich
Copy link
Contributor

DaGuich commented Dec 8, 2016

Mal rein theoretisch: Wenn man stdout von rtl_fm beim Eingang eines Alarms auf einen sox-Prozess abzweigt und diesen Prozess dann, nach sagen wir mal 10 Sekunden, beendet, dürfte das doch klappen?

@flothi flothi modified the milestones: Release 2.3, Release 2.2 Jan 26, 2017
@JHCD
Copy link
Contributor

JHCD commented Apr 4, 2017

Die Idee von hhansen finde ich gut... hieße aber doppelte Hardware.

Ein AdHoc-Umbiegen des Autostreams wird schwierig, das müsste als Default repliziert werden.
Aber keine Ahnung, wie man ein Dauerlauf-Programm schreibt, dass gleichzeitig auf ein (UDP-)Signal wartet, um dann den Stream zu speichern...

@flothi
Copy link
Collaborator

flothi commented Apr 4, 2017

ich hatte da mal geschaut, ob es mit tee klappen würde, aber bin nicht dazu gekommen, das weiter zu vertiefen - möglich wäre es ja, den stream per default x Sekunden aufzunehmen und zeitverzögert zu dekodieren (was natürlich dann gegen die Echtzeitalarmierung sprechen würde)...

@JHCD
Copy link
Contributor

JHCD commented Apr 4, 2017

Bitte nur mit einem parallelen Prozess...

@DaGuich
Copy link
Contributor

DaGuich commented Apr 5, 2017

Den Stream bei einer Alarmierung aufnehmen und x Sekunden aufnehmen. Kommt in der Zwischenzeit eine weitere Alarmierung kann man ja die Aufnahme beenden(/verwerfen) und von neuem beginnen. Oder eine Alarmierung setzt die "noch aufzunehmende Zeit" wieder auf x zurück. @flothi

@MarioSDR93
Copy link

MarioSDR93 commented Aug 23, 2017

Ich hab das mal als proof-of-concept implementiert, ist aber auch mehr zusammenkopiert, als dass ich mich mit Python auskenne :)

Es gibt eine neue Methode saveaudio, die den rtl_fm stream für 60 sekunden in eine Datei (/tmp/audio+timestamp+.log) schreibt. Diese Methode wird vom decoder aufgerufen und bekommt das rtl_fm objekt übergeben, deshalb muss auch dem decoder das rtl_fm objekt übergeben werden.

Es wird parallel für jede Alarmierung eine neue Datei geschrieben.

Die Aufzeichnung kann man dann z.B. so anhören:
cat /tmp/audio14:13:54.log | play -r 22050 -t raw -e s -b 16 -c 1 -V1 - --norm=9

Das wird dann auf dem Kopfhörerausgang des Raspberry Pi ausgegeben.

root@raspberrypi:/opt/boswatch/includes# cat saveaudio.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-

"""
Write 60 seconds of audio to a file

@author: Mario Geckler

@requires: none
"""

import logging # Global logger
import time         # for timestamp in audio file
import threading
import subprocess

class WriteAudioThread(threading.Thread):
    def __init__(self, target, *args):
        self._target = target
        self._args = args
        threading.Thread.__init__(self)

    def run(self):
        self._target(*self._args)

def writetofile(rtl_fm):

	try:
                command = "cat"
                writeaudio = subprocess.Popen(command.split(),
                    stdin=rtl_fm.stdout,
                    stdout=open("/tmp/audio"+time.strftime("%H:%M:%S")+".log","a"),
                    shell=False)
                time.sleep(60)
                writeaudio.kill()
	except:
		logging.exception("cannot start decoder")


def saveaudio(rtl_fm):

        t1 = WriteAudioThread(writetofile, rtl_fm)
        t1.start()
        t1.join()
root@raspberrypi:/opt/boswatch/includes# diff decoder.py decoder_orig.py 
13d12
< import saveaudio
15c14
< def decode(freq, decoded, rtl_fm):
---
> def decode(freq, decoded):
27d25
< 
42,43d39
<                         saveaudio.saveaudio(rtl_fm)
< 
54,55d49
< 
<
root@raspberrypi:/opt/boswatch# diff boswatch.py boswatch_audio.py 
367c367
< 			decoder.decode(freqConverter.freqToHz(args.freq), decoded)
---
> 			decoder.decode(freqConverter.freqToHz(args.freq), decoded, rtl_fm)

@MarioSDR93
Copy link

Der Aufruf zum speichern muss aber wahrscheinlich direkt in den ZVEI dekoder, um den doubleFilter mit einzubeziehen.

@Schrolli91 Schrolli91 removed this from the Release 2.3 milestone Sep 26, 2017
@Schrolli91
Copy link
Owner

Da eine Lösung scheinbar in #334 gefunden ist - Closed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants