Hallo,
nachdem ich in den letzten Monaten meine Homematic-Zentrale durch eine Rasp Pi/FHEM-Lösung ersetzt habe (Vielen herzlichen Dank an die vielen Entwickler! Super Arbeit!), kommen jetzt die ersten "like to have"-Themen.
Nachdem ich auch schon ein "WakeUp-Licht" eingerichtet habe, möchte ich gerne nach einer gewissen Zeit meinen Lieblingsradiosender hören. Als Zielausgabegerät soll ein Airplay-Lautsprecher (Standalone) genutzt werden.
Nach einigem Lesen und Probieren (PulseAudio (V1, raop V2 konnte ich auf dem Pi nicht kompilieren), forked-daapd (läuft)) kam ich leider bis jetzt noch zu keiner Lösung, um einen Stream durch FHEM gesteuert auf einem Airplay-Lautsprecher auszugeben.
Es gibt viele Infos, um den Pi als Airplay-Ziel zu nutzen, aber als "Weiterleiter" recht wenig.
Wunschlösung:
- Primär Quelle Webstream, gerne auch zusätzlich lokale Dateien im Verzeichnis ggfs. DLNA
- FHEM sollte Starten, Stoppen und Laut/Leise steuern können
- Auswahl des Zielairplay-Lautsprechers möglich
Für jede Unterstützung/Hinweis auf eine funktionierende Lösung bin ich Dankbar.
PS: Ich möchte dabei gerne ohne einen weiteren Rechner auskommen (z.B. Mac mit iTunes)
Habe es zwar selber noch nicht probiert, aber MPD kann AirPlay ansteuern.
Auf die schnelle gefunden:
http://blog.austinseraphin.com/2012/01/06/how-to-make-mpd-work-with-airplay/ (http://blog.austinseraphin.com/2012/01/06/how-to-make-mpd-work-with-airplay/)
Und für MPD gibt es mittlerweile im Multimedia-Bereich ein Modul .... Da ich selber gerade dabei bin, mich in die "Richtung" zu "entwickeln", wo hast Du die Lautsprecher her?
Die von Dir angebotene Lösung benötigt einen iTunes-Rechner (was ich nicht möchte). Dabei wird iTunes als Airplay-Verteiler genutzt. Dann wäre auch die FHEM-Lösung (Modul) für die iTunes-Fernsteuerung zu bevorzugen. Das Problem ist hauptsächlich die Audioausgabe des Pi auf den Airplay-Lautsprecher umzulenken.
Airplay-Lautsprecher habe ich Sony SN-310 (o.ä) die ganz gut sind und eine Philips Fidelio AD7000W. Den kann ich nicht empfehlen (sprich "Finger weg!").
Der Blogschreiber verwendet es so, aber es ist nicht notwendig.
MPD kann WebStreams abspielen
Als "Output" einen WebStream (für AirPlay) definieren
Lautsprecher darauf "binden"
Prinzipiell mit MPD möglich. Eventuell noch mehr Suche bei Google nötig!
iTunes dafür nicht nötig!
@Wernieman:
Danke für die Info. Da ich unter den genannten Stichworten nicht finden konnte, würde ich mich über eine kleine weitere "Stichwortliste" freuen. Der Webstream zum Airplay-Receiver muss dem dacp-Protokoll entsprechen, d.h. es muss theoretisch eine Umwandlung/Anreicherung des Streams erfolgen. D.h. das reine "Durchreichen" des Audio-Streams dürfte nicht ausreichen.
also ...... mpd kann verdammt viel und ist mit plugins erweiterbar. Da ich selber (noch) keine "WebLautsprecher" habe, kann ich Dir nur Tipsm aber keine weitere Hilfe geben.
schau dir mal den post hier an: http://forum.fhem.de/index.php/topic,19173.msg128659.html#msg128659 (http://forum.fhem.de/index.php/topic,19173.msg128659.html#msg128659). ich bin noch nicht dazu gekommen das ins itunes modul mit einzubauen aber wenn dein Lautsprecher wirklich direkt airplay kann dann solltest du hiermit direkt einen internet stream hin schicken können.
gruss
andre
Hallo Andre,
das sieht ja sehr vielversprechend aus. Wäre genau, was ich brauche. Wird wohl heute Abend wieder etwas später.....
Vielen Dank an Alle. Werde berichten, ob es funktioniert....
Hallo,
ein wenig getestet, allerdings funktioniert es nicht. Aber neue Erkenntnisse für mich:
- Unterschied zwischen Airplay (Photo/Video) und RAOP/RTSP (Audio)
- Es gibt wohl tatsächlich eine mpd-Version mit raop-output-modul (anscheinend nicht die aktuelle produktive raspian-version)
Weiter gehts ...
Halt uns bitte auf dem laufenden!
Interessiere mich auch sehr für das Thema da einige Lautsprecher schon vorhanden sind :)
lg
Perheaps xmms2 and xmms2-plugin-airplay is a direction to look at ?
Did not test it but has interesting features (CLI, output to airplay)
Hallo,
habe jetzt mal http://hfujita.github.io/pulseaudio-raop2/ ausprobiert. Fertig kompiliert, Ausgabegeräte werden erkannt, kann mit SoX eine Ausgabe starten, dann bricht Pulseaudio mit einem Fehler ab.
Werde mir dann als nächstes XMMS2 anschauen...
Es geht weiter.
Okay cool!
Bleib dran :)
Lg
Zwischenstand: XMMS2 unterstützt nur das "alte" Airtunes für alte Airport Express.
Das vielversprechenste ist noch immer pulseaudio mit neustem airplay-plugin. Dazu habe ich noch kein Supportforum gefunden. Muss den Entwickler mal direkt anmailen.
Apple airplay verwendet udp, pa raop TCP
@drdownload:
Die von mir genannte Version von pulseaudio unterstützt dann auch raop/Airtunes via udp. Raop ist wohl nichts anderes als ein verpacktes RTSP. Und meine Lautsprecher sind wohl nur via udp ansprechbar.
ah, sorry am smartphone folge ich nicht allen links.
So, endlich ein erster Erfolg:
Mit https://www.npmjs.org/package/airtunes konnte ich endlich ein mp3-File auf einem vorgegebenen Airplay-Lautsprecher ausgeben (node play_ffmpeg.js --host 192.168.x.x --port 1195 --volume 30 --ffmpeg "/usr/bin/ffmpeg" --file test.mp3).
Problem ist die dynamische Änderung des Ports meiner Airplay-Lautsprecher. Der voreingestellte Port gilt nur für Apple-TV und Apple Airport Express. Für meine Airplay-LS musste ich via avahi-browser erst mal manuell den Port ermitteln.
Fazit: Damit geht es erst mal weiter. Die Möglichkeiten damit sind für meine Ansprüche mehr als ausreichend und es kann über CLI gesteuert werden.
Nächster Schritt: Ermitteln des aktuellen Ports der jeweiligen Airplay-Lautsprecher.
TOP :D
Dann schreibst du noch ein nettes Plugin für FHEM ? (:
Nachdem die Ausgabe via FFMPEG und Airtunes2 (node.js) auf einen ausgewählten Airplay-Lautsprecher läuft, stellen sich zwei Probleme (die ich bis jetzt leider noch nicht lösen konnte):
1. Wie kann ich in FHEM ein Array aus einem Perl-Script (Die Abfrage der im Netzwerk befindlichen Airplay-Speaker geht über AnyEvent. Darüber erhalte ich hosts und Ports.) zur Auswahl stellen und den ausgewählten host und port zwei Dummies zuordnen?
2. FFMPEG kann nicht mit m3u-Listen aus einem http-Stream umgehen. Ich muss diesen Stream aber in ein Airplay-Konformes Format umwandeln (PCM 44,1khz usw). Zu guter letzt benötige ich für das Streamen zu den Airplay-Speakern den umgewandelten Stream in einer Pipe, damit Airtunes2 (node.js) den Stream an die Airplay-Lautsprecher senden kann.
Vielleicht liest hier jemand mit, der Hilfestellung leisten kann.
Weiter geht's:
Punkt 2 des obigen Eintrags ist gelöst. Ich nutze jetzt mpg123 -@ http://.../test.m3u -s --stereo -r 44100 -q und leite das über StandartOut an Airtunes2 (node.js). Folgend das play_mpg123.js (angepasste Version eines Beispiels von airtunes2 (play_ffmpeg.js). Node.js ist bei mir unter /opt/node installiert.
var airtunes = require('/opt/node/lib/node_modules/airtunes'),
spawn = require('child_process').spawn,
argv = require('/opt/node/lib/node_modules/airtunes/node_modules/optimist')
.usage('Usage: $0 --host [host] --port [num] --mpg123 [path] --file [path] --volume [num] --password [string]')
.default('port', 5000)
.default('volume', 20)
.default('mpg123', '/usr/bin/mpg123')
.default('file', 'http://metafiles.gl-systemhaus.de/hr/hr3_2.m3u')
.demand(['host'])
.argv;
console.log('adding device: ' + argv.host + ':' + argv.port);
var device = airtunes.add(argv.host, argv);
// when the device is online, spawn mpg123 to transcode the file
device.on('status', function(status) {
console.log('status: ' + status);
if(status !== 'ready')
return;
var mpg123 = spawn(argv.mpg123, [
'-@', argv.file, // Eingabefile/Stream
'-q', // Quiet
'-s', //StandardOut
'-r', '44100', // Sampling 44100 kHz
'--stereo' // Stereo
]);
// pipe data to AirTunes
mpg123.stdout.pipe(airtunes);
// detect if mpg123 was not spawned correctly
mpg123.stderr.setEncoding('utf8');
mpg123.stderr.on('data', function(data) {
if(/^execvp\(\)/.test(data)) {
console.log('failed to start ' + argv.mpg123);
process.exit(1);
}
});
});
// monitor buffer events
airtunes.on('buffer', function(status) {
console.log('buffer ' + status);
// after the playback ends, give some time to AirTunes devices
if(status === 'end') {
console.log('playback ended, waiting for AirTunes devices');
setTimeout(function() {
airtunes.stopAll(function() {
console.log('end');
process.exit();
});
}, 2000);
}
});
Mit installiertem Perl-Modul AnyEvent erhält man mit folgendem Perlskript alle Airplay-Empfänger im Netzwerk
use AnyEvent::mDNS;
my $cv = AnyEvent->condvar;
AnyEvent::mDNS::discover '_raop._tcp', $cv;
my @services = $cv->recv;
for my $service(@services) {
print "Found $service->{name} ($service->{proto}) running on $service->{host}:$service->{port}\n";
}
Für die Steuerung der Streamausgabe braucht's noch ein paar Wrapper für node.js zur Lautstärkenkontrolle und Stop/Play.
any news ?
Hi,
das Thema hat sich für mich zerschlagen, da ich FHEM jetzt auf einem MacMini unter Mac OS X betreibe...
Viele Grüße
LuckyLuis