MPlayer mit FHEM kontrollieren

Begonnen von Prof. Dr. Peter Henning, 12 Januar 2020, 18:50:28

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

Es gibt unter https://metacpan.org/pod/Audio::Play::MPlayer

ein etwas älteres und nicht sonderlich ausgereiftes Modul zur Bedienung des MPlayers. Ich habe damit jetzt mal Spaßeshalber eine Kontrolle durch FHEM umgesetzt - damit kann ich Audiofiles und Sprachnachrichten auch auf einem etwas abseits stehenden Raspberry Pi ausgeben.

Die Lautstärkeregulierung funktioniert noch nicht, bisher habe ich nur die Möglichkeit gefunden, mit einem Skriptaufruf den Alsamixer zu setzen und abzufragen...

Codegfragment:


use Audio::Play::MPlayer;
..
#############################################################################
#
#  event handler for RpiAudio
#
#############################################################################

my $player;
 
sub Rpieventhandler($$){ 
  my ($bid,$event) = @_;
 
  return
    if($event =~ /playinfo.*/);
 
  Log 1,"[Rpieventhandler] called with $bid and event $event";
 
  my ($name90,$zom,$cmd,$src,$srd,$fil,$vol,$volnew,$trk,$ret);

  $vol    = ReadingsVal($bid,"volume",undef);
  $trk    = ReadingsVal($bid,"track","");
 

  if($event =~ /origin (.+)/ ){
    $src = $1;
    #-- normalize source
   if($src =~ /(p|P)laylist/){
      $src = "Playlist";
      $fil = "Playlist.m3u";
    }elsif($src =~ /(w|W)eckmusik/){
      $src = "Weckmusik";
      $fil = "Weckmusik.m3u";
    }elsif($src eq "speech"){
      $fil = "speech.mp3";
    #--- Unknown, but only in case of origin event
    }elsif( $event =~ /origin (.+)/ ){
      $src = $1;
      my $artist = BOSEartists($src);
      if( !$artist ){
        speak("RPI.OG","Ich habe keine Quelle $src gefunden");
        return;
      }
      Log 1,"===========> searching for artist $src, found $artist";
      $src = "Delayed";
      $fil = "Playlist.m3u";
      $srd = "";
    }
    fhem("setreading RpiAudio.DG origin $srd");
   
    #-- play it
    $player = Audio::Play::MPlayer->new;
    if($src eq "speech"){
      ##fhem("set $bid volume 25"); 
      mplay_loadfile($player,$fil);
    }else{
      ##fhem("set $bid volume 25"); 
      mplay_loadlist($player,$fil);
    }
    fhem("set RpiAudio.DG on");
    mplay_poller($player);
   
  }elsif( $event eq "off"){
    mplay_stop($player);
    fhem("set RpiAudio.DG off");
    fhem("setreading RpiAudio.DG playinfo stopped");
  }elsif( $event eq "nextTrack"){
    mplay_forward($player);
  }elsif( $event eq "prevTrack"){
    mplay_back($player);
  }elsif( $event =~ /volume. (\d+)/ ){
    $volnew = $1;
    #amixer set 'Speaker' 115
  }
}

sub mplay_loadlist{
  my ($self,$list) = @_;
  $self->command( qq{loadlist "/home/music/$list"} );
  $self->{state} = 2;
}

sub mplay_loadfile{
  my ($self,$file) = @_;
  $self->command( qq{loadfile "/home/music/$file"} );
  $self->{state} = 2;
}

sub mplay_stop{
  my ($self) = @_;
  $self->command( 'quit' );
  undef $self;
}

sub mplay_forward{
  my ($self) = @_;
  $self->command( qq{pt_step 1} );
}

sub mplay_back{
  my ($self) = @_;
  $self->command( qq{pt_step -1} );
}

sub mplay_poller{
  my ($self) = @_;
  if( defined($self) && (ReadingsVal("RpiAudio.DG","state","") ne "off") ){
    $self->poll(0);
    if( ($self->state != 0) || ($self->title ne "") ){
      my ($trk,$art,$ret194,$ret90);
      $trk = $self->title;
      $art = $self->artist;
      $ret194 = "playing <i>".$trk."</i><br>by <i>".$art."</i>";
      fhem("setreading RpiAudio.DG playinfo $ret194");
      $self->{state} = 2;
      InternalTimer(time()+5, "mplay_poller", $self,0);
    }else{
      Log 1,"state=0";
      mplay_stop($self);
      fhem("set RpiAudio.DG off");
      fhem("setreading RpiAudio.DG playinfo stopped");

    }
  }
}


List des entsprechenden Dummy:
Internals:
   FUUID      5e16246b-f33f-a726-13a8-adb8097e4177243f
   NAME       RpiAudio.DG
   NR         232
   STATE      stopped
   TYPE       dummy
   READINGS:
     2020-01-12 18:40:31   playinfo        stopped
     2020-01-12 18:40:31   state           off
Attributes:
   cmdIcon    on:rc_PLAY off:rc_STOP nextTrack:rc_NEXT prevTrack:rc_PREVIOUS
   group      Sound
   room       Multimedia
   setList    volume:slider,0,1,100 origin:SWR3,Jackie,Peter,Playlist,Weckmusik,speech
   stateFormat playinfo
   userReadings origin:none {}, playinfo:none {}
   webCmd     volume:origin:on:nextTrack:prevTrack:off
   webCmdLabel Volume:Source:x:y:z:

Wzut

mit dem MPD stat MPlayer kannst dich nicht anfreunden ?
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

KölnSolar

MPD kann auch DLNA(gerade gegoogled). Dann lässt er sich ja auch ohne FHEM z.B. m. WindowsMediaplayer steuern oder in der "einfachvariante" mit dem DLNARenderer-Modul.
@Wzut: Hast Du DLNARenderer mal ausprobiert ?
Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Prof. Dr. Peter Henning

Meine Musik liegt auf der NAS, die hat einen Minimserver. Wenn ich die NAS-Musikbibliothek durch einen MPD verwalten ließe, der auf einem RaspberryPi liegt, wäre mir das zuviel Netzwerktraffic.

Auf den Minimserver greife ich sowohl seitens meiner BOSE-Systeme als auch seitens meiner diversen wandhängenden Tablets zu.

Das Ziel war also, auf dem Raspberry Pi einen einigermaßen schlanken Player zu haben, der einzelne Stücke oder ganze Playlists von der NAS abspielen kann. Und das geht direkt mit dem MPlayer wunderbar.

Mit anderen Worten: Für mein Konzept ist mir der MPD zu voluminös - und da die Fernsteuerung des MPlayer mit den oben gezeigten Codefragmenten bestens funktioniert, ist das momentan der Weg meiner Wahl.

Ich werde mal ein Diagramm dazu machen.

LG

pah

Wzut

Zitat von: Prof. Dr. Peter Henning am 13 Januar 2020, 11:01:00
Für mein Konzept ist mir der MPD zu voluminös
--snipp --
Ich werde mal ein Diagramm dazu machen.
Wenn du mit voluminös dessen interne DB mit Verwaltung von Musikstücken und Playlisten meinst :
ist mir auch zu aufwendig und nutze sie auch nicht.
ja male mal vllt. findest sich noch eine andere Lösung, denn mit dem Lautstärke Problem haben sie auch schon im Radiostream Thread gekämpft
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Prof. Dr. Peter Henning

#5
Ich habe eine modifizierte Version des Moduls 98_Medialist gebaut, mit dem ich wunderbar (und auch per FTUI) meine Playlisten auf dem MinimServer erstellen kann. Inzwischen ist das System so weit, dass ich den Sprachbefehl

"Spiele etwas von Bach im Wohnzimmer"

einsetze, um nach dem Künstler "Bach" zu suchen, eine Playlist zu erstellen, diese auf dem MinimServer abzulegen, diesen zum Rescan zu bewegen und meiner BOSe-Anlage zu sagen, es möge diese abspielen...

LG

pah

Edit: Welches war denn der Radiostream-Thread ?

Ich habe hier übrigens ein ziemlich altes Modul mit vielen Fehlern gefunden, das man ggf. modifizieren könnte, um den Alsamixer direkt zu kontrollieren:

http://www.topeg.de/public/perl/modules/audio_alsa_mixer


Wzut

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Prof. Dr. Peter Henning

#7
OK, ich habe dort etwas eingehängt. Das Modul aus dem Link weiter oben musste dringend etwas gesäubert werden. Installiert man das als

/usr/local/share/perl/5.xxx/Audio/Alsa/Mixer.pm

kann man die Beispieldateien prima ausführen. Im Prinzip ist das ein Perl-Wrapper um die Alsamixer-Anwendung - egal, es funktioniert. Werde ich mal in meinen Code zur Ansteuerung von MPlayer einbauen.

LG

pah