Option to auto compress Continuous and Event-Based Recording

archive-videos
Moe 2022-08-18 19:00:29 -07:00
parent 0cecfbe643
commit a6788fec79
6 changed files with 93 additions and 32 deletions

View File

@ -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"
}
]
}
]
},

View File

@ -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.",

View File

@ -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"]

View File

@ -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 = []
})

View File

@ -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)
})
})
}
}

View File

@ -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)
})