{"id":13579793,"url":"https://github.com/mpromonet/webrtc-streamer","last_synced_at":"2025-05-12T13:25:12.663Z","repository":{"id":24175184,"uuid":"27565754","full_name":"mpromonet/webrtc-streamer","owner":"mpromonet","description":"WebRTC streamer for V4L2 capture devices, RTSP sources and Screen Capture","archived":false,"fork":false,"pushed_at":"2025-05-05T14:50:28.000Z","size":7942,"stargazers_count":3259,"open_issues_count":94,"forks_count":635,"subscribers_count":121,"default_branch":"master","last_synced_at":"2025-05-05T15:27:22.637Z","etag":null,"topics":["c-plus-plus","rtmp","rtsp","streamer","v4l2","webrtc","webrtc-streamer","whep"],"latest_commit_sha":null,"homepage":"https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/?layout=2x2","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mpromonet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2014-12-04T23:52:56.000Z","updated_at":"2025-05-05T14:13:26.000Z","dependencies_parsed_at":"2024-05-07T11:30:38.402Z","dependency_job_id":"fe728a9b-80d4-4f53-800f-f24ee25d1bf6","html_url":"https://github.com/mpromonet/webrtc-streamer","commit_stats":{"total_commits":1715,"total_committers":24,"mean_commits":71.45833333333333,"dds":0.06588921282798832,"last_synced_commit":"65a2f5feaa7a236197b90901c5e3386ddbee3995"},"previous_names":[],"tags_count":58,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpromonet%2Fwebrtc-streamer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpromonet%2Fwebrtc-streamer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpromonet%2Fwebrtc-streamer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpromonet%2Fwebrtc-streamer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mpromonet","download_url":"https://codeload.github.com/mpromonet/webrtc-streamer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253746186,"owners_count":21957517,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-plus-plus","rtmp","rtsp","streamer","v4l2","webrtc","webrtc-streamer","whep"],"created_at":"2024-08-01T15:01:43.267Z","updated_at":"2025-05-12T13:25:12.657Z","avatar_url":"https://github.com/mpromonet.png","language":"C++","funding_links":[],"categories":["\u003ca name=\"cpp\"\u003e\u003c/a\u003eC++","C++","c-plus-plus"],"sub_categories":[],"readme":"\n# WebRTC-Streamer\n\u003ca href=\"https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO_Air\"\u003e\u003cimg alt=\"A picture of a Nano PI NEO Air\" src=\"images/nanopi.jpg\" width=\"500\"\u003e\u003c/a\u003e\n\n[![CircleCI](https://img.shields.io/circleci/build/github/mpromonet/webrtc-streamer?label=circleci\u0026logo=circleci)](https://circleci.com/gh/mpromonet/webrtc-streamer)\n[![CirusCI](https://img.shields.io/cirrus/github/mpromonet/webrtc-streamer?label=cirrusci\u0026logo=cirrusci)](https://cirrus-ci.com/github/mpromonet/webrtc-streamer)\n[![Snap Status](https://snapcraft.io//webrtc-streamer/badge.svg)](https://snapcraft.io/webrtc-streamer)\n\n[![GithubCI](https://img.shields.io/github/actions/workflow/status/mpromonet/webrtc-streamer/cpp-linux.yml?label=C%2FC%2B%2B%20ci%20linux\u0026logo=github)](https://github.com/mpromonet/webrtc-streamer/actions/workflows/cpp-linux.yml)\n[![GithubCI](https://img.shields.io/github/actions/workflow/status/mpromonet/webrtc-streamer/cpp-windows.yml?label=C%2FC%2B%2B%20ci%20windows\u0026logo=github)](https://github.com/mpromonet/webrtc-streamer/actions/workflows/cpp-windows.yml)\n[![GithubCI](https://img.shields.io/github/actions/workflow/status/mpromonet/webrtc-streamer/cpp-macos.yml?label=C%2FC%2B%2B%20ci%20macos\u0026logo=github)](https://github.com/mpromonet/webrtc-streamer/actions/workflows/cpp-macos.yml)\n\n[![Release](https://img.shields.io/github/release/mpromonet/webrtc-streamer.svg)](https://github.com/mpromonet/webrtc-streamer/releases/latest)\n[![Download](https://img.shields.io/github/downloads/mpromonet/webrtc-streamer/total.svg)](https://github.com/mpromonet/webrtc-streamer/releases/latest)\n[![Docker Pulls](https://img.shields.io/docker/pulls/mpromonet/webrtc-streamer.svg)](https://hub.docker.com/r/mpromonet/webrtc-streamer/)\n\n[![Demo](https://img.shields.io/badge/azure-livedemo-green)](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/)\n[![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/mpromonet/webrtc-streamer)\n\n\nExperimentation to stream WebRTC media sources like capture devices, screen capture, mkv files and RMTP/RTSP sources using simple signaling mechanism (see [api](docs/api.md)). It is also compatible with [WHEP](https://datatracker.ietf.org/doc/html/draft-ietf-wish-whep-01) interface.\n\n*** Notice *** Live demo are stopped till I migrate to a european web hosting.\n\n## Artefacts\n\n* packages are available from https://github.com/mpromonet/webrtc-streamer/releases/latest\n* container image are available from  https://hub.docker.com/r/mpromonet/webrtc-streamer\n\n\n## Usage\n\n```roff\n./webrtc-streamer [-H http port] [-S[embeded stun address]] -[v[v]]  [urls...]\n./webrtc-streamer [-H http port] [-s[external stun address]] -[v[v]] [urls...]\n./webrtc-streamer -V\n\t-v[v[v]]           : verbosity\n\t-V                 : print version\n\t-C config.json                     : load urls from JSON config file \n\t-n name -u videourl -U audiourl    : register a name for a video url and an audio url\n\t[url]                              : url to register in the source list\n\n\t-H [hostname:]port : HTTP server binding (default 0.0.0.0:8000)\n\t-w webroot         : path to get files\n\t-c sslkeycert      : path to private key and certificate for HTTPS\n\t-N nbthreads       : number of threads for HTTP server\n\t-A passwd          : password file for HTTP server access\n\t-D authDomain      : authentication domain for HTTP server access (default:mydomain.com)\n\n\t-S[stun_address]                   : start embeded STUN server bind to address (default 0.0.0.0:3478)\n\t-s[stun_address]                   : use an external STUN server (default:stun.l.google.com:19302 , -:means no STUN)\n\t-T[username:password@]turn_address : start embeded TURN server (default:disabled)\n\t-t[username:password@]turn_address : use an external TURN relay server (default:disabled)\n\t-R [Udp port range min:max]        : Set the webrtc udp port range (default 0:65535)\n\t-W webrtc_trials_fields            : Set the webrtc trials fields (default:WebRTC-FrameDropper/Disabled/)\t\t\n\t-a[audio layer]                    : spefify audio capture layer to use (default:0)\t\t\n\t-q[filter]                         : spefify publish filter (default:.*)\n\t-o                                 : use null codec (keep frame encoded)\n```\n\nArguments of '-H' are forwarded to option\n[`listening_ports`](https://github.com/civetweb/civetweb/blob/master/docs/UserManual.md#listening_ports-8080)\nof civetweb, allowing use of the civetweb syntax like `-H8000,9000` or\n`-H8080r,8443s`.\n\nUsing `-o` allows storing compressed frame data from the backend stream using\n`webrtc::VideoFrameBuffer::Type::kNative`. This hacks the stucture\n`webrtc::VideoFrameBuffer` storing data in a override of the i420 buffer. This\nallows forwarding H264 frames from V4L2 device or RTSP stream to WebRTC stream.\nIt uses less CPU, but has less features (resize, codec, and bandwidth are\ndisabled).\n\nOptions for the WebRTC stream name:\n\n- an alias defined using `-n` argument then the corresponding `-u` argument will\n  be used to create the capturer\n- an \"rtsp://\" url that will be opened using an RTSP capturer based on live555\n- an \"file://\" url that will be opened using an MKV capturer based on live555\n- an \"rmtp://\" url that will be opened using an RMTP capturer based on librmtp\n- an \"screen://\" url that will be opened by\n  `webrtc::DesktopCapturer::CreateScreenCapturer`\n- an \"window://\" url that will be opened by\n  `webrtc::DesktopCapturer::CreateWindowCapturer`\n- an \"v4l2://\" url that will capture\n  [H264](https://en.wikipedia.org/wiki/Advanced_Video_Coding) frames and store\n  it using webrtc::VideoFrameBuffer::Type::kNative type (not supported on\n  Windows)\n- an \"videocap://\" url video capture device name\n- an \"audiocap://\" url audio capture device name\n\n#### Examples\n\n```sh\n./webrtc-streamer -C config.json\n```\n\n[![Screenshot](images/snapshot.png)](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/)\n\n[Live Demo](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/)\n\nWe can access to the WebRTC stream using\n[webrtcstreamer.html](https://github.com/mpromonet/webrtc-streamer-html/blob/master/webrtcstreamer.html).\nFor instance:\n\n- [webrtcstreamer.html?rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/webrtcstreamer.html?rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov)\n- [webrtcstreamer.html?Bunny](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/webrtcstreamer.html?Bunny)\n\nAn example displaying grid of WebRTC Streams is available using option\n`layout=\u003clines\u003ex\u003ccolumns\u003e`\n[![Screenshot](images/layout2x4.png)](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/?layout=2x4)\n\n[Live Demo](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/?layout=2x4)\n\n## Using docker image\n\nYou can start the application using the docker image:\n\n```sh\ndocker run -p 8000:8000 -it mpromonet/webrtc-streamer\n```\n\nYou can expose V4L2 devices from your host using:\n\n```sh\ndocker run --device=/dev/video0 -p 8000:8000 -it mpromonet/webrtc-streamer\n```\n\nThe container entry point is the webrtc-streamer application, then you can:\n\n- view all commands\n  ```sh\n  docker run -p 8000:8000 -it mpromonet/webrtc-streamer --help\n  ```\n- run the container registering a RTSP url:\n\n  ```sh\n  docker run -p 8000:8000 -it mpromonet/webrtc-streamer -n raspicam -u rtsp://pi2.local:8554/unicast\n  ```\n- run the container giving config.json file:\n\n  ```sh\n  docker run -p 8000:8000 -v $PWD/config.json:/usr/local/share/webrtc-streamer/config.json mpromonet/webrtc-streamer\n  ```\n\n- run the container using network host:\n\n  ```sh\n  docker run --net host mpromonet/webrtc-streamer\n  ```\n\n## Using embedded STUN/TURN server behind a NAT\n\nIt is possible to start an embeded [STUN](https://en.wikipedia.org/wiki/STUN)\nand [TURN](https://en.wikipedia.org/wiki/Traversal_Using_Relays_around_NAT)\nserver and publish its URL:\n\n```sh\n./webrtc-streamer -S0.0.0.0:3478 -s$(curl -s ifconfig.me):3478\n./webrtc-streamer -s- -T0.0.0.0:3478 -tturn:turn@$(curl -s ifconfig.me):3478\n./webrtc-streamer -S0.0.0.0:3478 -s$(curl -s ifconfig.me):3478 -T0.0.0.0:3479 -tturn:turn@$(curl -s ifconfig.me):3479\n```\n\nThe command `curl -s ifconfig.me` is getting the public IP, it could also given\nas a static parameter.\n\nIn order to configure the NAT rules using the upnp feature of the router, it is\npossible to use\n[upnpc](https://manpages.debian.org/unstable/miniupnpc/upnpc.1.en.html) like\nthis:\n\n```sh\nupnpc -r 8000 tcp 3478 tcp 3478 udp\n```\n\nAdapting with the HTTP port, STUN port, TURN port.\n\n## HTML Embedding\n\nInstead of using the internal HTTP server, it is easy to display a WebRTC stream\nin a HTML page served by another HTTP server. The URL of the WebRTC-streamer to\nuse should be given creating the\n[WebRtcStreamer](http://htmlpreview.github.io/?https://github.com/mpromonet/webrtc-streamer-html/blob/master/jsdoc/WebRtcStreamer.html)\ninstance:\n\n```js\nvar webRtcServer = new WebRtcStreamer(\u003cvideo tag\u003e, \u003cwebrtc-streamer url\u003e);\n```\n\nA short sample HTML page using webrtc-streamer running locally on port 8000:\n\n```html\n\u003chtml\u003e\n\u003chead\u003e\n\u003cscript src=\"libs/adapter.min.js\" \u003e\u003c/script\u003e\n\u003cscript src=\"webrtcstreamer.js\" \u003e\u003c/script\u003e\n\u003cscript\u003e        \n\tvar webRtcServer      = null;\n\twindow.onload         = function() { \n\t\twebRtcServer      = new WebRtcStreamer(\"video\",location.protocol+\"//\"+location.hostname+\":8000\");\n\t\twebRtcServer.connect(\"rtsp://196.21.92.82/axis-media/media.amp\",\"\", \"rtptransport=tcp\u0026timeout=60\");\n\t}\n\twindow.onbeforeunload = function() { webRtcServer.disconnect(); }\n\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e \n\t\u003cvideo id=\"video\" muted playsinline /\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n## Using WebComponents\n\nWebRTC-streamer provides its own\n[Web Components](https://www.webcomponents.org/) as an alternative way to\ndisplay a WebRTC stream in an HTML page. For example:\n\n```html\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003cscript type=\"module\" src=\"webrtc-streamer-element.js\"\u003e\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\t\u003cwebrtc-streamer url=\"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov\"\u003e\u003c/webrtc-streamer\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n[Live Demo](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/Bunny.html)\n\nUsing the webcomponent with a stream selector:\n\n[![Screenshot](images/wc-selector.jpg)](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/webrtc-streamer-element.html)\n\n[Live Demo](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/webrtc-streamer-element.html)\n\nUsing the webcomponent over google map:\n\n[![Screenshot](images/wc-map.jpg)](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/map.html)\n\n[Live Demo](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/map.html)\n\n## Using WHEP\n\nIt allow to stream using draft standard [WHEP](https://datatracker.ietf.org/doc/html/draft-ietf-wish-whep-01)\n\n[WebRTC player](https://github.com/Eyevinn/webrtc-player) can display WebRTC stream from webrtc-streamer.\n\nA minimal example:\n```html\n\u003chtml\u003e\n\u003chead\u003e\n    \u003cscript src=\"https://unpkg.com/@eyevinn/whep-video-component@latest/dist/whep-video.component.js\"\u003e\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003cwhep-video id=\"video\" muted autoplay\u003e\u003c/whep-video\u003e\n    \u003cscript\u003e\n        video.setAttribute('src', `${location.origin}/api/whep?url=Asahi\u0026options=rtptransport%3dtcp%26timeout%3d60`);\n    \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n[Live Demo](https://webrtc-streamer-whep.pages.dev/)\n\n\n## Object detection using tensorflow.js\n\n[![Screenshot](images/tensorflow.jpg)](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/tensorflow.html)\n\n[Live Demo](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/tensorflow.html)\n\n## Connect to Janus Gateway Video Room\n\nA simple way to publish WebRTC stream to a\n[Janus Gateway](https://janus.conf.meetecho.com) Video Room is to use the\n[JanusVideoRoom](http://htmlpreview.github.io/?https://github.com/mpromonet/webrtc-streamer-html/blob/master/jsdoc/JanusVideoRoom.html)\ninterface\n\n```js\nvar janus = new JanusVideoRoom(\u003cjanus url\u003e, \u003cwebrtc-streamer url\u003e)\n```\n\nA short sample to publish WebRTC streams to Janus Video Room could be:\n\n```html\n\u003chtml\u003e\n\u003chead\u003e\n\u003cscript src=\"janusvideoroom.js\" \u003e\u003c/script\u003e\n\u003cscript\u003e        \n\tvar janus = new JanusVideoRoom(\"https://janus.conf.meetecho.com/janus\", null);\n\tjanus.join(1234, \"rtsp://pi2.local:8554/unicast\",\"pi2\");\n\tjanus.join(1234, \"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov\",\"media\");\t    \n\u003c/script\u003e\n\u003c/head\u003e\n\u003c/html\u003e\n```\n\n[![Screenshot](images/janusvideoroom.png)](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/janusvideoroom.html)\n\n[Live Demo](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/janusvideoroom.html)\n\nThis way the communication between\n[Janus API](https://janus.conf.meetecho.com/docs/JS.html) and\n[WebRTC Streamer API](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/help)\nis implemented in Javascript running in browser.\n\nThe same logic could be implemented in NodeJS using the same JS API:\n\n```js\nglobal.request = require(\"then-request\");\nvar JanusVideoRoom = require(\"./html/janusvideoroom.js\");\nvar janus = new JanusVideoRoom(\n  \"http://192.168.0.15:8088/janus\",\n  \"http://192.168.0.15:8000\",\n);\njanus.join(1234, \"videocap://0\", \"video\");\n```\n\n## Connect to Jitsi\n\nA simple way to publish WebRTC stream to a [Jitsi](https://meet.jit.si) Video\nRoom is to use the\n[XMPPVideoRoom](http://htmlpreview.github.io/?https://github.com/mpromonet/webrtc-streamer-html/blob/master/jsdoc/XMPPVideoRoom.html)\ninterface\n\n```js\nvar xmpp = new XMPPVideoRoom(\u003cxmpp server url\u003e, \u003cwebrtc-streamer url\u003e)\n```\n\nA short sample to publish WebRTC streams to a Jitsi Video Room could be:\n\n```html\n\u003chtml\u003e\n\u003chead\u003e\n\u003cscript src=\"libs/strophe.min.js\" \u003e\u003c/script\u003e\n\u003cscript src=\"libs/strophe.muc.min.js\" \u003e\u003c/script\u003e\n\u003cscript src=\"libs/strophe.disco.min.js\" \u003e\u003c/script\u003e\n\u003cscript src=\"libs/strophe.jingle.sdp.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"libs/jquery-3.5.1.min.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"xmppvideoroom.js\" \u003e\u003c/script\u003e\n\u003cscript\u003e        \n\tvar xmpp = new XMPPVideoRoom(\"meet.jit.si\", null);\n\txmpp.join(\"testroom\", \"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov\",\"Bunny\");\t    \n\u003c/script\u003e\n\u003c/head\u003e\n\u003c/html\u003e\n```\n\n[Live Demo](https://webrtcstreamer.agreeabletree-365b9a90.canadacentral.azurecontainerapps.io/xmppvideoroom.html)\n\n## Dependencies\n\nThis package depends on the following packages:\n\n- [WebRTC Native Code Package](http://www.webrtc.org) for WebRTC (see license https://webrtc.github.io/webrtc-org/license)\n- [civetweb HTTP server](https://github.com/civetweb/civetweb) for HTTP server (see license https://github.com/civetweb/civetweb/blob/master/LICENSE.md)\n- [live555](http://www.live555.com/liveMedia) for RTSP/MKV source (see license http://www.live555.com/liveMedia/faq.html#copyright-and-license)\n\n## Build\n\nThe following steps are required to build the project, and will install the\ndependencies above:\n\n1. Install the Chromium depot tools\n\n   ```sh\n   pushd ..\n   git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git\n   export PATH=$PATH:`realpath depot_tools`\n   popd\n   ```\n2. Download WebRTC\n\n   ```sh\n   mkdir ../webrtc\n   pushd ../webrtc\n   fetch webrtc \n   popd\n   ```\n\n3. Build WebRTC Streamer\n\n   ```sh\n   cmake . \u0026\u0026 make\n   ```\n\nIt is possible to specify cmake parameters `WEBRTCROOT` \u0026\n`WEBRTCDESKTOPCAPTURE`:\n\n- `$WEBRTCROOT/src` should contains source (default is $(pwd)/../webrtc)\n- `WEBRTCDESKTOPCAPTURE` enabling desktop capture if available (default is ON)\n\n\n## Pipelines\n\nThere is pipelines on [CircleCI](https://circleci.com/gh/mpromonet/webrtc-streamer),\n[CirrusCI](https://cirrus-ci.com/github/mpromonet/webrtc-streamer), or\n[GitHub CI](https://github.com/mpromonet/webrtc-streamer/actions), for the\nfollowing architectures:\n\n- x86_64 on Ubuntu\n- armv7 crosscompiled (this build is running on Raspberry Pi2 and NanoPi NEO)\n- armv6+vfp crosscompiled (this build is running on Raspberry PiB and should run\n  on a Raspberry Zero)\n- arm64 crosscompiled\n- Windows x64 build with clang\n- MacOS\n\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=mpromonet/webrtc-streamer\u0026type=Date)](https://star-history.com/#mpromonet/webrtc-streamer\u0026Date)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmpromonet%2Fwebrtc-streamer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmpromonet%2Fwebrtc-streamer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmpromonet%2Fwebrtc-streamer/lists"}