Я читаю видео и сохраняю клоны экземпляров Mat каждого кадра в массив, чтобы я мог воспроизвести его по требованию, а также проанализировать кадры.Как только я обработал видео и сохранил кадры в массиве - снимок памяти увеличивается с 150 МБ до 1000 МБ в JSArrayBufferData.
Я должен упомянуть, что я использую инфраструктуру внешнего интерфейса Vue.js для хранения массива вНаблюдаемые данные vue - это массив.
Я попытался удалить и установить каждый кадр в ноль, просто чтобы посмотреть, освободит ли это память, но, похоже, ничего не работает.
Возможно, он также имеетчто-то сделать из-за меня с помощью рекурсивного вызова функции https://jsfiddle.net/j93tmr6f/
new Vue({
el: "#app",
data: {
videoFrames: [],
videoFile: null,
frame: null,
videoCap: null,
},
methods: {
videoEnded() {
console.log('ended')
this.streaming = false
// show first frame from small frames array
this.playFrame(this.videoFrames[11])
},
videoChanged: function(fieldName, file){
this.videoFile = URL.createObjectURL(file[0])
this.$refs.videoRef.src = this.videoFile
this.loadFrames()
},
loadFrames() {
this.isProcessing = true
this.streaming = true
this.videoFrames = []
const videoRef = this.$refs.videoRef
const [height, width] = [720, 1280]
this.$refs.canvasOutput.width = width / 2
this.$refs.canvasOutput.height = height / 2
videoRef.width = width
videoRef.height = height
this.videoCap = new cv.VideoCapture(videoRef)
videoRef.play()
setTimeout(this.scanFrames, 0)
},
scanFrames() {
if (!this.streaming) return
try {
const [height, width] = [720, 1280]
this.frame = new cv.Mat(height, width, cv.CV_8UC4)
let begin = Date.now()
this.videoCap.read(this.frame)
this.videoFrames.push(this.frame.clone())
cv.imshow('canvasOutput', this.frame)
// remove the processed frame from memory.
this.frame.delete()
// schedule the next one.
let delay = 1000 / this.FPS - (Date.now() - begin)
setTimeout(this.scanFrames, delay)
} catch (err) {
console.log(err)
}
},
}
})
более или менее это структура кода.Он не работает на скрипке из-за ошибок памяти.
Я хотел бы освободить память из хрома, потому что каждый раз, когда я сейчас анализирую видео, она может занимать до 9 ГБ в объеме памяти.Как вы можете себе представить, это не желаемый результат.