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

编辑推荐精选

TRAE编程

TRAE编程

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

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

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多