欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

streamlit 处理实时视频

Python 迷途小书童 2年前 (2022-10-30) 4890次浏览 0个评论

环境

  • 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/

streamlit webrtc

点击 START,开始读取摄像头数据

streamlit webrtc

点击 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 中的 framepyav 中的 av.VideoFrame(音频是 av.AudioFrame) 实例,针对每一帧的数据都进行图像的翻转,最后的效果是这样的

streamlit webrtc

接下来,结合 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)

streamlit webrtc

这里需要注意的是,callback 是在 fork 出来的线程中执行的,因此,在 callback 内部和外部之间的数据传递必须是线程安全的。在 callback 里,streamlit 中的组件,如 streamlit.title 等是无法工作的,global 关键字也无法达到你的数据处理预期,就不要去使用了。

参考资料

喜欢 (1)

您必须 登录 才能发表评论!