zigzackattack の回答を読んだ後に思いついたのは次のとおりです。簡単にするために「datauri」パッケージを使用しますが、最終的な画像をより細かく制御するために、代わりに「node-canvas」パッケージのテストにも成功しました。
var mjpeg2jpegs = require('mjpeg2jpegs')
const Datauri = require('datauri')
var camURL = '/videostream.cgi?user=admin&pwd=password'
var camPort = 81
var camTimeout = 10000
var FPS_DIVIDER = 1
var options = {
hostname: '192.168.1.241',
port: camPort,
path: camURL,
timeout: camTimeout
}
function startCamStream (camName, options) {
var http = require('http')
var req = http.request(options, mjpeg2jpegs(function (res) {
var data
var pos = 0
var count = 0
res.on('imageHeader', function (header) {
// console.log('Image header: ', header)
data = new Buffer(parseInt(header['content-length'], 10))
pos = 0
})
res.on('imageData', function (chunk) {
// console.log('Image data: ', data.length)
chunk.copy(data, pos)
pos += chunk.length
})
res.on('imageEnd', function () {
// console.log('Image end')
if (count++ % FPS_DIVIDER === 0) {
const datauri = new Datauri()
datauri.format('.jpeg', data)
socket.emit(camName, datauri.content) // Send the image uri via websockets.
}
})
})).on('timeout', function () {
console.log('timeout')
startCamStream(camName, options)
}).end()
}
startCamStream('ipcam1', options)
vue.js (オプション) を使用して、画像の uri に img タグを埋め込むだけです。
<img :src="ipcam1" alt="ipcam1" />
FPS_DIVIDER 変数を増やすと、fps 出力が減少します。タイムアウトが発生したときに画像を変更したい場合は、「タイムアウト」コールバックに達したときに「オフライン」画像を送信できます。