cleanup Additional Input and Stream Channel field generation
parent
f9122e23af
commit
0e82ecf113
|
@ -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"],
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue