Option to auto compress Continuous and Event-Based Recording
parent
0cecfbe643
commit
a6788fec79
|
@ -119,6 +119,21 @@ module.exports = function(s,config,lang){
|
|||
"description": lang["fieldTextDir"],
|
||||
"fieldType": "select",
|
||||
"possible": s.listOfStorage
|
||||
},
|
||||
{
|
||||
"name": "detail=auto_compress_videos",
|
||||
"field": lang['Compress Completed Videos'],
|
||||
"fieldType": "select",
|
||||
"possible": [
|
||||
{
|
||||
"name": lang.No,
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"name": lang.Yes,
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
@ -496,6 +496,7 @@
|
|||
"confirmDeleteFilter": "Do you want to delete this filter? You cannot recover it.",
|
||||
"Fix Video": "Fix Video",
|
||||
"Compress Videos": "Compress Videos",
|
||||
"Compress Completed Videos": "Compress Completed Videos",
|
||||
"FixVideoMsg": "Do you want to fix this video? This will create a new file and overwrite the old one. You cannot undo this action.",
|
||||
"DeleteVideoMsg": "Do you want to delete this video? You cannot recover it.",
|
||||
"CompressVideoMsg": "Do you want to compress this video? The original will be moved to your FileBin. Videos that are already completed compressing will be skipped if already queued.",
|
||||
|
|
|
@ -21,7 +21,8 @@ module.exports = (s,config,lang,app,io) => {
|
|||
moveCameraPtzToMatrix
|
||||
} = require('../control/ptz.js')(s,config,lang)
|
||||
const {
|
||||
cutVideoLength
|
||||
cutVideoLength,
|
||||
reEncodeVideoAndBinOriginalAddToQueue
|
||||
} = require('../video/utils.js')(s,config,lang)
|
||||
const {
|
||||
isEven,
|
||||
|
@ -571,7 +572,23 @@ module.exports = (s,config,lang,app,io) => {
|
|||
}
|
||||
s.insertCompletedVideo(monitorConfig,{
|
||||
file : filename,
|
||||
})
|
||||
},function(err,response){
|
||||
const autoCompressionEnabled = monitorDetails.auto_compress_videos === '1';
|
||||
if(autoCompressionEnabled){
|
||||
reEncodeVideoAndBinOriginalAddToQueue({
|
||||
video: response.insertQuery,
|
||||
targetVideoCodec: 'vp9',
|
||||
targetAudioCodec: 'libopus',
|
||||
targetQuality: '-q:v 1 -q:a 1',
|
||||
targetExtension: 'webm',
|
||||
doSlowly: false
|
||||
}).then((encodeResponse) => {
|
||||
s.debugLog('Complete Automatic Compression',encodeResponse)
|
||||
}).catch((err) => {
|
||||
console.log(err)
|
||||
})
|
||||
}
|
||||
});
|
||||
s.userLog(d,{
|
||||
type: logTitleText,
|
||||
msg: lang["Detector Recording Complete"]
|
||||
|
|
|
@ -982,6 +982,9 @@ module.exports = function(s,config,lang){
|
|||
}
|
||||
}
|
||||
const catchNewSegmentNames = function(e){
|
||||
const monitorConfig = s.group[e.ke].rawMonitorConfigurations[e.id]
|
||||
const monitorDetails = monitorConfig.details
|
||||
const autoCompressionEnabled = monitorDetails.auto_compress_videos === '1'
|
||||
var checkLog = function(d,x){return d.indexOf(x)>-1}
|
||||
s.group[e.ke].activeMonitors[e.id].spawn.stdio[8].on('data',function(d){
|
||||
d=d.toString();
|
||||
|
@ -990,7 +993,7 @@ module.exports = function(s,config,lang){
|
|||
s.insertCompletedVideo(e,{
|
||||
file: filename,
|
||||
events: s.group[e.ke].activeMonitors[e.id].detector_motion_count
|
||||
},function(err){
|
||||
},function(err,response){
|
||||
s.userLog(e,{type:lang['Video Finished'],msg:{filename:d}})
|
||||
if(
|
||||
e.details.detector === '1' &&
|
||||
|
@ -1008,6 +1011,20 @@ module.exports = function(s,config,lang){
|
|||
ke : e.ke,
|
||||
id : e.id
|
||||
})
|
||||
}else if(autoCompressionEnabled){
|
||||
s.debugLog('Queue Automatic Compression',response.insertQuery)
|
||||
reEncodeVideoAndBinOriginalAddToQueue({
|
||||
video: response.insertQuery,
|
||||
targetVideoCodec: 'vp9',
|
||||
targetAudioCodec: 'libopus',
|
||||
targetQuality: '-q:v 1 -q:a 1',
|
||||
targetExtension: 'webm',
|
||||
doSlowly: false
|
||||
}).then((encodeResponse) => {
|
||||
s.debugLog('Complete Automatic Compression',encodeResponse)
|
||||
}).catch((err) => {
|
||||
console.log(err)
|
||||
})
|
||||
}
|
||||
s.group[e.ke].activeMonitors[e.id].detector_motion_count = []
|
||||
})
|
||||
|
|
|
@ -63,16 +63,14 @@ module.exports = function(s,config,lang){
|
|||
})
|
||||
}
|
||||
s.insertDatabaseRow = function(e,k,callback){
|
||||
s.checkDetails(e)
|
||||
//save database row
|
||||
if(!k.details)k.details = {}
|
||||
if(e.details && e.details.dir && e.details.dir !== ''){
|
||||
k.details.dir = e.details.dir
|
||||
}
|
||||
s.knexQuery({
|
||||
action: "insert",
|
||||
table: "Videos",
|
||||
insert: {
|
||||
return new Promise((resolve) => {
|
||||
s.checkDetails(e)
|
||||
//save database row
|
||||
if(!k.details)k.details = {}
|
||||
if(e.details && e.details.dir && e.details.dir !== ''){
|
||||
k.details.dir = e.details.dir
|
||||
}
|
||||
const insertQuery = {
|
||||
ke: e.ke,
|
||||
mid: e.mid,
|
||||
time: k.startTime,
|
||||
|
@ -83,10 +81,20 @@ module.exports = function(s,config,lang){
|
|||
size: k.filesize,
|
||||
end: k.endTime,
|
||||
}
|
||||
},(err) => {
|
||||
if(callback)callback(err)
|
||||
fs.chmod(k.dir+k.file,0o777,function(err){
|
||||
|
||||
s.knexQuery({
|
||||
action: "insert",
|
||||
table: "Videos",
|
||||
insert: insertQuery
|
||||
},(err) => {
|
||||
const response = {
|
||||
ok: !err,
|
||||
err: err,
|
||||
insertQuery: insertQuery,
|
||||
}
|
||||
if(callback)callback(err,response)
|
||||
fs.chmod(k.dir+k.file,0o777,function(err){
|
||||
resolve(response)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
@ -113,7 +121,7 @@ module.exports = function(s,config,lang){
|
|||
})
|
||||
}
|
||||
}
|
||||
if(k.fileExists===true){
|
||||
if(k.fileExists === true){
|
||||
//close video row
|
||||
k.details = k.details && k.details instanceof Object ? k.details : {}
|
||||
var listOEvents = activeMonitor.detector_motion_count || []
|
||||
|
@ -127,17 +135,18 @@ module.exports = function(s,config,lang){
|
|||
k.startTime = new Date(s.nameToTime(k.file))
|
||||
k.endTime = new Date(k.endTime || k.stat.mtime)
|
||||
//send event for completed recording
|
||||
const response = {
|
||||
mid: e.mid,
|
||||
ke: e.ke,
|
||||
filename: k.filename,
|
||||
ext: k.ext,
|
||||
filesize: k.filesize,
|
||||
objects: k.objects,
|
||||
time: s.timeObject(k.startTime).format('YYYY-MM-DD HH:mm:ss'),
|
||||
end: s.timeObject(k.endTime).format('YYYY-MM-DD HH:mm:ss')
|
||||
}
|
||||
if(config.childNodes.enabled === true && config.childNodes.mode === 'child' && config.childNodes.host){
|
||||
const response = {
|
||||
mid: e.mid,
|
||||
ke: e.ke,
|
||||
filename: k.filename,
|
||||
ext: k.ext,
|
||||
size: k.filesize,
|
||||
filesize: k.filesize,
|
||||
objects: k.objects,
|
||||
time: s.timeObject(k.startTime).format('YYYY-MM-DD HH:mm:ss'),
|
||||
end: s.timeObject(k.endTime).format('YYYY-MM-DD HH:mm:ss')
|
||||
}
|
||||
var filePath = k.dir + k.filename;
|
||||
sendVideoToMasterNode(filePath,response)
|
||||
}else{
|
||||
|
@ -171,9 +180,11 @@ module.exports = function(s,config,lang){
|
|||
s.onBeforeInsertCompletedVideoExtensions.forEach(function(extender){
|
||||
extender(e,k)
|
||||
})
|
||||
s.insertDatabaseRow(e,k,callback)
|
||||
s.insertCompletedVideoExtensions.forEach(function(extender){
|
||||
extender(e,k,response)
|
||||
s.insertDatabaseRow(e,k,(err,response) => {
|
||||
if(callback)callback(err,response);
|
||||
s.insertCompletedVideoExtensions.forEach(function(extender){
|
||||
extender(e,k,response.insertQuery,response)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1824,7 +1824,7 @@ module.exports = function(s,config,lang,app,io){
|
|||
targetExtension: 'webm',
|
||||
doSlowly: false
|
||||
}).then((encodeResponse) => {
|
||||
s.debugLog('Complete Encoding',encodeResponse)
|
||||
s.debugLog('Complete Compression',encodeResponse)
|
||||
}).catch((err) => {
|
||||
console.log(err)
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue