I finally have a simple working example for (relatively old) Chrome, Firefox, and Opera browsers. But NOT for Safari. Thanks for everyone's help.
coclass'webcam' coinsert'jhs' HBS=: 0 : 0 jhh1'webcam - https://davidwalsh.name/browser-camera' jhhr '<video id="video" width="640" height="480" autoplay></video>' 'snap'jhb'Snap Photo' '<canvas id="canvas" width="640" height="480"></canvas>' ) jev_get=: 3 : 0 'webcam'jhrx(getcss''),(getjs''),gethbs'' ) JS=: 0 : 0 function ev_body_load(){init();} // must use JHS framework load handler function errBack(){alert("ERROR");} // javascript event handlers function ev_snap_click(){context.drawImage(video, 0, 0, 640, 480);} function init() { // Grab elements, create settings, etc. canvas = document.getElementById('canvas'); context = canvas.getContext('2d'); video = document.getElementById('video'); if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { // Not adding `{ audio: true }` since we only want video now navigator.mediaDevices.getUserMedia({ video: true }).then(function(stream) { video.src = window.URL.createObjectURL(stream); video.play(); }); } else if(navigator.getUserMedia) { // Standard navigator.getUserMedia({ video: true }, function(stream) { video.src = stream; video.play(); }, errBack); } else if(navigator.webkitGetUserMedia) { // WebKit-prefixed navigator.webkitGetUserMedia({ video: true }, function(stream){ video.src = window.webkitURL.createObjectURL(stream); video.play(); }, errBack); } else if(navigator.mozGetUserMedia) { // Mozilla-prefixed navigator.mozGetUserMedia({ video: true }, function(stream){ video.src = window.URL.createObjectURL(stream); video.play(); }, errBack); } } ) ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm