0%

CEF49在网页上播放USB摄像头并截图

chromium 52才开始支持navigator.mediaDevices.getUserMedia()这个API,49也没有navigator.getUserMedia()这个接口,但是有个navigator.webkitGetUserMedia(),可以参考这里
首先来枚举所有的音视频设备:

1
navigator.mediaDevices.enumerateDevices().then(x=>{...})

找到数组中kind是videoinput的deviceId然后用deviceId来获取一个stream:

1
navigator.webkitGetUserMedia({video: deviceId}, 成功回调, 失败回调);

然后转换成一个url传递给video标签来播放:

1
video.src = window.webkitURL.createObjectURL(stream);

如果只有一个摄像头直接用 navigator.webkitGetUserMedia({video: true}, 成功回调, 失败回调);也行,获取stream的时候也可以指定一些类似于宽高的属性,MDN都有。
截图到canvas弄成base64网上有代码就不写了。
期间遇到了点问题,比较低版本的cef不支持--unsafely-treat-insecure-origin-as-secure选项导致http链接不能用media device相关的接口,后面虽然有个pr修了但是我也懒得去照着pr改了直接把SecurityPolicy::isOriginWhiteListedTrustworthy改成了永远返回true,这样所有链接都会当成安全链接了(主要是懒得每次用cef都得开这个破选项还这么长)。
另外要用navigator.webkitGetUserMedia()还需要再cefclient的命令行上加上--enable-media-stream选项,这个破选项也是我对着代码理了一大顿才找到的,用老版本的东西真是坑爹。