streamlit-webrtc

streamlit-webrtc

Streamlit实时视频音频处理与传输组件

streamlit-webrtc是一个为Streamlit设计的实时视频音频处理组件。它支持对象检测、OpenCV滤镜、视频流传输和音频处理等功能。通过简单的代码即可实现视频聊天应用。该组件提供回调机制,方便自定义处理逻辑。支持远程部署,配置HTTPS和STUN/TURN服务器,确保在不同网络环境中稳定运行。适用于快速开发基于Web的实时视频音频处理应用。

streamlit-webrtc实时视频处理WebRTC音频流处理Streamlit组件Github开源项目

streamlit-webrtc

使用Streamlit处理和传输网络上的实时视频/音频流 在Streamlit中打开

测试 前端测试 Ruff

PyPI PyPI - Python版本 PyPI - 许可证 PyPI - 下载量

<table> <tr> <td width="48%"> <a href="https://share.streamlit.io/whitphx/streamlit-webrtc-example/main/app.py"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/381e9c22-2415-48c4-94ed-2c36500cce66.gif" /> </a> </td> <td width="48%"> <a href="https://share.streamlit.io/whitphx/style-transfer-web-app/main/app.py"> <img src="https://yellow-cdn.veclightyear.com/835a84d5/f6a83fe9-6bf6-4c7a-8e75-8382076c7032.gif" /> </a> </td> </tr> </table>

姊妹项目:streamlit-fesion,用于在浏览器中使用Wasm执行视频滤镜。

示例

⚡️包含以下示例及更多内容的展示🎈在线演示

  • 物体检测
  • OpenCV滤镜
  • 单向视频流
  • 音频处理

⚡️实时语音转文字🎈在线演示

它可以实时将你的语音转换为文字。 这个应用是自包含的;它不依赖任何外部API。

⚡️实时视频风格迁移🎈在线演示

它可以将各种风格迁移滤镜应用于实时视频流。

⚡️视频聊天

(在线演示不可用)

你可以用约100行Python代码创建视频聊天应用。

⚡️东京2020奥运会图标🎈在线演示

使用MediaPipe进行姿势估计。

安装

$ pip install -U streamlit-webrtc

快速教程

另请参阅示例页面,pages/*.py,其中包含各种用法。

另请参阅"使用Streamlit快速开发基于Web的实时视频/音频处理应用"


创建app.py,内容如下。

from streamlit_webrtc import webrtc_streamer webrtc_streamer(key="sample")

与其他Streamlit组件不同,webrtc_streamer()需要key参数作为唯一标识符。为其设置一个任意字符串。

然后用Streamlit运行它并打开http://localhost:8501/。

$ streamlit run app.py

你会看到应用视图,点击"START"按钮。

然后,视频和音频流开始。如果被要求允许访问摄像头和麦克风,请允许。 streamlit-webrtc的基本示例

接下来,编辑app.py如下并再次运行。

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") webrtc_streamer(key="example", video_frame_callback=video_frame_callback)

现在视频垂直翻转了。 垂直翻转示例

如上面的示例所示,你可以通过定义一个接收和返回帧的回调函数,并将其传递给video_frame_callback参数(或用于音频操作的audio_frame_callback)来编辑视频帧。 输入和输出帧是PyAVav.VideoFrame(或处理音频时的av.AudioFrame)实例。

你可以在回调函数中注入任何类型的图像(或音频)处理。 查看上面的示例以了解更多应用。

向回调传递参数

你也可以向回调传递参数。

在下面的示例中,使用了一个布尔型flip标志来开启/关闭图像翻转。

import streamlit as st from streamlit_webrtc import webrtc_streamer import av flip = st.checkbox("翻转") 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)

从回调中获取值

有时我们想要从外部作用域读取回调中生成的值。

请注意,回调是在独立于主脚本运行的分叉线程中执行的,所以我们必须注意以下几点,并需要一些技巧来实现,如下面的示例(另请参阅下面关于由于多线程导致的回调中的一些限制的部分)。

  • 线程安全
    • 在回调内部和外部之间传递值必须是线程安全的。
  • 使用循环来轮询值
    • 在媒体流传输期间,当回调继续被调用时,主脚本执行会像往常一样在底部停止。所以我们需要使用一个循环来保持主脚本运行,并在外部作用域中从回调获取值。

以下示例是将图像帧从回调传递到外部作用域,并在循环中持续处理它。在此示例中,对图像帧进行了简单的图像分析(计算直方图,如这个OpenCV教程)。

threading.Lock是一种标准方法,用于控制跨线程的变量访问。 这里的dict对象img_container是一个由回调和外部作用域共享的可变容器,lock对象用于在为容器分配和读取值时确保线程安全。

import threading import cv2 import streamlit as st from matplotlib import pyplot as plt from streamlit_webrtc import webrtc_streamer lock = threading.Lock() img_container = {"img": None} def video_frame_callback(frame): img = frame.to_ndarray(format="bgr24") with lock: img_container["img"] = img return frame ctx = webrtc_streamer(key="example", video_frame_callback=video_frame_callback) fig_place = st.empty() fig, ax = plt.subplots(1, 1) while ctx.state.playing: with lock: img = img_container["img"] if img is None: continue gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ax.cla() ax.hist(gray.ravel(), 256, [0, 256]) fig_place.pyplot(fig)

回调限制

回调在不同于主线程的分叉线程中执行,因此存在一些限制:

  • Streamlit方法(st.*st.write())在回调内部不起作用。
  • 无法从外部直接引用回调内部的变量。
  • global关键字在回调中不会按预期工作。
  • 在从外部和回调内部访问相同对象时,您必须注意线程安全性,如上一节所述。

基于类的回调

直到v0.37版本,基于类的回调是标准做法。 关于它的信息,请参阅README的旧版本

从远程主机提供服务

将应用程序部署到远程服务器时,需要注意一些事项。 简而言之,

  • 需要HTTPS才能访问本地媒体设备。
  • 需要STUN/TURN服务器来建立媒体流连接。

请参阅以下部分。

HTTPS

streamlit-webrtc使用getUserMedia() API来访问本地媒体设备,而这个方法在不安全的上下文中不起作用。

这篇文档

安全上下文简而言之是使用HTTPS或file:///URL方案加载的页面,或从localhost加载的页面。

因此,当在远程服务器上托管您的应用程序时,如果您的应用程序使用网络摄像头或麦克风,则必须通过HTTPS提供服务。 如果不这样做,在开始使用设备时会遇到错误。例如,在Chrome上会出现类似以下的错误。

错误:navigator.mediaDevices未定义。似乎当前文档未安全加载。

Streamlit Community Cloud是推荐的HTTPS服务方式。您可以轻松地使用它部署Streamlit应用程序,最重要的是,它默认自动通过HTTPS提供应用程序服务。

出于开发目的,有时suyashkumar/ssl-proxy是一个方便的工具,可以通过HTTPS提供您的应用程序服务。

$ streamlit run your_app.py # 假设您的应用程序在http://localhost:8501上运行 # 然后,从上面的GitHub页面下载二进制文件到./ssl-proxy后, $ ./ssl-proxy -from 0.0.0.0:8000 -to 127.0.0.1:8501 # 通过HTTPS将HTTP页面从端口8501代理到端口8000 # 然后访问https://localhost:8000

配置STUN服务器

要将应用程序部署到云端,我们必须通过webrtc_streamer()上的rtc_configuration参数配置STUN服务器,如下所示。

webrtc_streamer( # ... rtc_configuration={ # 添加此配置 "iceServers": [{"urls": ["stun:stun.l.google.com:19302"]}] } # ... )

当服务器在远程主机上时,此配置对于建立媒体流连接是必要的。

:warning: 在某些环境中,包括Streamlit Community Cloud,您可能还需要设置TURN服务器。另请参阅下一节。

streamlit_webrtc使用WebRTC进行视频和音频流传输。它必须访问全球网络中的"STUN服务器",以便远程对等点(准确地说,NAT后的对等点)建立WebRTC连接。 由于我们在这里不详细介绍STUN服务器,如果感兴趣,请用STUN、TURN或NAT遍历等关键词进行搜索,或阅读这些文章(1, 2, 3)。

上面的示例配置使用stun.l.google.com:19302,这是Google提供的免费STUN服务器。

您也可以使用任何其他STUN服务器。 例如,一位用户报告在中国网络中使用Google的STUN服务器时出现了巨大延迟,通过更改STUN服务器解决了这个问题。

对于了解浏览器WebRTC API的人来说:rtc_configuration参数的值将传递给前端的RTCPeerConnection构造函数。

必要时配置TURN服务器

即使正确配置了STUN服务器,在某些网络环境中,无论是从服务器还是从客户端,媒体流传输可能都无法工作。 例如,如果服务器托管在代理后面,或者如果客户端在防火墙后面的办公网络中,WebRTC数据包可能会被阻止(Streamlit Community Cloud就是这种情况)。这篇文章总结了可能出现的情况。 在这种环境下,需要使用 TURN 服务器

设置 TURN 服务器有以下几种选择:

日志记录

对于日志记录,该库使用标准的 logging 模块,并遵循官方日志教程中描述的实践。因此,日志记录器名称与模块名称相同 - streamlit_webrtcstreamlit_webrtc.*

你可以通过 logging.getLogger("streamlit_webrtc") 获取日志记录器实例,通过它可以控制来自该库的日志。

例如,如果你想将此库的日志记录器级别设置为 WARNING,可以使用以下代码:

st_webrtc_logger = logging.getLogger("streamlit_webrtc") st_webrtc_logger.setLevel(logging.WARNING)

实际上,该库内部使用的第三方包 aiortc 也会发出许多 INFO 级别的日志,你可能也想控制它的日志。 你可以用同样的方式做到这一点,如下所示:

aioice_logger = logging.getLogger("aioice") aioice_logger.setLevel(logging.WARNING)

API 变更

目前还没有关于接口的文档。请参考 ./pages/*.py 中的示例了解使用方法。 API 尚未最终确定,在未来的版本中可能会在没有向后兼容性的情况下进行更改,直到 v1.0 版本。

对于使用 <0.20 版本的用户

VideoTransformerBase 及其 transform 方法在 v0.20.0 中已被标记为已弃用。请改用 VideoProcessorBase#recv()。 请注意,recv 方法的签名与 transform 不同,recv 必须返回 av.VideoFrameav.AudioFrame 的实例。

另外,webrtc_streamer()video_transformer_factoryasync_transform 参数也已弃用,请分别使用 video_processor_factoryasync_processing

有关它们的用法,请参见 app.py 中的示例。

资源

支持项目

ko-fi

<a href="https://www.buymeacoffee.com/whitphx" target="_blank" rel="noreferrer"><img src="https://yellow-cdn.veclightyear.com/835a84d5/924649cb-9828-4a1b-ab90-8a9c305a0771.png" alt="Buy Me A Coffee" width="180" height="50" ></a>

GitHub Sponsors

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多