Skip to content

Instantly share code, notes, and snippets.

@vitosamson
Last active December 27, 2023 01:07
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save vitosamson/90b547a7fe0ac1c39da0 to your computer and use it in GitHub Desktop.
Save vitosamson/90b547a7fe0ac1c39da0 to your computer and use it in GitHub Desktop.
foscam streaming
<canvas height="720" width="1280" id="canvas"></canvas>
<button id="snapshotBtn">snapshot</button>
<script>
var fragments = [];
var frames = [];
var ws = new WebSocket('ws://192.168.1.3:4001');
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var reader = new FileReader();
ws.binaryType = 'arraybuffer';
ws.onmessage = function(data) {
fragments.push(data.data);
if (
fragments.length > 2 &&
data.data.byteLength !== fragments[fragments.length - 2].byteLength
) {
draw();
fragments = [];
}
}
reader.onload = function(e) {
var image = new Image();
image.src = e.target.result;
image.onload = function() {
try {
ctx.drawImage(image, 0, 0);
} catch(e) {
console.log('bad image');
}
}
}
function draw() {
var bytes = fragments.map(function(f) { return new Uint8Array(f).buffer; });
var blob = new Blob(bytes, { type: 'image/jpg' });
frames.push(blob);
reader.readAsDataURL(blob);
}
var snapshotBtn = document.getElementById('snapshotBtn');
snapshotBtn.addEventListener('click', function() {
var a = document.createElement('a');
var lastFrame = frames[frames.length - 1];
var url = window.URL.createObjectURL(lastFrame);
a.href = url;
a.download = 'snapshot.jpg';
a.style.display = 'none';
document.body.appendChild(a);
a.click();
});
</script>
const ws = require('ws');
const child_process = require('child_process');
const wsServer = new ws.Server({
port: 4001,
});
const ffmpeg = child_process.spawn('ffmpeg', [
'-i', 'rtsp://user:pass@192.168.1.200:88/videoMain',
'-f', 'image2pipe',
'-vf', 'fps=1',
'-qscale:v', '2',
'-',
], { detached: false });
ffmpeg.stdout.on('data', data => {
wsServer.clients.map(client => {
client.send(data, { binary: true });
});
});
ffmpeg.stderr.on('data', data => {
console.log(data.toString());
});
ffmpeg.on('error', e => {
console.log(e);
});
wsServer.on('connection', () => {
console.log('new connection');
});
@StefanRu1
Copy link

Hi,

i have a problem using server.js.
Error is:
`/home/pi/mjepgstream/server.js:17
wsServer.clients.map(client => {
^

TypeError: wsServer.clients.map is not a function
at Socket.ffmpeg.stdout.on.data (/home/pi/mjepgstream/server.js:17:20)
at emitOne (events.js:96:13)
at Socket.emit (events.js:189:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at Pipe.onread (net.js:551:20)
`

Is the node.js to new?
pi@raspberrypi:~/mjepgstream $ node -v
v7.6.0

Best regards,
Stefan

@vitosamson
Copy link
Author

@StefanRu1 since this gist is from a while ago, it's possible (likely) the version of ws you installed is newer and has a different api. I was using ws@0.8.0 at the time, if that helps.

@StefanRu1
Copy link

Ok, thank you very much. I will try to use a older ws version. Did you find an other solution for rstp streaming to html?

@jazeee
Copy link

jazeee commented Mar 31, 2017

From https://github.com/websockets/ws#broadcast-example
Try changing clients.map to clients.forEach
It does work with that change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment