Adds janus_enable_audio, a switch to try to enable audio in live stream viewing.
This commit is contained in:
parent
d00aaa11e9
commit
fb832e7d1b
|
@ -456,6 +456,7 @@ CREATE TABLE `Monitors` (
|
||||||
`Enabled` tinyint(3) unsigned NOT NULL default '1',
|
`Enabled` tinyint(3) unsigned NOT NULL default '1',
|
||||||
`DecodingEnabled` tinyint(3) unsigned NOT NULL default '1',
|
`DecodingEnabled` tinyint(3) unsigned NOT NULL default '1',
|
||||||
`JanusEnabled` BOOLEAN NOT NULL default false,
|
`JanusEnabled` BOOLEAN NOT NULL default false,
|
||||||
|
`JanusAudioEnabled` BOOLEAN NOT NULL default false,
|
||||||
`LinkedMonitors` varchar(255),
|
`LinkedMonitors` varchar(255),
|
||||||
`Triggers` set('X10') NOT NULL default '',
|
`Triggers` set('X10') NOT NULL default '',
|
||||||
`EventStartCommand` VARCHAR(255) NOT NULL DEFAULT '',
|
`EventStartCommand` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
--
|
||||||
|
-- Update Monitors table to have JanusEnabled
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT 'Checking for JanusAudioEnabled in Monitors';
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE table_name = 'Monitors'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
AND column_name = 'JanusAudioEnabled'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column JanusAudioEnabled already exists in Monitors'",
|
||||||
|
"ALTER TABLE `Monitors` ADD COLUMN `JanusAudioEnabled` BOOLEAN NOT NULL default false AFTER `JanusEnabled`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
|
@ -77,7 +77,7 @@ struct Namespace namespaces[] =
|
||||||
// This is the official SQL (and ordering of the fields) to load a Monitor.
|
// This is the official SQL (and ordering of the fields) to load a Monitor.
|
||||||
// It will be used whereever a Monitor dbrow is needed. WHERE conditions can be appended
|
// It will be used whereever a Monitor dbrow is needed. WHERE conditions can be appended
|
||||||
std::string load_monitor_sql =
|
std::string load_monitor_sql =
|
||||||
"SELECT `Id`, `Name`, `ServerId`, `StorageId`, `Type`, `Function`+0, `Enabled`, `DecodingEnabled`, `JanusEnabled`,"
|
"SELECT `Id`, `Name`, `ServerId`, `StorageId`, `Type`, `Function`+0, `Enabled`, `DecodingEnabled`, `JanusEnabled`, `JanusAudioEnabled`,"
|
||||||
"`LinkedMonitors`, `EventStartCommand`, `EventEndCommand`, `AnalysisFPSLimit`, `AnalysisUpdateDelay`, `MaxFPS`, `AlarmMaxFPS`,"
|
"`LinkedMonitors`, `EventStartCommand`, `EventEndCommand`, `AnalysisFPSLimit`, `AnalysisUpdateDelay`, `MaxFPS`, `AlarmMaxFPS`,"
|
||||||
"`Device`, `Channel`, `Format`, `V4LMultiBuffer`, `V4LCapturesPerFrame`, " // V4L Settings
|
"`Device`, `Channel`, `Format`, `V4LMultiBuffer`, `V4LCapturesPerFrame`, " // V4L Settings
|
||||||
"`Protocol`, `Method`, `Options`, `User`, `Pass`, `Host`, `Port`, `Path`, `SecondPath`, `Width`, `Height`, `Colours`, `Palette`, `Orientation`+0, `Deinterlacing`, "
|
"`Protocol`, `Method`, `Options`, `User`, `Pass`, `Host`, `Port`, `Path`, `SecondPath`, `Width`, `Height`, `Colours`, `Palette`, `Orientation`+0, `Deinterlacing`, "
|
||||||
|
@ -307,6 +307,7 @@ Monitor::Monitor()
|
||||||
enabled(false),
|
enabled(false),
|
||||||
decoding_enabled(false),
|
decoding_enabled(false),
|
||||||
janus_enabled(false),
|
janus_enabled(false),
|
||||||
|
janus_audio_enabled(false),
|
||||||
//protocol
|
//protocol
|
||||||
//method
|
//method
|
||||||
//options
|
//options
|
||||||
|
@ -447,7 +448,7 @@ Monitor::Monitor()
|
||||||
|
|
||||||
/*
|
/*
|
||||||
std::string load_monitor_sql =
|
std::string load_monitor_sql =
|
||||||
"SELECT Id, Name, ServerId, StorageId, Type, Function+0, Enabled, DecodingEnabled, JanusEnabled, LinkedMonitors, `EventStartCommand`, `EventEndCommand`, "
|
"SELECT Id, Name, ServerId, StorageId, Type, Function+0, Enabled, DecodingEnabled, JanusEnabled, JanusAudioEnabled, LinkedMonitors, `EventStartCommand`, `EventEndCommand`, "
|
||||||
"AnalysisFPSLimit, AnalysisUpdateDelay, MaxFPS, AlarmMaxFPS,"
|
"AnalysisFPSLimit, AnalysisUpdateDelay, MaxFPS, AlarmMaxFPS,"
|
||||||
"Device, Channel, Format, V4LMultiBuffer, V4LCapturesPerFrame, " // V4L Settings
|
"Device, Channel, Format, V4LMultiBuffer, V4LCapturesPerFrame, " // V4L Settings
|
||||||
"Protocol, Method, Options, User, Pass, Host, Port, Path, SecondPath, Width, Height, Colours, Palette, Orientation+0, Deinterlacing, RTSPDescribe, "
|
"Protocol, Method, Options, User, Pass, Host, Port, Path, SecondPath, Width, Height, Colours, Palette, Orientation+0, Deinterlacing, RTSPDescribe, "
|
||||||
|
@ -501,6 +502,7 @@ void Monitor::Load(MYSQL_ROW dbrow, bool load_zones=true, Purpose p = QUERY) {
|
||||||
decoding_enabled = dbrow[col] ? atoi(dbrow[col]) : false; col++;
|
decoding_enabled = dbrow[col] ? atoi(dbrow[col]) : false; col++;
|
||||||
// See below after save_jpegs for a recalculation of decoding_enabled
|
// See below after save_jpegs for a recalculation of decoding_enabled
|
||||||
janus_enabled = dbrow[col] ? atoi(dbrow[col]) : false; col++;
|
janus_enabled = dbrow[col] ? atoi(dbrow[col]) : false; col++;
|
||||||
|
janus_audio_enabled = dbrow[col] ? atoi(dbrow[col]) : false; col++;
|
||||||
|
|
||||||
ReloadLinkedMonitors(dbrow[col]); col++;
|
ReloadLinkedMonitors(dbrow[col]); col++;
|
||||||
event_start_command = dbrow[col] ? dbrow[col] : ""; col++;
|
event_start_command = dbrow[col] ? dbrow[col] : ""; col++;
|
||||||
|
@ -1121,7 +1123,7 @@ bool Monitor::connect() {
|
||||||
#if HAVE_LIBCURL //janus setup. Depends on libcurl.
|
#if HAVE_LIBCURL //janus setup. Depends on libcurl.
|
||||||
if (janus_enabled && (path.find("rtsp://") != std::string::npos)) {
|
if (janus_enabled && (path.find("rtsp://") != std::string::npos)) {
|
||||||
if (add_to_janus() != 0) {
|
if (add_to_janus() != 0) {
|
||||||
if (add_to_janus() != 0) {
|
if (add_to_janus() != 0) { //The initial attempt may fail. This is a temporary workaround.
|
||||||
Warning("Failed to add monitor stream to Janus!");
|
Warning("Failed to add monitor stream to Janus!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3453,6 +3455,7 @@ int Monitor::add_to_janus() {
|
||||||
postData += rtsp_password;
|
postData += rtsp_password;
|
||||||
postData += "\", \"id\" : ";
|
postData += "\", \"id\" : ";
|
||||||
postData += std::to_string(id);
|
postData += std::to_string(id);
|
||||||
|
if (janus_audio_enabled) postData += ", \"audio\" : true";
|
||||||
postData += ", \"video\" : true}}";
|
postData += ", \"video\" : true}}";
|
||||||
|
|
||||||
curl_easy_setopt(curl, CURLOPT_URL,endpoint.c_str());
|
curl_easy_setopt(curl, CURLOPT_URL,endpoint.c_str());
|
||||||
|
|
|
@ -269,6 +269,7 @@ protected:
|
||||||
bool enabled; // Whether the monitor is enabled or asleep
|
bool enabled; // Whether the monitor is enabled or asleep
|
||||||
bool decoding_enabled; // Whether the monitor will decode h264/h265 packets
|
bool decoding_enabled; // Whether the monitor will decode h264/h265 packets
|
||||||
bool janus_enabled; // Whether we set the h264/h265 stream up on janus
|
bool janus_enabled; // Whether we set the h264/h265 stream up on janus
|
||||||
|
bool janus_audio_enabled; // Whether we tell Janus to try to include audio.
|
||||||
|
|
||||||
std::string protocol;
|
std::string protocol;
|
||||||
std::string method;
|
std::string method;
|
||||||
|
@ -511,6 +512,18 @@ public:
|
||||||
inline bool DecodingEnabled() const {
|
inline bool DecodingEnabled() const {
|
||||||
return decoding_enabled;
|
return decoding_enabled;
|
||||||
}
|
}
|
||||||
|
bool JanusEnabled() {
|
||||||
|
return janus_enabled;
|
||||||
|
}
|
||||||
|
bool JanusAudioEnabled() {
|
||||||
|
return janus_audio_enabled;
|
||||||
|
}
|
||||||
|
bool OnvifEnabled() {
|
||||||
|
return onvif_event_listener;
|
||||||
|
}
|
||||||
|
bool OnvifHealthy() {
|
||||||
|
return ONVIF_Healthy;
|
||||||
|
}
|
||||||
inline const char *EventPrefix() const { return event_prefix.c_str(); }
|
inline const char *EventPrefix() const { return event_prefix.c_str(); }
|
||||||
inline bool Ready() const {
|
inline bool Ready() const {
|
||||||
if ( image_count >= ready_count ) {
|
if ( image_count >= ready_count ) {
|
||||||
|
|
|
@ -79,6 +79,16 @@ if ( !canEdit('Monitors') ) return;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="form-group" id="FunctionJanusAudioEnabled">
|
||||||
|
<label for="newJanusAudioEnabled"><?php echo translate('Janus Audio Enabled') ?></label>
|
||||||
|
<input type="checkbox" name="newJanusAudioEnabled" id="newJanusAudioEnabled" value="1"/>
|
||||||
|
<?php
|
||||||
|
if ( isset($OLANG['FUNCTION_JANUS_AUDIO_ENABLED']) ) {
|
||||||
|
echo '<div class="form-text">'.$OLANG['FUNCTION_JANUS_AUDIO_ENABLED']['Help'].'</div>';
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
|
|
@ -56,6 +56,7 @@ class Monitor extends ZM_Object {
|
||||||
'Enabled' => array('type'=>'boolean','default'=>1),
|
'Enabled' => array('type'=>'boolean','default'=>1),
|
||||||
'DecodingEnabled' => array('type'=>'boolean','default'=>1),
|
'DecodingEnabled' => array('type'=>'boolean','default'=>1),
|
||||||
'JanusEnabled' => array('type'=>'boolean','default'=>0),
|
'JanusEnabled' => array('type'=>'boolean','default'=>0),
|
||||||
|
'JanusAudioEnabled' => array('type'=>'boolean','default'=>0),
|
||||||
'LinkedMonitors' => array('type'=>'set', 'default'=>null),
|
'LinkedMonitors' => array('type'=>'set', 'default'=>null),
|
||||||
'Triggers' => array('type'=>'set','default'=>''),
|
'Triggers' => array('type'=>'set','default'=>''),
|
||||||
'EventStartCommand' => '',
|
'EventStartCommand' => '',
|
||||||
|
|
|
@ -90,6 +90,7 @@ if ($action == 'save') {
|
||||||
'Enabled' => 0,
|
'Enabled' => 0,
|
||||||
'DecodingEnabled' => 0,
|
'DecodingEnabled' => 0,
|
||||||
'JanusEnabled' => 0,
|
'JanusEnabled' => 0,
|
||||||
|
'JanusAudioEnabled' => 0,
|
||||||
'Exif' => 0,
|
'Exif' => 0,
|
||||||
'RTSPDescribe' => 0,
|
'RTSPDescribe' => 0,
|
||||||
'V4LMultiBuffer' => '',
|
'V4LMultiBuffer' => '',
|
||||||
|
|
|
@ -1179,6 +1179,11 @@ $OLANG = array(
|
||||||
Attempt to use Janus streaming server for h264/h265 live view. Experimental, but allows
|
Attempt to use Janus streaming server for h264/h265 live view. Experimental, but allows
|
||||||
for significantly better performance.'
|
for significantly better performance.'
|
||||||
),
|
),
|
||||||
|
'FUNCTION_JANUS_AUDIO_ENABLED' => array(
|
||||||
|
'Help' => '
|
||||||
|
Attempt to enable audio in the Janus stream. Has no effect for cameras without audio support,
|
||||||
|
but can prevent a stream playing if your camera sends an audio format unsupported by the browser.'
|
||||||
|
),
|
||||||
'ImageBufferCount' => array(
|
'ImageBufferCount' => array(
|
||||||
'Help' => '
|
'Help' => '
|
||||||
Number of raw images available in /dev/shm. Currently should be set in the 3-5 range. Used for live viewing.'
|
Number of raw images available in /dev/shm. Currently should be set in the 3-5 range. Used for live viewing.'
|
||||||
|
|
|
@ -260,6 +260,21 @@ function initPage() {
|
||||||
window.location.assign('?view=console');
|
window.location.assign('?view=console');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//manage the Janus audio check
|
||||||
|
if (document.getElementsByName("newMonitor[JanusEnabled]")[0].checked) {
|
||||||
|
document.getElementById("FunctionJanusAudioEnabled").hidden = false;
|
||||||
|
} else {
|
||||||
|
document.getElementById("FunctionJanusAudioEnabled").hidden = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementsByName("newMonitor[JanusEnabled]")[0].addEventListener('change', function() {
|
||||||
|
if (this.checked) {
|
||||||
|
document.getElementById("FunctionJanusAudioEnabled").hidden = false;
|
||||||
|
} else {
|
||||||
|
document.getElementById("FunctionJanusAudioEnabled").hidden = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if ( ZM_OPT_USE_GEOLOCATION ) {
|
if ( ZM_OPT_USE_GEOLOCATION ) {
|
||||||
if ( window.L ) {
|
if ( window.L ) {
|
||||||
var form = document.getElementById('contentForm');
|
var form = document.getElementById('contentForm');
|
||||||
|
|
|
@ -584,6 +584,16 @@ if (count($available_monitor_ids)) {
|
||||||
if ( isset($OLANG['FUNCTION_JANUS_ENABLED']) ) {
|
if ( isset($OLANG['FUNCTION_JANUS_ENABLED']) ) {
|
||||||
echo '<div class="form-text">'.$OLANG['FUNCTION_JANUS_ENABLED']['Help'].'</div>';
|
echo '<div class="form-text">'.$OLANG['FUNCTION_JANUS_ENABLED']['Help'].'</div>';
|
||||||
}
|
}
|
||||||
|
?>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr id="FunctionJanusAudioEnabled">
|
||||||
|
<td class="text-right pr-3"><?php echo translate('Janus Live Stream Audio') ?></td>
|
||||||
|
<td><input type="checkbox" name="newMonitor[JanusAudioEnabled]" value="1"<?php echo $monitor->JanusAudioEnabled() ? ' checked="checked"' : '' ?>/>
|
||||||
|
<?php
|
||||||
|
if ( isset($OLANG['FUNCTION_JANUS_AUDIO_ENABLED']) ) {
|
||||||
|
echo '<div class="form-text">'.$OLANG['FUNCTION_JANUS_AUDIO_ENABLED']['Help'].'</div>';
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
Loading…
Reference in New Issue