cleanup Additional Input and Stream Channel field generation

email-send-options-from-account
Moe 2021-06-12 19:36:05 -07:00
parent f9122e23af
commit 0e82ecf113
4 changed files with 617 additions and 316 deletions

View File

@ -702,12 +702,15 @@ module.exports = function(s,config,lang){
"form-group-class": "h_gpud_input h_gpud_1",
"possible": ""
},
{
"fieldType": 'div',
"id": "monSectionInputMaps"
},
]
},
"Input Maps": {
"name": lang["Additional Inputs"],
"color": "orange",
"id": "monSectionInputMaps",
"section-class": "pb-0",
"emptyDiv": true
},
"Stream": {
"name": lang.Stream,
@ -1075,7 +1078,7 @@ module.exports = function(s,config,lang){
"example": "",
"form-group-class": "h_st_input h_st_mjpeg h_st_b64 h_st_hls h_st_gif h_st_flv h_st_mp4 h_st_h265 h_hls_v_input h_hls_v_libx264 h_hls_v_libx265 h_hls_v_h264_nvenc h_hls_v_hevc_nvenc h_hls_v_no",
"possible": ""
},
},
{
"name": "detail=tv_channel",
"field": lang["TV Channel"],
@ -1275,6 +1278,7 @@ module.exports = function(s,config,lang){
"name": "Stream Channels",
"color": "blue",
"id": "monSectionStreamChannels",
"section-class": "pb-0",
"emptyDiv": true
},
"JPEG API": {
@ -6259,5 +6263,581 @@ module.exports = function(s,config,lang){
},
}
},
"Monitor Settings Additional Input Map": {
"section": "Monitor Settings Additional Input Map",
"blocks": {
"Connection" : {
"id": `monSectionMap$[NUMBER]`,
"name": `${lang['Input Map']} $[NUMBER]`,
"section-class": "input-map",
"color": "orange",
"isSection": true,
"info": [
{
"fieldType": "btn-group",
"btns": [
{
"fieldType": "btn",
"class": `btn-danger delete mb-2`,
"btnContent": `${lang['Delete']}`,
}
],
},
{
name:'map-detail=type',
field:lang['Input Type'],
default:'h264',
attribute:'selector="h_i_$[TEMP_ID]"',
"fieldType": "select",
type:'selector',
possible:[
{
"name": "H.264 / H.265 / H.265+",
"value": "h264"
},
{
"name": "JPEG",
"value": "jpeg"
},
{
"name": "MJPEG",
"value": "mjpeg"
},
{
"name": "HLS (.m3u8)",
"value": "hls"
},
{
"name": "MPEG-4 (.mp4 / .ts)",
"value": "mp4"
},
{
"name": "Local",
"value": "local"
},
{
"name": "Raw",
"value": "raw"
}
]
},
{
name:'map-detail=fulladdress',
field:lang['Full URL Path'],
placeholder:'Example : rtsp://admin:password@123.123.123.123/stream/1',
type:'text',
},
{
name:'map-detail=sfps',
field:lang['Monitor Capture Rate'],
placeholder:'',
type:'text',
},
{
name:'map-detail=aduration',
field:lang['Analyzation Duration'],
placeholder:'Example : 1000000',
type:'text',
},
{
name:'map-detail=probesize',
field:lang['Probe Size'],
placeholder:'Example : 1000000',
type:'text',
},
{
name:'map-detail=stream_loop',
field:lang['Loop Stream'],
class:'h_i_$[TEMP_ID]_input h_i_$[TEMP_ID]_mp4 h_i_$[TEMP_ID]_raw',
hidden:true,
default:'0',
"fieldType": "select",
type:'selector',
possible:[
{
"name": lang.No,
"value": "0",
},
{
"name": lang.Yes,
"value": "1",
}
]
},
{
name:'map-detail=rtsp_transport',
field:lang['RTSP Transport'],
class:'h_i_$[TEMP_ID]_input h_i_$[TEMP_ID]_h264',
default:'',
"fieldType": "select",
type:'selector',
possible:[
{
"name": lang.Auto,
"value": "",
"info": "Let FFMPEG decide. Normally it will try UDP first."
},
{
"name": "TCP",
"value": "tcp",
"info": "Set it to this if UDP starts giving undesired results."
},
{
"name": "UDP",
"value": "udp",
"info": "FFMPEG tries this first."
}
]
},
{
name:'map-detail=accelerator',
field:lang['Accelerator'],
attribute:'selector="h_accel_$[TEMP_ID]"',
default:'0',
"fieldType": "select",
type:'selector',
possible:[
{
"name": lang.No,
"value": "0",
},
{
"name": lang.Yes,
"value": "1",
}
]
},
{
name:'map-detail=hwaccel',
field:lang['hwaccel'],
class:'h_accel_$[TEMP_ID]_input h_accel_$[TEMP_ID]_1',
hidden:true,
default:'',
"fieldType": "select",
type:'selector',
possible: s.listOfHwAccels
},
{
name:'map-detail=hwaccel_vcodec',
field:lang['hwaccel_vcodec'],
class:'h_accel_$[TEMP_ID]_input h_accel_$[TEMP_ID]_1',
hidden:true,
default:'auto',
"fieldType": "select",
type:'selector',
possible:[
{
"name": lang.Auto + '('+lang.Recommended+')',
"value": ""
},
{
"name": lang.NVIDIA,
"optgroup": [
{
"name": lang.h264_cuvid,
"value": "h264_cuvid"
},
{
"name": lang.hevc_cuvid,
"value": "hevc_cuvid"
},
{
"name": lang.mjpeg_cuvid,
"value": "mjpeg_cuvid"
},
{
"name": lang.mpeg4_cuvid,
"value": "mpeg4_cuvid"
},
]
},
{
"name": lang["Quick Sync Video"],
"optgroup": [
{
"name": lang.h264_qsv,
"value": "h264_qsv"
},
{
"name": lang.hevc_qsv,
"value": "hevc_qsv"
},
{
"name": lang.mpeg2_qsv,
"value": "mpeg2_qsv"
},
]
},
{
"name": lang['Raspberry Pi'],
"optgroup": [
{
"name": lang.h264_mmal,
"value": "h264_mmal"
},
{
"name": lang.mpeg2_mmal,
"value": "mpeg2_mmal"
},
{
"name": lang["MPEG-4 (Raspberry Pi)"],
"value": "mpeg4_mmal"
}
]
},
]
},
{
name:'map-detail=hwaccel_device',
field:lang['hwaccel_device'],
class:'h_accel_$[TEMP_ID]_input h_accel_$[TEMP_ID]_1',
hidden:true,
placeholder:'Example : /dev/dri/video0',
type:'text',
},
{
name:'map-detail=cust_input',
field:lang['Input Flags'],
type:'text',
},
]
}
}
},
"Monitor Settings Additional Stream Channel": {
"section": "Monitor Settings Additional Stream Channel",
"blocks": {
"Stream" : {
"id": `monSectionChannel$[TEMP_ID]`,
"name": `${lang["Stream Channel"]} $[NUMBER]`,
"color": "blue",
"input-mapping": "stream_channel-$[NUMBER]",
"isSection": true,
"section-class": "stream-channel",
"info": [
{
"fieldType": "btn-group",
"btns": [
{
"fieldType": "btn",
"class": `btn-danger delete mb-2`,
"btnContent": `${lang['Delete']}`,
}
],
},
{
"fieldType": "div",
"divContent": `<div class="choices"></div>`,
},
{
"field": lang["Stream Type"],
"name": `channel-detail="stream_type"`,
"description": "The method that will used to consume the video stream.",
"default": "mp4",
"selector": "h_st_channel_$[TEMP_ID]",
"fieldType": "select",
"attribute": `triggerChange="#monSectionChannel$[TEMP_ID] [channel-detail=stream_vcodec]" triggerChangeIgnore="b64,mjpeg"`,
"possible": [
{
"name": lang.Poseidon,
"value": "mp4",
"info": "Poseidon is built on Kevin Godell's MP4 processing code. It simulates a streaming MP4 file but using the data of a live stream. Includes Audio. Some browsers can play it like a regular MP4 file. Streams over HTTP or WebSocket."
},
{
"name": lang["RTMP Stream"],
"value": "rtmp",
},
{
"name": lang['HEVC (H.265)'],
"value": "h265"
},
{
"name": lang['MJPEG'],
"value": "mjpeg",
"info": "Standard Motion JPEG image. No audio."
},
{
"name": lang['FLV'],
"value": "flv",
"info": "Sending FLV encoded frames over WebSocket."
},
{
"name": lang['HLS (includes Audio)'],
"value": "hls",
"info": "Similar method to facebook live streams. <b>Includes audio</b> if input provides it. There is a delay of about 4-6 seconds because this method records segments then pushes them to the client rather than push as while it creates them."
}
]
},
{
"field": lang['Server URL'],
"name": `channel-detail="rtmp_server_url"`,
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_rtmp",
"example": "rtmp://live-api.facebook.com:80/rtmp/",
},
{
"field": lang['Stream Key'],
"name": `channel-detail="rtmp_stream_key"`,
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_rtmp",
"example": "1111111111?ds=1&a=xxxxxxxxxx",
},
{
"field": lang['# of Allow MJPEG Clients'],
"name": `channel-detail="stream_mjpeg_clients"`,
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_mjpeg",
"placeholder": "20",
},
{
"field": lang['Video Codec'],
"name": `channel-detail="stream_vcodec"`,
"description": "Video codec for streaming.",
"default": "no",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
"fieldType": "select",
"selector": "h_hls_v_channel_$[TEMP_ID]",
"possible": [
{
"name": lang.Auto,
"value": "no",
"info": "Let FFMPEG choose."
},
{
"name": "libx264",
"value": "libx264",
"info": "Used for MP4 video."
},
{
"name": "libx265",
"value": "libx265",
"info": "Used for MP4 video."
},
{
"name": lang.copy,
"value": "copy",
"info": "Used for MP4 video. Has very low CPU usage but cannot use video filters and filesizes may be gigantic. Best to setup your MP4 settings camera-side when using this option."
},
{
"name": lang['Hardware Accelerated'],
"optgroup": [
{
"name": "H.264 VA-API (Intel HW Accel)",
"value": "h264_vaapi"
},
{
"name": "H.265 VA-API (Intel HW Accel)",
"value": "hevc_vaapi"
},
{
"name": "H.264 NVENC (NVIDIA HW Accel)",
"value": "h264_nvenc"
},
{
"name": "H.265 NVENC (NVIDIA HW Accel)",
"value": "hevc_nvenc"
},
{
"name": "H.264 (Quick Sync Video)",
"value": "h264_qsv"
},
{
"name": "H.265 (Quick Sync Video)",
"value": "hevc_qsv"
},
{
"name": "MPEG2 (Quick Sync Video)",
"value": "mpeg2_qsv"
},
{
"name": "H.264 (Quick Sync Video)",
"value": "h264_qsv"
},
{
"name": "H.265 (Quick Sync Video)",
"value": "hevc_qsv"
},
{
"name": "MPEG2 (Quick Sync Video)",
"value": "mpeg2_qsv"
},
{
"name": "H.264 openMAX (Raspberry Pi)",
"value": "h264_omx"
}
]
},
]
},
{
"field": lang["Audio Codec"],
"name": `channel-detail="stream_acodec"`,
"description": "Audio codec for streaming.",
"default": "0",
"example": "",
"fieldType": "select",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
"possible": [
{
"name": lang.Auto,
"info": "Let FFMPEG choose.",
"value": ""
},
{
"name": lang["No Audio"],
"info": "No Audio, this is an option that must be set in some parts of the world due to legal reasons.",
"value": "no"
},
{
"name": "libvorbis",
"info": "Used for WebM video.",
"value": "libvorbis"
},
{
"name": "libopus",
"info": "Used for WebM video.",
"value": "libopus"
},
{
"name": "libmp3lame",
"info": "Used for MP4 video.",
"value": "libmp3lame"
},
{
"name": "aac",
"info": "Used for MP4 video.",
"value": "aac"
},
{
"name": "ac3",
"info": "Used for MP4 video.",
"value": "ac3"
},
{
"name": "copy",
"info": "Used for MP4 video. Has very low CPU usage but some audio codecs need custom flags like <code>-strict 2</code> for aac.",
"value": "copy"
}
]
},
{
"name": "channel-detail=hls_time",
"field": lang["HLS Segment Length"],
"description": "How long each video segment should be, in minutes. Each segment will be drawn by the client through an m3u8 file. Shorter segments take less space.",
"default": "2",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_hls",
},
{
"name": "channel-detail=hls_list_size",
"field": lang["HLS List Size"],
"description": "The number of segments maximum before deleting old segments automatically.",
"default": "2",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_hls",
},
{
"name": "channel-detail=preset_stream",
"field": lang["HLS Preset"],
"description": "Preset flag for certain video encoders. If you find your camera is crashing every few seconds : try leaving it blank.",
"example": "ultrafast",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_hls",
},
{
"name": "channel-detail=stream_quality",
"field": lang.Quality,
"description": "Low number means higher quality. Higher number means less quality.",
"default": "15",
"example": "1",
"form-group-class-pre-layer": "h_hls_v_channel_$[TEMP_ID]_input h_hls_v_channel_$[TEMP_ID]_libx264 h_hls_v_channel_$[TEMP_ID]_libx265 h_hls_v_channel_$[TEMP_ID]_h264_nvenc h_hls_v_channel_$[TEMP_ID]_hevc_nvenc h_hls_v_channel_$[TEMP_ID]_no",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_mjpeg h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_jsmpeg h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
"possible": "1-23"
},
{
"name": "channel-detail=stream_v_br",
"field": lang["Video Bit Rate"],
"placeholder": "",
"form-group-class-pre-layer": "h_hls_v_channel_$[TEMP_ID]_input h_hls_v_channel_$[TEMP_ID]_libx264 h_hls_v_channel_$[TEMP_ID]_libx265 h_hls_v_channel_$[TEMP_ID]_h264_nvenc h_hls_v_channel_$[TEMP_ID]_hevc_nvenc h_hls_v_channel_$[TEMP_ID]_no",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_mjpeg h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_jsmpeg h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
},
{
"name": "channel-detail=stream_a_br",
"field": lang["Audio Bit Rate"],
"placeholder": "128k",
"form-group-class-pre-layer": "h_hls_v_channel_$[TEMP_ID]_input h_hls_v_channel_$[TEMP_ID]_libx264 h_hls_v_channel_$[TEMP_ID]_libx265 h_hls_v_channel_$[TEMP_ID]_h264_nvenc h_hls_v_channel_$[TEMP_ID]_hevc_nvenc h_hls_v_channel_$[TEMP_ID]_no",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_mjpeg h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_jsmpeg h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
},
{
"name": "channel-detail=stream_fps",
"field": lang['Frame Rate'],
"description": "The speed in which frames are displayed to clients, in Frames Per Second. Be aware there is no default. This can lead to high bandwidth usage.",
"form-group-class-pre-layer": "h_hls_v_channel_$[TEMP_ID]_input h_hls_v_channel_$[TEMP_ID]_libx264 h_hls_v_channel_$[TEMP_ID]_libx265 h_hls_v_channel_$[TEMP_ID]_h264_nvenc h_hls_v_channel_$[TEMP_ID]_hevc_nvenc h_hls_v_channel_$[TEMP_ID]_no",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_mjpeg h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_jsmpeg h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
},
{
"name": "channel-detail=stream_scale_x",
"field": lang.Width,
"description": "Width of the stream image that is output after processing.",
"fieldType": "number",
"numberMin": "1",
"example": "640",
"form-group-class-pre-layer": "h_hls_v_channel_$[TEMP_ID]_input h_hls_v_channel_$[TEMP_ID]_libx264 h_hls_v_channel_$[TEMP_ID]_libx265 h_hls_v_channel_$[TEMP_ID]_h264_nvenc h_hls_v_channel_$[TEMP_ID]_hevc_nvenc h_hls_v_channel_$[TEMP_ID]_no",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_mjpeg h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_jsmpeg h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
},
{
"name": "channel-detail=stream_scale_y",
"field": lang.Height,
"description": "Height of the stream image that is output after processing.",
"fieldType": "number",
"numberMin": "1",
"example": "480",
"form-group-class-pre-layer": "h_hls_v_channel_$[TEMP_ID]_input h_hls_v_channel_$[TEMP_ID]_libx264 h_hls_v_channel_$[TEMP_ID]_libx265 h_hls_v_channel_$[TEMP_ID]_h264_nvenc h_hls_v_channel_$[TEMP_ID]_hevc_nvenc h_hls_v_channel_$[TEMP_ID]_no",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_mjpeg h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_jsmpeg h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
},
{
"name": "channel-detail=stream_rotate",
"field": lang["Rotate"],
"description": "Change the viewing angle of the video stream.",
"fieldType": "select",
"form-group-class-pre-layer": "h_hls_v_channel_$[TEMP_ID]_input h_hls_v_channel_$[TEMP_ID]_libx264 h_hls_v_channel_$[TEMP_ID]_libx265 h_hls_v_channel_$[TEMP_ID]_h264_nvenc h_hls_v_channel_$[TEMP_ID]_hevc_nvenc h_hls_v_channel_$[TEMP_ID]_no",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_mjpeg h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_jsmpeg h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
"possible": [
{
"name": lang["No Rotation"],
"value": "no"
},
{
"name": lang["180 Degrees"],
"value": "2,transpose=2"
},
{
"name": lang["90 Counter Clockwise and Vertical Flip (default)"],
"value": "0"
},
{
"name": lang["90 Clockwise"],
"value": "1"
},
{
"name": lang["90 Clockwise and Vertical Flip"],
"value": "2"
},
{
"name": lang["90 Clockwise and Vertical Flip"],
"value": "3"
}
]
},
{
"name": "channel-detail=svf",
"field": lang["Video Filter"],
"description": "Place FFMPEG video filters in this box to affect the streaming portion. No spaces.",
"form-group-class-pre-layer": "h_hls_v_channel_$[TEMP_ID]_input h_hls_v_channel_$[TEMP_ID]_libx264 h_hls_v_channel_$[TEMP_ID]_libx265 h_hls_v_channel_$[TEMP_ID]_h264_nvenc h_hls_v_channel_$[TEMP_ID]_hevc_nvenc h_hls_v_channel_$[TEMP_ID]_no",
"form-group-class": "h_st_channel_$[TEMP_ID]_input h_st_channel_$[TEMP_ID]_mjpeg h_st_channel_$[TEMP_ID]_hls h_st_channel_$[TEMP_ID]_rtmp h_st_channel_$[TEMP_ID]_jsmpeg h_st_channel_$[TEMP_ID]_flv h_st_channel_$[TEMP_ID]_mp4 h_st_channel_$[TEMP_ID]_h264 h_st_channel_$[TEMP_ID]_h265",
},
{
"name": "channel-detail=cust_stream",
"field": lang["Stream Flags"],
},
]
}
}
},
}
}

View File

@ -510,6 +510,8 @@
"a year": "a year",
"years": "years",
"Identity": "Identity",
"Additional Inputs": "Additional Inputs",
"Input Map": "Input Map",
"Input": "Input",
"Input Feed": "Input Feed",
"Timezone": "Timezone",

View File

@ -373,6 +373,16 @@ function drawMonitorSettingsSubMenu(){
drawSubMenuItems('monitorSettings',definitions['Monitor Settings'])
}
function getAdditionalInputMapFields(tempID,channelId){
var fieldInfo = monitorSettingsAdditionalInputMapFieldHtml.replaceAll('$[TEMP_ID]',tempID).replaceAll('$[NUMBER]',channelId)
return fieldInfo
}
function getAdditionalStreamChannelFields(tempID,channelId){
var fieldInfo = monitorSettingsAdditionalStreamChannelFieldHtml.replaceAll('$[TEMP_ID]',tempID).replaceAll('$[NUMBER]',channelId)
return fieldInfo
}
addOnTabOpen('monitorSettings', function () {
triggerSecondaryHideCheckOnAll()
drawMonitorSettingsSubMenu()
@ -390,163 +400,7 @@ function drawInputMapHtml(options){
var numberOfChannelsDrawn = $('#monSectionInputMaps .input-map').length
options.channel = numberOfChannelsDrawn+1
}
var fields = [
// {
// name:'',
// class:'',
// placeholder:'',
// default:'',
// attribute:'',
// type:'text',
// },
{
name:'type',
label:lang['Input Type'],
default:'h264',
attribute:'selector="h_i_'+tempID+'"',
type:'selector',
choices:[
{label:lang['H.264 / H.265 / H.265+'],value:'h264'},
{label:lang['JPEG'],value:'jpeg'},
{label:lang['MJPEG'],value:'mjpeg'},
{label:lang['HLS (.m3u8)'],value:'hls'},
{label:lang['MPEG-4 (.mp4 / .ts)'],value:'mp4'},
{label:lang['Local'],value:'local'},
{label:lang['Raw'],value:'raw'},
]
},
{
name:'fulladdress',
label:lang['Full URL Path'],
placeholder:'Example : rtsp://admin:password@123.123.123.123/stream/1',
type:'text',
},
{
name:'sfps',
label:lang['Monitor Capture Rate'],
placeholder:'',
type:'text',
},
{
name:'aduration',
label:lang['Analyzation Duration'],
placeholder:'Example : 1000000',
type:'text',
},
{
name:'probesize',
label:lang['Probe Size'],
placeholder:'Example : 1000000',
type:'text',
},
{
name:'stream_loop',
label:lang['Loop Stream'],
class:'h_i_'+tempID+'_input h_i_'+tempID+'_mp4 h_i_'+tempID+'_raw',
hidden:true,
default:'0',
type:'selector',
choices:[
{label:'No',value:'0'},
{label:'Yes',value:'1'}
]
},
{
name:'rtsp_transport',
label:lang['RTSP Transport'],
class:'h_i_'+tempID+'_input h_i_'+tempID+'_h264',
default:'0',
type:'selector',
choices:[
{label:'Auto',value:''},
{label:'TCP',value:'tcp'},
{label:'UDP',value:'udp'}
]
},
{
name:'accelerator',
label:lang['Accelerator'],
attribute:'selector="h_accel_'+tempID+'"',
default:'0',
type:'selector',
choices:[
{label:'No',value:'0'},
{label:'Yes',value:'1'},
]
},
{
name:'hwaccel',
label:lang['hwaccel'],
class:'h_accel_'+tempID+'_input h_accel_'+tempID+'_1',
hidden:true,
default:'',
type:'selector',
choices: HWAccelChoices
},
{
name:'hwaccel_vcodec',
label:lang['hwaccel_vcodec'],
class:'h_accel_'+tempID+'_input h_accel_'+tempID+'_1',
hidden:true,
default:'auto',
type:'selector',
choices:[
{label:lang['Auto'],value:'auto'},
{label:lang['h264_cuvid'],value:'h264_cuvid',group:'NVIDIA'},
{label:lang['hevc_cuvid'],value:'hevc_cuvid',group:'NVIDIA'},
{label:lang['mjpeg_cuvid'],value:'mjpeg_cuvid',group:'NVIDIA'},
{label:lang['mpeg4_cuvid'],value:'mpeg4_cuvid',group:'NVIDIA'},
{label:lang['h264_qsv'],value:'h264_qsv',group:'Quick Sync Video'},
{label:lang['hevc_qsv'],value:'hevc_qsv',group:'Quick Sync Video'},
{label:lang['mpeg2_qsv'],value:'mpeg2_qsv',group:'Quick Sync Video'},
{label:lang['h264_mmal'],value:'h264_mmal',group:'Raspberry Pi'},
{label:lang['mpeg2_mmal'],value:'mpeg2_mmal',group:'Raspberry Pi'},
{label:lang['mpeg4_mmal'],value:'mpeg4_mmal',group:'Raspberry Pi'},
]
},
{
name:'hwaccel_device',
label:lang['hwaccel_device'],
class:'h_accel_'+tempID+'_input h_accel_'+tempID+'_1',
hidden:true,
placeholder:'Example : /dev/dri/video0',
type:'text',
},
{
name:'cust_input',
label:lang['Input Flags'],
type:'text',
},
];
tmp+='<div class="form-group-group forestgreen input-map" section id="monSectionMap'+tempID+'">'
tmp+=' <h4>'+lang["Input"]+' <b>'+lang["Map"]+' : <span class="place">'+options.channel+'</span></b>'
tmp+=' <div class="pull-right"><a class="btn btn-danger btn-xs delete"><i class="fa fa-trash-o"></i></a></div>'
tmp+=' </h4>'
$.each(fields,function(n,v){
if(!v.attribute)v.attribute='';
if(!v.placeholder)v.placeholder='';
if(!v.class)v.class='';
if(v.hidden){v.hidden='style="display:none"'}else{v.hidden=''};
tmp+=' <div class="form-group '+v.class+'" '+v.hidden+'>'
tmp+=' <label><div><span>'+v.label+'</span></div>'
tmp+=' <div>'
switch(v.type){
case'text':
tmp+='<input class="form-control" map-detail="'+v.name+'" placeholder="'+v.placeholder+'" '+v.attribute+'>'
break;
case'selector':
tmp+='<select class="form-control" map-detail="'+v.name+'" placeholder="'+v.placeholder+'" '+v.attribute+'>'
$.each(v.choices,function(m,b){
tmp+='<option value="'+b.value+'">'+b.label+'</option>'
})
tmp+='</select>'
break;
}
tmp+=' </div>'
tmp+=' </label>'
tmp+=' </div>'
})
tmp+='</div>'
tmp+=getAdditionalInputMapFields(tempID,options.channel)
monitorSectionInputMaps.append(tmp)
monitorSectionInputMaps.find('.input-map').last().find('[map-detail="aduration"]').change()
return tempID;
@ -559,160 +413,7 @@ function drawStreamChannelHtml(options){
var numberOfChannelsDrawn = $('#monSectionStreamChannels .stream-channel').length
options.channel=numberOfChannelsDrawn
}
tmp+='<div class="form-group-group blue stream-channel" section id="monSectionChannel'+tempID+'">'
tmp+=' <h4>'+lang["Stream Channel"]+' <span class="place">'+options.channel+'</span>'
tmp+=' <div class="pull-right"><a class="btn btn-danger btn-xs delete"><i class="fa fa-trash-o"></i></a></div>'
tmp+=' </h4>'
// tmp+=' <div class="form-group">'
// tmp+=' <label><div><span>'+lang["Input Selector"]+'</span></div>'
// tmp+=' <div><input class="form-control" channel-detail="stream_map" placeholder="0"></div>'
// tmp+=' </label>'
// tmp+=' </div>'
tmp+='<div class="form-group-group forestgreen" input-mapping="stream_channel-'+options.channel+'">'
tmp+=' <h4>'+lang['Input Feed']
tmp+=' <div class="pull-right">'
tmp+=' <a class="btn btn-success btn-xs add_map_row"><i class="fa fa-plus-square-o"></i></a>'
tmp+=' </div>'
tmp+=' </h4>'
tmp+=' <div class="choices"></div>'
tmp+='</div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Stream Type"]+'</span></div>'
tmp+=' <div><select class="form-control" channel-detail="stream_type" selector="h_st_channel_'+tempID+'" triggerChange="#monSectionChannel'+tempID+' [channel-detail=stream_vcodec]" triggerChangeIgnore="b64,mjpeg">'
tmp+=' <option value="mp4">'+lang["Poseidon"]+'</option>'
tmp+=' <option value="rtmp">'+lang["RTMP Stream"]+'</option>'
tmp+=' <option value="flv">'+lang["FLV"]+'</option>'
tmp+=' <option value="h264">'+lang["Raw H.264 Stream"]+'</option>'
tmp+=' <option value="hls">'+lang["HLS (includes Audio)"]+'</option>'
tmp+=' <option value="mjpeg">'+lang["MJPEG"]+'</option>'
tmp+=' </select></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_rtmp">'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Server URL"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="rtmp_server_url" placeholder="Example : rtmp://live-api.facebook.com:80/rtmp/"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Stream Key"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="rtmp_stream_key" placeholder="Example : 1111111111?ds=1&a=xxxxxxxxxx"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' </div>'
tmp+=' <div class="form-group h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_mjpeg" style="display:none">'
tmp+=' <label><div><span>'+lang["# of Allow MJPEG Clients"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="stream_mjpeg_clients" placeholder="20"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_hls h_st_channel_'+tempID+'_rtmp h_st_channel_'+tempID+'_flv h_st_channel_'+tempID+'_mp4 h_st_channel_'+tempID+'_h264">'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["HLS Video Encoder"]+'</span></div>'
tmp+=' <div><select class="form-control" channel-detail="stream_vcodec" selector="h_hls_v_channel_'+tempID+'">'
tmp+=' <option value="no" selected>'+lang["Auto"]+'</option>'
tmp+=' <option value="libx264">'+lang["libx264"]+'</option>'
tmp+=' <option value="libx265">'+lang["libx265"]+'</option>'
tmp+=' <option value="copy" selected>'+lang["copy"]+'</option>'
tmp+=' <optgroup label="'+lang["Hardware Accelerated"]+'">'
tmp+=' <option value="h264_vaapi">'+lang["h264_vaapi"]+'</option>'
tmp+=' <option value="hevc_vaapi">'+lang["hevc_vaapi"]+'</option>'
tmp+=' <option value="h264_nvenc">'+lang["h264_nvenc"]+'</option>'
tmp+=' <option value="hevc_nvenc">'+lang["hevc_nvenc"]+'</option>'
tmp+=' <option value="h264_qsv">'+lang["h264_qsv"]+'</option>'
tmp+=' <option value="hevc_qsv">'+lang["hevc_qsv"]+'</option>'
tmp+=' <option value="mpeg2_qsv">'+lang["mpeg2_qsv"]+'</option>'
tmp+=' <option value="h264_omx">'+lang["h264_omx"]+'</option>'
tmp+=' </optgroup>'
tmp+=' </select></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["HLS Audio Encoder"]+'</span></div>'
tmp+=' <div><select class="form-control" channel-detail="stream_acodec">'
tmp+=' <option value="no" selected>'+lang["No Audio"]+'</option>'
tmp+=' <option value="">'+lang["Auto"]+'</option>'
tmp+=' <option value="aac">'+lang["aac"]+'</option>'
tmp+=' <option value="ac3">'+lang["ac3"]+'</option>'
tmp+=' <option value="libmp3lame">'+lang["libmp3lame"]+'</option>'
tmp+=' <option value="copy">'+lang["copy"]+'</option>'
tmp+=' </select></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Rate"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="stream_fps" placeholder=""></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_hls" style="display:none">'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["HLS Segment Length"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="hls_time" placeholder="2"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["HLS Preset"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="preset_stream" placeholder="ultrafast"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["HLS List Size"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="hls_list_size" placeholder="2"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' </div>'
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_mjpeg h_st_channel_'+tempID+'_hls h_st_channel_'+tempID+'_rtmp h_st_channel_'+tempID+'_jsmpeg h_st_channel_'+tempID+'_flv h_st_channel_'+tempID+'_mp4 h_st_channel_'+tempID+'_h264 h_hls_v_channel_'+tempID+'_input h_hls_v_channel_'+tempID+'_libx264 h_hls_v_channel_'+tempID+'_libx265 h_hls_v_channel_'+tempID+'_h264_nvenc h_hls_v_channel_'+tempID+'_hevc_nvenc h_hls_v_channel_'+tempID+'_no" style="display:none">'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Quality"]+'</span></div>'
tmp+=' <div><input class="form-control" placeholder="23" channel-detail="stream_quality"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_rtmp">'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Video Bit Rate"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="stream_v_br" placeholder=""></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Audio Bit Rate"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="stream_a_br" placeholder="128k"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Width"]+'</span></div>'
tmp+=' <div><input class="form-control" type="number" min="1" channel-detail="stream_scale_x" placeholder="Example : 640"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Height"]+'</span></div>'
tmp+=' <div><input class="form-control" type="number" min="1" channel-detail="stream_scale_y" placeholder="Example : 480"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Rotate"]+'</span></div>'
tmp+=' <div><select class="form-control" channel-detail="rotate_stream">'
tmp+=' <option value="no" selected>'+lang["No Rotation"]+'</option>'
tmp+=' <option value="2,transpose=2">'+lang["180 Degrees"]+'</option>'
tmp+=' <option value="0">'+lang["90 Counter Clockwise and Vertical Flip (default)"]+'</option>'
tmp+=' <option value="1">'+lang["90 Clockwise"]+'</option>'
tmp+=' <option value="2">'+lang["90 Clockwise and Vertical Flip"]+'</option>'
tmp+=' <option value="3">'+lang["90 Clockwise and Vertical Flip"]+'</option>'
tmp+=' </select></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Video Filter"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="svf"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' <div class="form-group">'
tmp+=' <label><div><span>'+lang["Stream Flags"]+'</span></div>'
tmp+=' <div><input class="form-control" channel-detail="cust_stream"></div>'
tmp+=' </label>'
tmp+=' </div>'
tmp+=' </div>'
tmp+=' </div>'
tmp+=`${getAdditionalStreamChannelFields(tempID,options.channel)}`
monitorStreamChannels.append(tmp)
monitorStreamChannels.find('.stream-channel').last().find('[channel-detail="stream_vcodec"]').change()
return tempID;

View File

@ -55,3 +55,21 @@
</div>
</form>
</main>
<%
var drawBlock
var buildOptions
%>
<%
include fieldBuilders.ejs
%>
<script>
var monitorSettingsAdditionalInputMapFieldHtml = `<% Object.keys(define["Monitor Settings Additional Input Map"].blocks).forEach(function(blockKey){
drawBlock(define["Monitor Settings Additional Input Map"].blocks[blockKey])
}) %>`
</script>
<script>
var monitorSettingsAdditionalStreamChannelFieldHtml = `<% Object.keys(define["Monitor Settings Additional Stream Channel"].blocks).forEach(function(blockKey){
drawBlock(define["Monitor Settings Additional Stream Channel"].blocks[blockKey])
}) %>`
</script>