Jupyter远程使用摄像头、WebRTC聊天室、实时视频处理
前言
使用ipywebrtc组件,获取本地视频流并传输到远程Jupyter服务器,由服务器处理过视频后再回传到本地,最后由ipywidgets.Image
组件展示。
效果体验
建议使用Chrome浏览器
前往官方示例并启用摄像头,即可体现实际效果。
如果你想更深刻地体验示范代码,可以去Binder打开任意一个.ipynb
文件,一步步运行即可。
准备工作
需要先安装ipywebrtc
组件,有两种方法,简单的办法是直接通过pip
安装(需要jupyter版本在5.3及以上):
pip install ipywebrtc
第二种是通过github安装最新预览版:
git clone https://github.com/maartenbreddels/ipywebrtc
cd ipywebrtc
pip install -e .
jupyter nbextension install --py --symlink --sys-prefix ipywebrtc
jupyter nbextension enable --py --sys-prefix ipywebrtc
如果你使用的是jupyter lab,那么只需要在终端运行以下语句:
jupyter labextension install jupyter-webrtc
使用方法
完成准备工作后,首先需要在Jupyter文件中引用ipywebrtc
库,然后创建一个流,可用的流请见下文组件介绍部分,这里以CameraStream
为例,使用本地前置摄像头:
from ipywebrtc import CameraStream
camera = CameraStream.facing_user(audio=False)
camera
不出意外的话,Chrome浏览器会弹窗询问是否允许网页使用摄像头,选择允许后,就可在输出区看到摄像头拍到的视频了。
如果Chrome不弹出提示,而是显示
Error creating view for media stream: Only secure origins are allowed
,则表示浏览器认为当前网站不安全(没有使用https
连接),因此禁用了摄像头。最简单的解决方法是在Chrome快捷方式的“目标”一栏最后加上--unsafely-treat-insecure-origin-as-secure="http://host_ip:port"
并重启即可(把host_ip:port
修改为自己的服务器地址)
但这时候,视频还只是在本地显示,并没有上传到Python内核所在的服务器中(假设你使用的是远程服务器),因此也就没办法在Python上下文中获取视频内容。
所以下一步,我们需要创建一个ImageRecorder
来记录流媒体,并以图片的形式发送给服务器上的Python内核:
from ipywebrtc import ImageRecorder
image_recorder = ImageRecorder(stream=camera)
image_recorder
运行这段代码,会显示ImageRecorder
组件,点击组件上的相机图标,即可抓拍来自stream
的画面。
之后,再通过访问image_recorder.image.value
并转换成Pillow
格式,即可在Python内获取该图片:
import PIL.Image
import io
im = PIL.Image.open(io.BytesIO