环境
- windows 10 64bit
- streamlit 1.13.0
- streamlit-webrtc 0.43.4
简介
前文介绍过 Streamlit 这个可以快速创建 web
应用的开源库,不过 streamlit
本身并不善于处理实时的音视频,本文介绍 streamlit
的扩展库 streamlit-webrtc
,它可以帮助我们方便的处理和传输实时音视频。
安装
使用 pip
命令快速安装
pip install -U streamlit-webrtc
实例
streamlit-webrtc
的基本使用非常简单,与 streamlit
的其它组件用法类似,只是多了一个参数 key
,用于唯一标识
# app.py
from streamlit_webrtc import webrtc_streamer
# 这里的key代表唯一标识
webrtc_streamer(key="sample")
然后,就可以启动服务了,启动的方法不变
streamlit run app.py
服务启动后,浏览器自动打开了链接 http://localhost:8501/
点击 START
,开始读取摄像头数据
点击 STOP
,关闭摄像头
在很多时候,我们需要读取音视频并进行处理,这时候,我们可以使用音视频的 callback
,下面看个视频处理的例子
from streamlit_webrtc import webrtc_streamer
import av
def video_frame_callback(frame):
img = frame.to_ndarray(format="bgr24")
# 图像翻转
flipped = img[::-1,:,:]
return av.VideoFrame.from_ndarray(flipped, format="bgr24")
# 如果是音频的话,使用 audio_frame_callback
webrtc_streamer(key="example", video_frame_callback=video_frame_callback)
示例中使用了 pyav
这个库,它基于 ffmpeg
,回调函数 video_frame_callback
中的 frame
是 pyav
中的 av.VideoFrame
(音频是 av.AudioFrame
) 实例,针对每一帧的数据都进行图像的翻转,最后的效果是这样的
接下来,结合 streamlit
中的 checkbox
组件,将用户的输入和实时视频的处理进行结合
import streamlit as st
from streamlit_webrtc import webrtc_streamer
import av
# 选择框
flip = st.checkbox("Flip")
def video_frame_callback(frame):
img = frame.to_ndarray(format="bgr24")
# 根据用户的选择来判断视频帧是否要进行翻转
flipped = img[::-1,:,:] if flip else img
return av.VideoFrame.from_ndarray(flipped, format="bgr24")
webrtc_streamer(key="example", video_frame_callback=video_frame_callback)
这里需要注意的是,callback
是在 fork
出来的线程中执行的,因此,在 callback
内部和外部之间的数据传递必须是线程安全的。在 callback
里,streamlit
中的组件,如 streamlit.title
等是无法工作的,global
关键字也无法达到你的数据处理预期,就不要去使用了。