欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

streamlit 处理实时视频

Python 迷途小书童 1年前 (2022-10-30) 3298次浏览 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)

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

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

请关闭 Adblock 等类似浏览器插件,然后刷新页面访问,感谢您的支持!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.