Files
2025-06-17 12:04:47 +00:00

2146 lines
65 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://fastrtc.org/reference/stream_handlers/">
<link rel="prev" href="../reply_on_pause/">
<link rel="next" href="../utils/">
<link rel="icon" href="../../fastrtc_logo.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
<title>Stream Handlers - FastRTC</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.342714a4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../stylesheets/extra.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="fastrtc-dark" data-md-color-primary="indigo" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#stream-handlers" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="FastRTC"
class="md-header__button md-logo" aria-label="FastRTC" data-md-component="logo">
<img src="../../fastrtc_logo.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
FastRTC
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Stream Handlers
</span>
</div>
</div>
</div>
<div style="display: flex; align-items: center; margin-right: 1rem;">
<a href="https://hf.co/fastrtc" target="_blank" rel="noopener noreferrer">
<img src="/hf-logo.svg"
onerror="this.onerror=null; this.src='https://huggingface.co/datasets/freddyaboulton/bucket/resolve/main/hf-logo.svg';"
style="height: 24px; margin-right: 10px;">
</a>
<a href="https://gradio.app" target="_blank" rel="noopener noreferrer">
<img src="/gradio-logo.svg"
onerror="this.onerror=null; this.src='https://huggingface.co/datasets/freddyaboulton/bucket/resolve/main/gradio-logo.svg';"
style="height: 24px; margin-right: 10px;">
</a>
<a href="https://discord.gg/TSWU7HyaYu" target="_blank" rel="noopener noreferrer">
<img src="/Discord-Symbol-White.svg" style="height: 16px; margin-right: 10px;">
</a>
</div>
<div class="md-header__source">
<a href="https://github.com/gradio-app/fastrtc" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
fastrtc
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="FastRTC" class="md-nav__button md-logo" aria-label="FastRTC" data-md-component="logo">
<img src="../../fastrtc_logo.png" alt="logo">
</a>
FastRTC
</label>
<div class="md-nav__source">
<a href="https://github.com/gradio-app/fastrtc" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
fastrtc
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
User Guide
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User Guide
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../userguide/streams/" class="md-nav__link">
<span class="md-ellipsis">
Core Concepts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/audio/" class="md-nav__link">
<span class="md-ellipsis">
Audio Streaming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/video/" class="md-nav__link">
<span class="md-ellipsis">
Video Streaming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/audio-video/" class="md-nav__link">
<span class="md-ellipsis">
Audio-Video Streaming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/gradio/" class="md-nav__link">
<span class="md-ellipsis">
Gradio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/api/" class="md-nav__link">
<span class="md-ellipsis">
API
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../cookbook/" class="md-nav__link">
<span class="md-ellipsis">
Cookbook
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/" class="md-nav__link">
<span class="md-ellipsis">
Deployment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced-configuration/" class="md-nav__link">
<span class="md-ellipsis">
Advanced Configuration
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Plugin Ecosystem
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Plugin Ecosystem
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../text_to_speech_gallery/" class="md-nav__link">
<span class="md-ellipsis">
Text-to-Speech Gallery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../speech_to_text_gallery/" class="md-nav__link">
<span class="md-ellipsis">
Speech-to-Text Gallery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../turn_taking_gallery/" class="md-nav__link">
<span class="md-ellipsis">
Turn-taking Gallery
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../utils/" class="md-nav__link">
<span class="md-ellipsis">
Utils
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../faq/" class="md-nav__link">
<span class="md-ellipsis">
Frequently Asked Questions
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" checked>
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
API Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../stream/" class="md-nav__link">
<span class="md-ellipsis">
Stream
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../reply_on_pause/" class="md-nav__link">
<span class="md-ellipsis">
Pause Detection Handlers
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Stream Handlers
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Stream Handlers
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#streamhandlerbase-class" class="md-nav__link">
<span class="md-ellipsis">
StreamHandlerBase Class
</span>
</a>
<nav class="md-nav" aria-label="StreamHandlerBase Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#attributes" class="md-nav__link">
<span class="md-ellipsis">
Attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#methods" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
<nav class="md-nav" aria-label="Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#clear_queue" class="md-nav__link">
<span class="md-ellipsis">
clear_queue
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#send_message" class="md-nav__link">
<span class="md-ellipsis">
send_message
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#send_message_sync" class="md-nav__link">
<span class="md-ellipsis">
send_message_sync
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#reset" class="md-nav__link">
<span class="md-ellipsis">
reset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shutdown" class="md-nav__link">
<span class="md-ellipsis">
shutdown
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#streamhandler-class" class="md-nav__link">
<span class="md-ellipsis">
StreamHandler Class
</span>
</a>
<nav class="md-nav" aria-label="StreamHandler Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#abstract-methods" class="md-nav__link">
<span class="md-ellipsis">
Abstract Methods
</span>
</a>
<nav class="md-nav" aria-label="Abstract Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#receive" class="md-nav__link">
<span class="md-ellipsis">
receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emit" class="md-nav__link">
<span class="md-ellipsis">
emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#start_up" class="md-nav__link">
<span class="md-ellipsis">
start_up
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#asyncstreamhandler-class" class="md-nav__link">
<span class="md-ellipsis">
AsyncStreamHandler Class
</span>
</a>
<nav class="md-nav" aria-label="AsyncStreamHandler Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#abstract-methods_1" class="md-nav__link">
<span class="md-ellipsis">
Abstract Methods
</span>
</a>
<nav class="md-nav" aria-label="Abstract Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#receive_1" class="md-nav__link">
<span class="md-ellipsis">
receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emit_1" class="md-nav__link">
<span class="md-ellipsis">
emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy_1" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#start_up_1" class="md-nav__link">
<span class="md-ellipsis">
start_up
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#audiovideostreamhandler-class" class="md-nav__link">
<span class="md-ellipsis">
AudioVideoStreamHandler Class
</span>
</a>
<nav class="md-nav" aria-label="AudioVideoStreamHandler Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#abstract-methods_2" class="md-nav__link">
<span class="md-ellipsis">
Abstract Methods
</span>
</a>
<nav class="md-nav" aria-label="Abstract Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#video_receive" class="md-nav__link">
<span class="md-ellipsis">
video_receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#video_emit" class="md-nav__link">
<span class="md-ellipsis">
video_emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy_2" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#asyncaudiovideostreamhandler-class" class="md-nav__link">
<span class="md-ellipsis">
AsyncAudioVideoStreamHandler Class
</span>
</a>
<nav class="md-nav" aria-label="AsyncAudioVideoStreamHandler Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#abstract-methods_3" class="md-nav__link">
<span class="md-ellipsis">
Abstract Methods
</span>
</a>
<nav class="md-nav" aria-label="Abstract Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#video_receive_1" class="md-nav__link">
<span class="md-ellipsis">
video_receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#video_emit_1" class="md-nav__link">
<span class="md-ellipsis">
video_emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy_3" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../utils/" class="md-nav__link">
<span class="md-ellipsis">
Utils
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../credentials/" class="md-nav__link">
<span class="md-ellipsis">
TURN Credentials
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#streamhandlerbase-class" class="md-nav__link">
<span class="md-ellipsis">
StreamHandlerBase Class
</span>
</a>
<nav class="md-nav" aria-label="StreamHandlerBase Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#attributes" class="md-nav__link">
<span class="md-ellipsis">
Attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#methods" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
<nav class="md-nav" aria-label="Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#clear_queue" class="md-nav__link">
<span class="md-ellipsis">
clear_queue
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#send_message" class="md-nav__link">
<span class="md-ellipsis">
send_message
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#send_message_sync" class="md-nav__link">
<span class="md-ellipsis">
send_message_sync
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#reset" class="md-nav__link">
<span class="md-ellipsis">
reset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shutdown" class="md-nav__link">
<span class="md-ellipsis">
shutdown
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#streamhandler-class" class="md-nav__link">
<span class="md-ellipsis">
StreamHandler Class
</span>
</a>
<nav class="md-nav" aria-label="StreamHandler Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#abstract-methods" class="md-nav__link">
<span class="md-ellipsis">
Abstract Methods
</span>
</a>
<nav class="md-nav" aria-label="Abstract Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#receive" class="md-nav__link">
<span class="md-ellipsis">
receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emit" class="md-nav__link">
<span class="md-ellipsis">
emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#start_up" class="md-nav__link">
<span class="md-ellipsis">
start_up
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#asyncstreamhandler-class" class="md-nav__link">
<span class="md-ellipsis">
AsyncStreamHandler Class
</span>
</a>
<nav class="md-nav" aria-label="AsyncStreamHandler Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#abstract-methods_1" class="md-nav__link">
<span class="md-ellipsis">
Abstract Methods
</span>
</a>
<nav class="md-nav" aria-label="Abstract Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#receive_1" class="md-nav__link">
<span class="md-ellipsis">
receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emit_1" class="md-nav__link">
<span class="md-ellipsis">
emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy_1" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#start_up_1" class="md-nav__link">
<span class="md-ellipsis">
start_up
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#audiovideostreamhandler-class" class="md-nav__link">
<span class="md-ellipsis">
AudioVideoStreamHandler Class
</span>
</a>
<nav class="md-nav" aria-label="AudioVideoStreamHandler Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#abstract-methods_2" class="md-nav__link">
<span class="md-ellipsis">
Abstract Methods
</span>
</a>
<nav class="md-nav" aria-label="Abstract Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#video_receive" class="md-nav__link">
<span class="md-ellipsis">
video_receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#video_emit" class="md-nav__link">
<span class="md-ellipsis">
video_emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy_2" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#asyncaudiovideostreamhandler-class" class="md-nav__link">
<span class="md-ellipsis">
AsyncAudioVideoStreamHandler Class
</span>
</a>
<nav class="md-nav" aria-label="AsyncAudioVideoStreamHandler Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#abstract-methods_3" class="md-nav__link">
<span class="md-ellipsis">
Abstract Methods
</span>
</a>
<nav class="md-nav" aria-label="Abstract Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#video_receive_1" class="md-nav__link">
<span class="md-ellipsis">
video_receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#video_emit_1" class="md-nav__link">
<span class="md-ellipsis">
video_emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy_3" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="stream-handlers">Stream Handlers</h1>
<p>These abstract base classes define the core interfaces for handling audio and video streams within FastRTC. Concrete handlers like <code>ReplyOnPause</code> inherit from these.</p>
<h2 id="streamhandlerbase-class"><code>StreamHandlerBase</code> Class</h2>
<div class="language-python highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">StreamHandlerBase</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="p">)</span>
</span></code></pre></div>
<p>Base class for handling media streams in FastRTC.</p>
<p>Provides common attributes and methods for managing stream state, communication channels, and basic configuration. This class is intended to be subclassed by concrete stream handlers like <code>StreamHandler</code> or <code>AsyncStreamHandler</code>.</p>
<h3 id="attributes">Attributes</h3>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>expected_layout</code></td>
<td style="text-align: left;"><code>Literal["mono", "stereo"]</code></td>
<td style="text-align: left;">The expected channel layout of the input audio ('mono' or 'stereo').</td>
</tr>
<tr>
<td style="text-align: left;"><code>output_sample_rate</code></td>
<td style="text-align: left;"><code>int</code></td>
<td style="text-align: left;">The target sample rate for the output audio.</td>
</tr>
<tr>
<td style="text-align: left;"><code>output_frame_size</code></td>
<td style="text-align: left;"><code>int</code></td>
<td style="text-align: left;">The desired number of samples per output audio frame.</td>
</tr>
<tr>
<td style="text-align: left;"><code>input_sample_rate</code></td>
<td style="text-align: left;"><code>int</code></td>
<td style="text-align: left;">The expected sample rate of the input audio.</td>
</tr>
<tr>
<td style="text-align: left;"><code>channel</code></td>
<td style="text-align: left;"><code>DataChannel \| None</code></td>
<td style="text-align: left;">The WebRTC data channel for communication.</td>
</tr>
<tr>
<td style="text-align: left;"><code>channel_set</code></td>
<td style="text-align: left;"><code>asyncio.Event</code></td>
<td style="text-align: left;">Event indicating if the data channel is set.</td>
</tr>
<tr>
<td style="text-align: left;"><code>args_set</code></td>
<td style="text-align: left;"><code>asyncio.Event</code></td>
<td style="text-align: left;">Event indicating if additional arguments are set.</td>
</tr>
<tr>
<td style="text-align: left;"><code>latest_args</code></td>
<td style="text-align: left;"><code>str \| list[Any]</code></td>
<td style="text-align: left;">Stores the latest arguments received.</td>
</tr>
<tr>
<td style="text-align: left;"><code>loop</code></td>
<td style="text-align: left;"><code>asyncio.AbstractEventLoop</code></td>
<td style="text-align: left;">The asyncio event loop.</td>
</tr>
<tr>
<td style="text-align: left;"><code>phone_mode</code></td>
<td style="text-align: left;"><code>bool</code></td>
<td style="text-align: left;">Flag indicating if operating in telephone mode.</td>
</tr>
</tbody>
</table>
<h3 id="methods">Methods</h3>
<h4 id="__init__"><code>__init__</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="fm">__init__</span><span class="p">(</span>
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="p">)</span>
</span></code></pre></div>
<p>Initializes the StreamHandlerBase.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>expected_layout</code></td>
<td style="text-align: left;"><code>Literal["mono", "stereo"]</code></td>
<td style="text-align: left;">Expected input audio layout ('mono' or 'stereo').</td>
</tr>
<tr>
<td style="text-align: left;"><code>output_sample_rate</code></td>
<td style="text-align: left;"><code>int</code></td>
<td style="text-align: left;">Target output audio sample rate.</td>
</tr>
<tr>
<td style="text-align: left;"><code>output_frame_size</code></td>
<td style="text-align: left;"><code>int \| None</code></td>
<td style="text-align: left;">Deprecated. Frame size is now derived from sample rate.</td>
</tr>
<tr>
<td style="text-align: left;"><code>input_sample_rate</code></td>
<td style="text-align: left;"><code>int</code></td>
<td style="text-align: left;">Expected input audio sample rate.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="clear_queue"><code>clear_queue</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="n">clear_queue</span><span class="p">()</span>
</span></code></pre></div>
<p>Clears the internal processing queue via the registered callback.</p>
<hr />
<h4 id="send_message"><code>send_message</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="k">async</span> <span class="n">send_message</span><span class="p">(</span><span class="n">msg</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span>
</span></code></pre></div>
<p>Asynchronously sends a message over the data channel.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>msg</code></td>
<td style="text-align: left;"><code>str</code></td>
<td style="text-align: left;">The string message to send.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="send_message_sync"><code>send_message_sync</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="n">send_message_sync</span><span class="p">(</span><span class="n">msg</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span>
</span></code></pre></div>
<p>Synchronously sends a message over the data channel. Runs the async <code>send_message</code> in the event loop and waits for completion.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>msg</code></td>
<td style="text-align: left;"><code>str</code></td>
<td style="text-align: left;">The string message to send.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="reset"><code>reset</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="n">reset</span><span class="p">()</span>
</span></code></pre></div>
<p>Resets the argument set event.</p>
<hr />
<h4 id="shutdown"><code>shutdown</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="n">shutdown</span><span class="p">()</span>
</span></code></pre></div>
<p>Placeholder for shutdown logic. Subclasses can override.</p>
<hr />
<h2 id="streamhandler-class"><code>StreamHandler</code> Class</h2>
<div class="language-python highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="n">StreamHandler</span><span class="p">(</span>
</span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a><span class="p">)</span>
</span></code></pre></div>
<p>Abstract base class for synchronous stream handlers.</p>
<p>Inherits from <code>StreamHandlerBase</code> and defines the core synchronous interface for processing audio streams. Subclasses must implement <code>receive</code>, <code>emit</code>, and <code>copy</code>.</p>
<p><em>(Inherits Attributes and Methods from <code>StreamHandlerBase</code>)</em></p>
<h3 id="abstract-methods">Abstract Methods</h3>
<h4 id="receive"><code>receive</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="n">receive</span><span class="p">(</span><span class="n">frame</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="n">npt</span><span class="o">.</span><span class="n">NDArray</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">int16</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</span></code></pre></div>
<p>Process an incoming audio frame synchronously.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>frame</code></td>
<td style="text-align: left;"><code>tuple[int, npt.NDArray[np.int16]]</code></td>
<td style="text-align: left;">A tuple containing the sample rate (int) and the audio data as a numpy array (int16).</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="emit"><code>emit</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="n">emit</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">EmitType</span>
</span></code></pre></div>
<p>Produce the next output chunk synchronously. This method is called repeatedly to generate the output to be sent back over the stream.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>EmitType</code></td>
<td style="text-align: left;">An output item conforming to <code>EmitType</code>, which could be audio data, additional outputs, control signals (like <code>CloseStream</code>), or None.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="copy"><code>copy</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="n">copy</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">StreamHandler</span>
</span></code></pre></div>
<p>Create a copy of this synchronous stream handler instance. Used to create a new handler for each connection.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>StreamHandler</code></td>
<td style="text-align: left;">A new instance of the concrete StreamHandler subclass.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="start_up"><code>start_up</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="n">start_up</span><span class="p">()</span>
</span></code></pre></div>
<p>Optional synchronous startup logic.</p>
<hr />
<h2 id="asyncstreamhandler-class"><code>AsyncStreamHandler</code> Class</h2>
<div class="language-python highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="n">AsyncStreamHandler</span><span class="p">(</span>
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-12-4"><a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-12-5"><a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-12-6"><a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a><span class="p">)</span>
</span></code></pre></div>
<p>Abstract base class for asynchronous stream handlers.</p>
<p>Inherits from <code>StreamHandlerBase</code> and defines the core asynchronous interface using coroutines (<code>async def</code>) for processing audio streams. Subclasses must implement <code>receive</code>, <code>emit</code>, and <code>copy</code>. The <code>start_up</code> method must also be a coroutine.</p>
<p><em>(Inherits Attributes and Methods from <code>StreamHandlerBase</code>)</em></p>
<h3 id="abstract-methods_1">Abstract Methods</h3>
<h4 id="receive_1"><code>receive</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="k">async</span> <span class="n">receive</span><span class="p">(</span><span class="n">frame</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="n">npt</span><span class="o">.</span><span class="n">NDArray</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">int16</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</span></code></pre></div>
<p>Process an incoming audio frame asynchronously.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>frame</code></td>
<td style="text-align: left;"><code>tuple[int, npt.NDArray[np.int16]]</code></td>
<td style="text-align: left;">A tuple containing the sample rate (int) and the audio data as a numpy array (int16).</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="emit_1"><code>emit</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a><span class="k">async</span> <span class="n">emit</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">EmitType</span>
</span></code></pre></div>
<p>Produce the next output chunk asynchronously. This coroutine is called to generate the output to be sent back over the stream.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>EmitType</code></td>
<td style="text-align: left;">An output item conforming to <code>EmitType</code>, which could be audio data, additional outputs, control signals (like <code>CloseStream</code>), or None.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="copy_1"><code>copy</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-15-2"><a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a><span class="n">copy</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">AsyncStreamHandler</span>
</span></code></pre></div>
<p>Create a copy of this asynchronous stream handler instance. Used to create a new handler for each connection.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>AsyncStreamHandler</code></td>
<td style="text-align: left;">A new instance of the concrete AsyncStreamHandler subclass.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="start_up_1"><code>start_up</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="k">async</span> <span class="n">start_up</span><span class="p">()</span>
</span></code></pre></div>
<p>Optional asynchronous startup logic. Must be a coroutine (<code>async def</code>).</p>
<hr />
<h2 id="audiovideostreamhandler-class"><code>AudioVideoStreamHandler</code> Class</h2>
<div class="language-python highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="n">AudioVideoStreamHandler</span><span class="p">(</span>
</span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-17-3"><a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-17-4"><a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-17-5"><a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-17-6"><a id="__codelineno-17-6" name="__codelineno-17-6" href="#__codelineno-17-6"></a><span class="p">)</span>
</span></code></pre></div>
<p>Abstract base class for synchronous handlers processing both audio and video.</p>
<p>Inherits from <code>StreamHandler</code> (synchronous audio) and adds abstract methods for handling video frames synchronously. Subclasses must implement the audio methods (<code>receive</code>, <code>emit</code>) and the video methods (<code>video_receive</code>, <code>video_emit</code>), as well as <code>copy</code>.</p>
<p><em>(Inherits Attributes and Methods from <code>StreamHandler</code>)</em></p>
<h3 id="abstract-methods_2">Abstract Methods</h3>
<h4 id="video_receive"><code>video_receive</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a><span class="n">video_receive</span><span class="p">(</span><span class="n">frame</span><span class="p">:</span> <span class="n">VideoFrame</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</span></code></pre></div>
<p>Process an incoming video frame synchronously.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>frame</code></td>
<td style="text-align: left;"><code>VideoFrame</code></td>
<td style="text-align: left;">The incoming aiortc <code>VideoFrame</code>.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="video_emit"><code>video_emit</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-19-1"><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-19-2"><a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a><span class="n">video_emit</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">VideoEmitType</span>
</span></code></pre></div>
<p>Produce the next output video frame synchronously.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>VideoEmitType</code></td>
<td style="text-align: left;">An output item conforming to <code>VideoEmitType</code>, typically a numpy array representing the video frame, or None.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="copy_2"><code>copy</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a><span class="n">copy</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">AudioVideoStreamHandler</span>
</span></code></pre></div>
<p>Create a copy of this audio-video stream handler instance.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>AudioVideoStreamHandler</code></td>
<td style="text-align: left;">A new instance of the concrete AudioVideoStreamHandler subclass.</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="asyncaudiovideostreamhandler-class"><code>AsyncAudioVideoStreamHandler</code> Class</h2>
<div class="language-python highlight"><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="n">AsyncAudioVideoStreamHandler</span><span class="p">(</span>
</span><span id="__span-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-21-4"><a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-21-5"><a id="__codelineno-21-5" name="__codelineno-21-5" href="#__codelineno-21-5"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-21-6"><a id="__codelineno-21-6" name="__codelineno-21-6" href="#__codelineno-21-6"></a><span class="p">)</span>
</span></code></pre></div>
<p>Abstract base class for asynchronous handlers processing both audio and video.</p>
<p>Inherits from <code>AsyncStreamHandler</code> (asynchronous audio) and adds abstract coroutines for handling video frames asynchronously. Subclasses must implement the async audio methods (<code>receive</code>, <code>emit</code>, <code>start_up</code>) and the async video methods (<code>video_receive</code>, <code>video_emit</code>), as well as <code>copy</code>.</p>
<p><em>(Inherits Attributes and Methods from <code>AsyncStreamHandler</code>)</em></p>
<h3 id="abstract-methods_3">Abstract Methods</h3>
<h4 id="video_receive_1"><code>video_receive</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a><span class="k">async</span> <span class="n">video_receive</span><span class="p">(</span><span class="n">frame</span><span class="p">:</span> <span class="n">npt</span><span class="o">.</span><span class="n">NDArray</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</span></code></pre></div>
<p>Process an incoming video frame asynchronously.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>frame</code></td>
<td style="text-align: left;"><code>npt.NDArray[np.float32]</code></td>
<td style="text-align: left;">The video frame data as a numpy array (float32). Note: The type hint differs from the synchronous version.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="video_emit_1"><code>video_emit</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-23-1"><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-23-2"><a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a><span class="k">async</span> <span class="n">video_emit</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">VideoEmitType</span>
</span></code></pre></div>
<p>Produce the next output video frame asynchronously.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>VideoEmitType</code></td>
<td style="text-align: left;">An output item conforming to <code>VideoEmitType</code>, typically a numpy array representing the video frame, or None.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="copy_3"><code>copy</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="nd">@abstractmethod</span>
</span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a><span class="n">copy</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">AsyncAudioVideoStreamHandler</span>
</span></code></pre></div>
<p>Create a copy of this asynchronous audio-video stream handler instance.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>AsyncAudioVideoStreamHandler</code></td>
<td style="text-align: left;">A new instance of the concrete AsyncAudioVideoStreamHandler subclass.</td>
</tr>
</tbody>
</table>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["content.code.copy", "content.code.annotate", "navigation.indexes"], "search": "../../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.13a4f30d.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
</body>
</html>