From 831df62fa716a33f8298d9ec8f0a56854e2044c1 Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Sat, 5 May 2018 08:44:18 +0000 Subject: [PATCH] 49_SSCam: V4.1.0, support Audiostream cams, minor internal changes git-svn-id: https://svn.fhem.de/fhem/trunk@16690 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/49_SSCam.pm | 315 +++++++++++++++++++++++++++++------------- 2 files changed, 222 insertions(+), 94 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 3e8b2a40e..a33c3148d 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 49_SSCam: V4.1.0, support Audiostream cams, minor internal changes - change: 93_Log2Syslog: ssldebug for debugging SSL messages, minor fixes - feature: 49_SSCam: V3.10.0, CreateStreamDev added, new lastrec_fw_MJPEG, lastrec_fw_MPEG4/H.264 playback MPEG4/H.264 recordings diff --git a/fhem/FHEM/49_SSCam.pm b/fhem/FHEM/49_SSCam.pm index bea0c6cb5..08917834f 100644 --- a/fhem/FHEM/49_SSCam.pm +++ b/fhem/FHEM/49_SSCam.pm @@ -27,6 +27,9 @@ ######################################################################################################################### # Versions History: # +# 4.1.0 05.05.2018 use SYNO.SurveillanceStation.VideoStream instead of SYNO.SurveillanceStation.VideoStreaming +# preparation for hls +# 4.0.0 01.05.2018 AudioStream possibility added # 3.10.0 24.04.2018 CreateStreamDev added, new features lastrec_fw_MJPEG, lastrec_fw_MPEG4/H.264 added to # playback MPEG4/H.264 videos # 3.9.2 21.04.2018 minor fixes @@ -222,7 +225,7 @@ use Time::HiRes; use HttpUtils; # no if $] >= 5.017011, warnings => 'experimental'; -my $SSCamVersion = "3.10.0"; +my $SSCamVersion = "4.1.0"; # Aufbau Errorcode-Hashes (siehe Surveillance Station Web API) my %SSCam_errauthlist = ( @@ -352,10 +355,12 @@ sub SSCam_Define($@) { $hash->{HELPER}{APIPTZ} = "SYNO.SurveillanceStation.PTZ"; $hash->{HELPER}{APIPRESET} = "SYNO.SurveillanceStation.PTZ.Preset"; $hash->{HELPER}{APICAMEVENT} = "SYNO.SurveillanceStation.Camera.Event"; - $hash->{HELPER}{APIVIDEOSTM} = "SYNO.SurveillanceStation.VideoStreaming"; # wird verwendet in Response von "SYNO.SurveillanceStation.Camera: GetLiveViewPath" + $hash->{HELPER}{APIVIDEOSTM} = "SYNO.SurveillanceStation.VideoStreaming"; # wird verwendet in Response von "SYNO.SurveillanceStation.Camera: GetLiveViewPath" -> StreamKey-Methode $hash->{HELPER}{APISTM} = "SYNO.SurveillanceStation.Streaming"; # This API provides methods to get Live View or Event video stream $hash->{HELPER}{APIHM} = "SYNO.SurveillanceStation.HomeMode"; $hash->{HELPER}{APILOG} = "SYNO.SurveillanceStation.Log"; + $hash->{HELPER}{APIAUDIOSTM} = "SYNO.SurveillanceStation.AudioStream"; # Audiostream mit SID + $hash->{HELPER}{APIVIDEOSTMS} = "SYNO.SurveillanceStation.VideoStream"; # Videostream mit SID # Startwerte setzen if(SSCam_IsModelCam($hash)) { @@ -910,6 +915,11 @@ sub SSCam_Set($@) { $hash->{HELPER}{WLTYPE} = "image"; $hash->{HELPER}{ALIAS} = " "; $hash->{HELPER}{RUNVIEW} = "live_fw"; + } elsif ($prop eq "live_fw_hls") { + $hash->{HELPER}{OPENWINDOW} = 0; + $hash->{HELPER}{WLTYPE} = "video"; + $hash->{HELPER}{ALIAS} = " "; + $hash->{HELPER}{RUNVIEW} = "live_fw_hls"; } elsif ($prop eq "lastsnap_fw") { $hash->{HELPER}{OPENWINDOW} = 0; $hash->{HELPER}{WLTYPE} = "base64img"; @@ -1117,19 +1127,34 @@ sub SSCam_FWsummaryFn ($$$$) { my $ret; my $alias; - return if(!$hash->{HELPER}{LINK} || ReadingsVal("$name", "state", "") =~ /^dis.*/ || IsDisabled($name)); + return if(!$hash->{HELPER}{LINK} || ReadingsVal($d, "state", "") =~ /^dis.*/ || IsDisabled($name)); my $attr = AttrVal($d, "htmlattr", " "); - Log3($name, 4, "$name - SSCam_FWsummaryFn called - FW_wname: $FW_wname, device: $d, room: $room, attributes: $attr"); + Log3($name, 4, "$name - SSCam_FWsummaryFn called - FW_wname: $FW_wname, device: $d, room: $room, attributes: $attr, FwDetail: ".weblink_FwDetail($d)); if($wltype eq "image") { $ret = "
".weblink_FwDetail($d); + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($d, "CamAudioType", "Unknown") !~ /Unknown/) { + $ret .= "".weblink_FwDetail($d); + } } elsif($wltype eq "iframe") { $ret = "".weblink_FwDetail($d); + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($d, "CamAudioType", "Unknown") !~ /Unknown/) { + $ret .= "".weblink_FwDetail($d); + } } elsif($wltype eq "embed") { $ret = "".weblink_FwDetail($d); + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($d, "CamAudioType", "Unknown") !~ /Unknown/) { + $ret .= "".weblink_FwDetail($d); + } } elsif($wltype eq "link") { $alias = $hash->{HELPER}{ALIAS}; @@ -1145,7 +1170,12 @@ sub SSCam_FWsummaryFn ($$$$) { Your browser does not support the video tag. - ".weblink_FwDetail($d); + ".weblink_FwDetail($d); + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($d, "CamAudioType", "Unknown") !~ /Unknown/) { + $ret .= "".weblink_FwDetail($d); + } } #FW_directNotify("FILTER=room=$room", "#FHEMWEB:$FW_wname", "location.reload('true')", "") if($d eq $name); return $ret; @@ -2005,6 +2035,7 @@ sub SSCam_stopliveview ($) { # Link aus Helper-hash löschen delete $hash->{HELPER}{LINK}; + delete $hash->{HELPER}{AUDIOLINK}; # Reading LiveStreamUrl löschen delete($defs{$name}{READINGS}{LiveStreamUrl}) if ($defs{$name}{READINGS}{LiveStreamUrl}); @@ -2750,6 +2781,8 @@ sub SSCam_getapisites($) { my $apicamevent = $hash->{HELPER}{APICAMEVENT}; my $apievent = $hash->{HELPER}{APIEVENT}; my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; + my $apiaudiostm = $hash->{HELPER}{APIAUDIOSTM}; + my $apivideostms = $hash->{HELPER}{APIVIDEOSTMS}; my $apistm = $hash->{HELPER}{APISTM}; my $apihm = $hash->{HELPER}{APIHM}; my $apilog = $hash->{HELPER}{APILOG}; @@ -2772,7 +2805,7 @@ sub SSCam_getapisites($) { Log3($name, 5, "$name - HTTP-Call will be done with httptimeout-Value: $httptimeout s"); # URL zur Abfrage der Eigenschaften der API's - $url = "http://$serveraddr:$serverport/webapi/query.cgi?api=$apiinfo&method=Query&version=1&query=$apiauth,$apiextrec,$apicam,$apitakesnap,$apiptz,$apipreset,$apisvsinfo,$apicamevent,$apievent,$apivideostm,$apiextevt,$apistm,$apihm,$apilog"; + $url = "http://$serveraddr:$serverport/webapi/query.cgi?api=$apiinfo&method=Query&version=1&query=$apiauth,$apiextrec,$apicam,$apitakesnap,$apiptz,$apipreset,$apisvsinfo,$apicamevent,$apievent,$apivideostm,$apiextevt,$apistm,$apihm,$apilog,$apiaudiostm,$apivideostms"; Log3($name, 4, "$name - Call-Out now: $url"); @@ -2807,6 +2840,8 @@ sub SSCam_getapisites_parse ($) { my $apicamevent = $hash->{HELPER}{APICAMEVENT}; my $apievent = $hash->{HELPER}{APIEVENT}; my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; + my $apiaudiostm = $hash->{HELPER}{APIAUDIOSTM}; + my $apivideostms = $hash->{HELPER}{APIVIDEOSTMS}; my $apistm = $hash->{HELPER}{APISTM}; my $apihm = $hash->{HELPER}{APIHM}; my $apilog = $hash->{HELPER}{APILOG}; @@ -2990,6 +3025,25 @@ sub SSCam_getapisites_parse ($) { $logstr = defined($apilogmaxver) ? "MaxVersion of $apilog selected: $apilogmaxver" : "MaxVersion of $apilog undefined - Surveillance Station may be stopped"; Log3($name, 4, "$name - $logstr"); + # Pfad und Maxversion von "SYNO.SurveillanceStation.AudioStream" ermitteln + my $apiaudiostmpath = $data->{'data'}->{$apiaudiostm}->{'path'}; + $apiaudiostmpath =~ tr/_//d if (defined($apiaudiostmpath)); + my $apiaudiostmmaxver = $data->{'data'}->{$apiaudiostm}->{'maxVersion'}; + + $logstr = defined($apiaudiostmpath) ? "Path of $apiaudiostm selected: $apiaudiostmpath" : "Path of $apiaudiostm undefined - Surveillance Station may be stopped"; + Log3($name, 4, "$name - $logstr"); + $logstr = defined($apiaudiostmmaxver) ? "MaxVersion of $apiaudiostm selected: $apiaudiostmmaxver" : "MaxVersion of $apiaudiostm undefined - Surveillance Station may be stopped"; + Log3($name, 4, "$name - $logstr"); + + # Pfad und Maxversion von "SYNO.SurveillanceStation.VideoStream" ermitteln + my $apivideostmspath = $data->{'data'}->{$apivideostms}->{'path'}; + $apivideostmspath =~ tr/_//d if (defined($apivideostmspath)); + my $apivideostmsmaxver = $data->{'data'}->{$apivideostms}->{'maxVersion'}; + + $logstr = defined($apivideostmspath) ? "Path of $apivideostms selected: $apivideostmspath" : "Path of $apivideostms undefined - Surveillance Station may be stopped"; + Log3($name, 4, "$name - $logstr"); + $logstr = defined($apivideostmsmaxver) ? "MaxVersion of $apivideostms selected: $apivideostmsmaxver" : "MaxVersion of $apivideostms undefined - Surveillance Station may be stopped"; + Log3($name, 4, "$name - $logstr"); # aktuelle oder simulierte SVS-Version für Fallentscheidung setzen no warnings 'uninitialized'; @@ -3063,34 +3117,39 @@ sub SSCam_getapisites_parse ($) { Log3($name, 4, "$name - ------- End of simulation section -------"); # ermittelte Werte in $hash einfügen - $hash->{HELPER}{APIAUTHPATH} = $apiauthpath; - $hash->{HELPER}{APIAUTHMAXVER} = $apiauthmaxver; - $hash->{HELPER}{APIEXTRECPATH} = $apiextrecpath; - $hash->{HELPER}{APIEXTRECMAXVER} = $apiextrecmaxver; - $hash->{HELPER}{APICAMPATH} = $apicampath; - $hash->{HELPER}{APICAMMAXVER} = $apicammaxver; - $hash->{HELPER}{APITAKESNAPPATH} = $apitakesnappath; - $hash->{HELPER}{APITAKESNAPMAXVER} = $apitakesnapmaxver; - $hash->{HELPER}{APIPTZPATH} = $apiptzpath; - $hash->{HELPER}{APIPTZMAXVER} = $apiptzmaxver; - $hash->{HELPER}{APIPRESETPATH} = $apipresetpath; - $hash->{HELPER}{APIPRESETMAXVER} = $apipresetmaxver; - $hash->{HELPER}{APISVSINFOPATH} = $apisvsinfopath; - $hash->{HELPER}{APISVSINFOMAXVER} = $apisvsinfomaxver; - $hash->{HELPER}{APICAMEVENTPATH} = $apicameventpath; - $hash->{HELPER}{APICAMEVENTMAXVER} = $apicameventmaxver; - $hash->{HELPER}{APIEVENTPATH} = $apieventpath; - $hash->{HELPER}{APIEVENTMAXVER} = $apieventmaxver; - $hash->{HELPER}{APIVIDEOSTMPATH} = $apivideostmpath; - $hash->{HELPER}{APIVIDEOSTMMAXVER} = $apivideostmmaxver; - $hash->{HELPER}{APIEXTEVTPATH} = $apiextevtpath; - $hash->{HELPER}{APIEXTEVTMAXVER} = $apiextevtmaxver; - $hash->{HELPER}{APISTMPATH} = $apistmpath; - $hash->{HELPER}{APISTMMAXVER} = $apistmmaxver; - $hash->{HELPER}{APIHMPATH} = $apihmpath; - $hash->{HELPER}{APIHMMAXVER} = $apihmmaxver; - $hash->{HELPER}{APILOGPATH} = $apilogpath; - $hash->{HELPER}{APILOGMAXVER} = $apilogmaxver; + $hash->{HELPER}{APIAUTHPATH} = $apiauthpath; + $hash->{HELPER}{APIAUTHMAXVER} = $apiauthmaxver; + $hash->{HELPER}{APIEXTRECPATH} = $apiextrecpath; + $hash->{HELPER}{APIEXTRECMAXVER} = $apiextrecmaxver; + $hash->{HELPER}{APICAMPATH} = $apicampath; + $hash->{HELPER}{APICAMMAXVER} = $apicammaxver; + $hash->{HELPER}{APITAKESNAPPATH} = $apitakesnappath; + $hash->{HELPER}{APITAKESNAPMAXVER} = $apitakesnapmaxver; + $hash->{HELPER}{APIPTZPATH} = $apiptzpath; + $hash->{HELPER}{APIPTZMAXVER} = $apiptzmaxver; + $hash->{HELPER}{APIPRESETPATH} = $apipresetpath; + $hash->{HELPER}{APIPRESETMAXVER} = $apipresetmaxver; + $hash->{HELPER}{APISVSINFOPATH} = $apisvsinfopath; + $hash->{HELPER}{APISVSINFOMAXVER} = $apisvsinfomaxver; + $hash->{HELPER}{APICAMEVENTPATH} = $apicameventpath; + $hash->{HELPER}{APICAMEVENTMAXVER} = $apicameventmaxver; + $hash->{HELPER}{APIEVENTPATH} = $apieventpath; + $hash->{HELPER}{APIEVENTMAXVER} = $apieventmaxver; + $hash->{HELPER}{APIVIDEOSTMPATH} = $apivideostmpath; + $hash->{HELPER}{APIVIDEOSTMMAXVER} = $apivideostmmaxver; + $hash->{HELPER}{APIAUDIOSTMPATH} = $apiaudiostmpath; + $hash->{HELPER}{APIAUDIOSTMMAXVER} = $apiaudiostmmaxver; + $hash->{HELPER}{APIEXTEVTPATH} = $apiextevtpath; + $hash->{HELPER}{APIEXTEVTMAXVER} = $apiextevtmaxver; + $hash->{HELPER}{APISTMPATH} = $apistmpath; + $hash->{HELPER}{APISTMMAXVER} = $apistmmaxver; + $hash->{HELPER}{APIHMPATH} = $apihmpath; + $hash->{HELPER}{APIHMMAXVER} = $apihmmaxver; + $hash->{HELPER}{APILOGPATH} = $apilogpath; + $hash->{HELPER}{APILOGMAXVER} = $apilogmaxver; + $hash->{HELPER}{APIVIDEOSTMSPATH} = $apivideostmspath; + $hash->{HELPER}{APIVIDEOSTMSMAXVER} = $apivideostmsmaxver; + readingsBeginUpdate($hash); readingsBulkUpdate($hash,"Errorcode","none"); @@ -3324,51 +3383,57 @@ return SSCam_camop($hash); ############################################################################################# sub SSCam_camop ($) { my ($hash) = @_; - my $name = $hash->{NAME}; - my $serveraddr = $hash->{SERVERADDR}; - my $serverport = $hash->{SERVERPORT}; - my $apicam = $hash->{HELPER}{APICAM}; - my $apicampath = $hash->{HELPER}{APICAMPATH}; - my $apicammaxver = $hash->{HELPER}{APICAMMAXVER}; - my $apiextrec = $hash->{HELPER}{APIEXTREC}; - my $apiextrecpath = $hash->{HELPER}{APIEXTRECPATH}; - my $apiextrecmaxver = $hash->{HELPER}{APIEXTRECMAXVER}; - my $apiextevt = $hash->{HELPER}{APIEXTEVT}; - my $apiextevtpath = $hash->{HELPER}{APIEXTEVTPATH}; - my $apiextevtmaxver = $hash->{HELPER}{APIEXTEVTMAXVER}; - my $apitakesnap = $hash->{HELPER}{APISNAPSHOT}; - my $apitakesnappath = $hash->{HELPER}{APITAKESNAPPATH}; - my $apitakesnapmaxver = $hash->{HELPER}{APITAKESNAPMAXVER}; - my $apiptz = $hash->{HELPER}{APIPTZ}; - my $apiptzpath = $hash->{HELPER}{APIPTZPATH}; - my $apiptzmaxver = $hash->{HELPER}{APIPTZMAXVER}; - my $apipreset = $hash->{HELPER}{APIPRESET}; - my $apipresetpath = $hash->{HELPER}{APIPRESETPATH}; - my $apipresetmaxver = $hash->{HELPER}{APIPRESETMAXVER}; - my $apisvsinfo = $hash->{HELPER}{APISVSINFO}; - my $apisvsinfopath = $hash->{HELPER}{APISVSINFOPATH}; - my $apisvsinfomaxver = $hash->{HELPER}{APISVSINFOMAXVER}; - my $apicamevent = $hash->{HELPER}{APICAMEVENT}; - my $apicameventpath = $hash->{HELPER}{APICAMEVENTPATH}; - my $apicameventmaxver = $hash->{HELPER}{APICAMEVENTMAXVER}; - my $apievent = $hash->{HELPER}{APIEVENT}; - my $apieventpath = $hash->{HELPER}{APIEVENTPATH}; - my $apieventmaxver = $hash->{HELPER}{APIEVENTMAXVER}; - my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; - my $apivideostmpath = $hash->{HELPER}{APIVIDEOSTMPATH}; - my $apivideostmmaxver = $hash->{HELPER}{APIVIDEOSTMMAXVER}; - my $apistm = $hash->{HELPER}{APISTM}; - my $apistmpath = $hash->{HELPER}{APISTMPATH}; - my $apistmmaxver = $hash->{HELPER}{APISTMMAXVER}; - my $apihm = $hash->{HELPER}{APIHM}; - my $apihmpath = $hash->{HELPER}{APIHMPATH}; - my $apihmmaxver = $hash->{HELPER}{APIHMMAXVER}; - my $apilog = $hash->{HELPER}{APILOG}; - my $apilogpath = $hash->{HELPER}{APILOGPATH}; - my $apilogmaxver = $hash->{HELPER}{APILOGMAXVER}; - my $sid = $hash->{HELPER}{SID}; - my $OpMode = $hash->{OPMODE}; - my $camid = $hash->{CAMID}; + my $name = $hash->{NAME}; + my $serveraddr = $hash->{SERVERADDR}; + my $serverport = $hash->{SERVERPORT}; + my $apicam = $hash->{HELPER}{APICAM}; + my $apicampath = $hash->{HELPER}{APICAMPATH}; + my $apicammaxver = $hash->{HELPER}{APICAMMAXVER}; + my $apiextrec = $hash->{HELPER}{APIEXTREC}; + my $apiextrecpath = $hash->{HELPER}{APIEXTRECPATH}; + my $apiextrecmaxver = $hash->{HELPER}{APIEXTRECMAXVER}; + my $apiextevt = $hash->{HELPER}{APIEXTEVT}; + my $apiextevtpath = $hash->{HELPER}{APIEXTEVTPATH}; + my $apiextevtmaxver = $hash->{HELPER}{APIEXTEVTMAXVER}; + my $apitakesnap = $hash->{HELPER}{APISNAPSHOT}; + my $apitakesnappath = $hash->{HELPER}{APITAKESNAPPATH}; + my $apitakesnapmaxver = $hash->{HELPER}{APITAKESNAPMAXVER}; + my $apiptz = $hash->{HELPER}{APIPTZ}; + my $apiptzpath = $hash->{HELPER}{APIPTZPATH}; + my $apiptzmaxver = $hash->{HELPER}{APIPTZMAXVER}; + my $apipreset = $hash->{HELPER}{APIPRESET}; + my $apipresetpath = $hash->{HELPER}{APIPRESETPATH}; + my $apipresetmaxver = $hash->{HELPER}{APIPRESETMAXVER}; + my $apisvsinfo = $hash->{HELPER}{APISVSINFO}; + my $apisvsinfopath = $hash->{HELPER}{APISVSINFOPATH}; + my $apisvsinfomaxver = $hash->{HELPER}{APISVSINFOMAXVER}; + my $apicamevent = $hash->{HELPER}{APICAMEVENT}; + my $apicameventpath = $hash->{HELPER}{APICAMEVENTPATH}; + my $apicameventmaxver = $hash->{HELPER}{APICAMEVENTMAXVER}; + my $apievent = $hash->{HELPER}{APIEVENT}; + my $apieventpath = $hash->{HELPER}{APIEVENTPATH}; + my $apieventmaxver = $hash->{HELPER}{APIEVENTMAXVER}; + my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; + my $apivideostmpath = $hash->{HELPER}{APIVIDEOSTMPATH}; + my $apivideostmmaxver = $hash->{HELPER}{APIVIDEOSTMMAXVER}; + my $apiaudiostm = $hash->{HELPER}{APIAUDIOSTM}; + my $apiaudiostmpath = $hash->{HELPER}{APIAUDIOSTMPATH}; + my $apiaudiostmmaxver = $hash->{HELPER}{APIAUDIOSTMMAXVER}; + my $apistm = $hash->{HELPER}{APISTM}; + my $apistmpath = $hash->{HELPER}{APISTMPATH}; + my $apistmmaxver = $hash->{HELPER}{APISTMMAXVER}; + my $apihm = $hash->{HELPER}{APIHM}; + my $apihmpath = $hash->{HELPER}{APIHMPATH}; + my $apihmmaxver = $hash->{HELPER}{APIHMMAXVER}; + my $apilog = $hash->{HELPER}{APILOG}; + my $apilogpath = $hash->{HELPER}{APILOGPATH}; + my $apilogmaxver = $hash->{HELPER}{APILOGMAXVER}; + my $apivideostms = $hash->{HELPER}{APIVIDEOSTMS}; + my $apivideostmspath = $hash->{HELPER}{APIVIDEOSTMSPATH}; + my $apivideostmsmaxver = $hash->{HELPER}{APIVIDEOSTMSMAXVER}; + my $sid = $hash->{HELPER}{SID}; + my $OpMode = $hash->{OPMODE}; + my $camid = $hash->{CAMID}; my ($livestream,$winname,$attr,$room,$param); my ($url,$snapid,$httptimeout,$expmode,$motdetsc); @@ -3628,19 +3693,22 @@ sub SSCam_camop ($) { $url = "http://$serveraddr:$serverport/webapi/$apiextevtpath?api=$apiextevt&version=$apiextevtmaxver&method=Trigger&eventId=$hash->{HELPER}{EVENTID}&eventName=$hash->{HELPER}{EVENTID}&_sid=\"$sid\""; } elsif ($OpMode eq "runliveview" && $hash->{HELPER}{RUNVIEW} !~ /snap/) { - if ($hash->{HELPER}{RUNVIEW} =~ m/live/) { + if ($hash->{HELPER}{RUNVIEW} =~ m/^live_.*hls$/) { + $url = "http://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=hls&_sid=$sid"; + } elsif ($hash->{HELPER}{RUNVIEW} =~ m/live/) { + $hash->{HELPER}{AUDIOLINK} = "http://$serveraddr:$serverport/webapi/$apiaudiostmpath?api=$apiaudiostm&version=$apiaudiostmmaxver&method=Stream&cameraId=$camid&_sid=$sid"; # externe URL $livestream = AttrVal($name, "livestreamprefix", "http://$serveraddr:$serverport"); - $livestream .= "/webapi/$apivideostmpath?api=$apivideostm&version=$apivideostmmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=\"$sid\""; + $livestream .= "/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; readingsSingleUpdate($hash,"LiveStreamUrl", $livestream, 1) if(AttrVal($name, "showStmInfoFull", undef)); # interne URL - $url = "http://$serveraddr:$serverport/webapi/$apivideostmpath?api=$apivideostm&version=$apivideostmmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=\"$sid\""; + $url = "http://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; } else { # Abspielen der letzten Aufnahme (EventId) $url = "http://$serveraddr:$serverport/webapi/$apistmpath?api=$apistm&version=$apistmmaxver&method=EventStream&eventId=$hash->{HELPER}{CAMLASTRECID}×tamp=1&_sid=$sid"; } - # Liveview-Link in Hash speichern -> Anzeige über SSCam_FWsummaryFn, in Reading setzen für Linkversand + # Liveview-Link in Hash speichern $hash->{HELPER}{LINK} = $url; Log3($name, 4, "$name - Set Streaming-URL: $url"); @@ -4449,12 +4517,28 @@ sub SSCam_camop_parse ($) { } elsif ($exposurecontrol == 6) { $exposurecontrol = "Unknown"; } + + my $camaudiotype = SSCam_jboolmap($data->{'data'}->{'cameras'}->[0]->{'detailInfo'}{'camAudioType'}); + if ($camaudiotype == 0) { + $camaudiotype = "Unknown"; + } elsif ($camaudiotype == 1) { + $camaudiotype = "PCM"; + } elsif ($camaudiotype == 2) { + $camaudiotype = "G711"; + } elsif ($camaudiotype == 3) { + $camaudiotype = "G726"; + } elsif ($camaudiotype == 4) { + $camaudiotype = "AAC"; + } elsif ($camaudiotype == 5) { + $camaudiotype = "AMR"; + } $data->{'data'}->{'cameras'}->[0]->{'video_flip'} = SSCam_jboolmap($data->{'data'}->{'cameras'}->[0]->{'video_flip'}); $data->{'data'}->{'cameras'}->[0]->{'video_mirror'} = SSCam_jboolmap($data->{'data'}->{'cameras'}->[0]->{'video_mirror'}); $data->{'data'}->{'cameras'}->[0]->{'blPresetSpeed'} = SSCam_jboolmap($data->{'data'}->{'cameras'}->[0]->{'blPresetSpeed'}); readingsBeginUpdate($hash); + readingsBulkUpdate($hash,"CamAudioType",$camaudiotype); readingsBulkUpdate($hash,"CamLiveMode",$camLiveMode); readingsBulkUpdate($hash,"CamExposureMode",$exposuremode); readingsBulkUpdate($hash,"CamExposureControl",$exposurecontrol); @@ -4464,6 +4548,7 @@ sub SSCam_camop_parse ($) { readingsBulkUpdate($hash,"CamIP",$data->{'data'}->{'cameras'}->[0]->{'host'}); readingsBulkUpdate($hash,"CamNTPServer",$data->{'data'}->{'cameras'}->[0]->{'time_server'}) if($data->{'data'}->{'cameras'}->[0]->{'time_server'}); readingsBulkUpdate($hash,"CamVendor",$data->{'data'}->{'cameras'}->[0]->{'detailInfo'}{'camVendor'}); + readingsBulkUpdate($hash,"CamVideoType",$data->{'data'}->{'cameras'}->[0]->{'camVideoType'}); readingsBulkUpdate($hash,"CamPreRecTime",$data->{'data'}->{'cameras'}->[0]->{'detailInfo'}{'camPreRecTime'}); readingsBulkUpdate($hash,"CamPort",$data->{'data'}->{'cameras'}->[0]->{'port'}); readingsBulkUpdate($hash,"CamPtSpeed",$data->{'data'}->{'cameras'}->[0]->{'ptSpeed'}); @@ -5336,15 +5421,22 @@ return; ###################################################################################### sub SSCam_StreamDev($$$) { my ($camname,$livdev,$fmt) = @_; - my $hash = $defs{$camname}; - my $wltype = $hash->{HELPER}{WLTYPE}; - my $serveraddr = $hash->{SERVERADDR}; - my $serverport = $hash->{SERVERPORT}; - my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; - my $apivideostmpath = $hash->{HELPER}{APIVIDEOSTMPATH}; - my $apivideostmmaxver = $hash->{HELPER}{APIVIDEOSTMMAXVER}; - my $camid = $hash->{CAMID}; - my ($cause,$ret,$link,$devWlink,$wlhash,$alias,$wlalias); + my $hash = $defs{$camname}; + my $wltype = $hash->{HELPER}{WLTYPE}; + my $serveraddr = $hash->{SERVERADDR}; + my $serverport = $hash->{SERVERPORT}; + my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; + my $apivideostmpath = $hash->{HELPER}{APIVIDEOSTMPATH}; + my $apivideostmmaxver = $hash->{HELPER}{APIVIDEOSTMMAXVER}; + my $apiaudiostm = $hash->{HELPER}{APIAUDIOSTM}; + my $apiaudiostmpath = $hash->{HELPER}{APIAUDIOSTMPATH}; + my $apiaudiostmmaxver = $hash->{HELPER}{APIAUDIOSTMMAXVER}; + my $apivideostms = $hash->{HELPER}{APIVIDEOSTMS}; + my $apivideostmspath = $hash->{HELPER}{APIVIDEOSTMSPATH}; + my $apivideostmsmaxver = $hash->{HELPER}{APIVIDEOSTMSMAXVER}; + my $camid = $hash->{CAMID}; + my $sid = $hash->{HELPER}{SID}; + my ($cause,$ret,$link,$audiolink,$devWlink,$wlhash,$alias,$wlalias); my $ha = AttrVal($camname, "htmlattr", 'width="500" height="325"'); my $StmKey = ReadingsVal($camname,"StmKey",undef); @@ -5373,16 +5465,40 @@ sub SSCam_StreamDev($$$) { } if($fmt =~ /mjpeg/) { - $link = "http://$serveraddr:$serverport/webapi/$apivideostmpath?api=$apivideostm&version=$apivideostmmaxver&method=Stream&format=mjpeg&cameraId=$camid&StmKey=\"$StmKey\""; - $ret .= " "; + # $link = "http://$serveraddr:$serverport/webapi/$apivideostmpath?api=$apivideostm&version=$apivideostmmaxver&method=Stream&format=mjpeg&cameraId=$camid&StmKey=\"$StmKey\""; + $link = "http://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; + $audiolink = "http://$serveraddr:$serverport/webapi/$apiaudiostmpath?api=$apiaudiostm&version=$apiaudiostmmaxver&method=Stream&cameraId=$camid&_sid=$sid"; + $ret .= " "; + $ret .= ''; + if($audiolink && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/) { + $ret .= ''; + $ret .= ""; + $ret .= ''; + } } elsif($fmt =~ /switched/) { my $wltype = $hash->{HELPER}{WLTYPE}; $link = $hash->{HELPER}{LINK}; if($link && $wltype =~ /image|iframe|video|base64img|embed/) { if($wltype =~ /image/) { $ret .= " "; + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/) { + $ret .= ''; + $ret .= ""; + $ret .= ''; + } } elsif ($wltype =~ /iframe/) { $ret .= ""; + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/) { + $ret .= ''; + $ret .= ""; + $ret .= ''; + } } elsif ($wltype =~ /video/) { $ret .= ""; + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/) { + $ret .= ''; + $ret .= ""; + $ret .= ''; + } } elsif($wltype =~ /base64img/) { $ret .= ""; } elsif($wltype =~ /embed/) { @@ -6641,6 +6764,7 @@ http(s)://<hostname><port>/webapi/entry.cgi?api=SYNO.SurveillanceSta