diff --git a/examples/broadcast/README.md b/examples/broadcast/README.md index f9544b38acc..570b0a2fc00 100644 --- a/examples/broadcast/README.md +++ b/examples/broadcast/README.md @@ -1,20 +1,28 @@ # broadcast + broadcast is a Pion WebRTC application that demonstrates how to broadcast a video to many peers, while only requiring the broadcaster to upload once. This could serve as the building block to building conferencing software, and other applications where publishers are bandwidth constrained. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fbroadcast%2Fdrawio) + ## Instructions + ### Download broadcast + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/broadcast ``` ### Open broadcast example page + [jsfiddle.net](https://jsfiddle.net/1jc4go7v/) You should see two buttons 'Publish a Broadcast' and 'Join a Broadcast' ### Run Broadcast + #### Linux/macOS + Run `broadcast` OR run `main.go` in `github.com/pion/webrtc/examples/broadcast` ### Start a publisher @@ -27,6 +35,7 @@ Run `broadcast` OR run `main.go` in `github.com/pion/webrtc/examples/broadcast` * The connection state will be printed in the terminal and under `logs` in the browser. ### Join the broadcast + * Click `Join a Broadcast` * Copy the string in the first input labelled `Browser base64 Session Description` * Run `curl localhost:8080/sdp -d "$BROWSER_OFFER"`. `$BROWSER_OFFER` is the value you copied in the last step. diff --git a/examples/broadcast/drawio b/examples/broadcast/drawio new file mode 100644 index 00000000000..3f390de6d8e --- /dev/null +++ b/examples/broadcast/drawio @@ -0,0 +1 @@ +7V1bk6I4FP41Vs0+aEHC9bEvM7M1NZeecnZ35hEhKjVobMBue379JtyEJCqKBLG7u6qVgBG+75yTc4MewLvF5mPorOZfsIeCAVC8zQDeDwAAlmmQFzryko6oKshGZqHvZWPbgbH/B2WDSja69j0UVQ6MMQ5if1UddPFyidy4MuaEIX6uHjbFQfVbV84McQNj1wn40f98L56noxYwt+N/I382z79ZNex0z8LJD86uJJo7Hn4uDcH3A3gXYhyn7xabOxRQ9HJc0s992LG3OLEQLeM6H4C6//lboH31lO/Bv4+fQt9/fBpCLZ3myQnW2RVnZxu/5BCEeL30EJ1FGcDb57kfo/HKceneZ8I6GZvHi4BsqeRt9BvF7jzbmPpBcIcDHCYTQU9HlqfRg+IQ/0alPRaYQMMge7KzQWGMNjuvUy3QI3KH8ALF4Qs5JPvA0M4Az0ROB/YI6OnQ85ZC1cwOm5foM2AmOZnUzIrZt8CSNxm2x+CscDjjJZXl0HF/70FcbYi4g6ypK0LccC00mZ4JcYtBXFNGpgBxXYC4pjRH/PPiy2Llhv/8meCvdjyzv3/7YQ3Vw4KNlt4NNRFka4mXZPDWc6J5gXsJYzr+4MQxCpfJCFBgAWpuFgDLhbsOn4rJdmAKFORVDBAPcglBEYD5WIgCJ/afqmZLhGr2DQ/YJ2dScAgYDi2FISbC69BF2afKZubARKrFTBQ74QzF3EQJycVln847FPBuBDHVDZyc51YAjMc1zncMo2TpuSEHqNZqs91J3s2y12SWST7waUwJRSgkL+/G60nkhv4EhX/lB5Kzn7AfJmPpWeTDjEQSHYwZ7a4obiamZS3PhpzAn1HZdIl8kVOCt1SjfbKO3WQ7Fr7n0a8RmpOqia9I8U7B5UzGTvugqYxICMyxvUe0z24bTE5G3BA5MRrQJdRwFhSS9C+lB1GpCTDBkryO7x/IXzydUt47N9uNaIHMQmnnK2LZZhu6RJttcbyE6HGNIkqA71J6XGfp+R6hKuo/+uZIr6qFAgUEyF00a6ya8t3BRjgbCrOw2SYPclu+oBBkncP4olzBZmgzpt5WuxZpg0Pb8bxrgZs3It0DrvIhZbG6UnfpLo3UfSr0/UZ/CLhQU7SCSgWfNy5XCj40q4IPDdA19rypaSn0+IhLoQdx3h3PdaL4LfYQ6WghA7mXpQkyE6rM6EPlww+OjGjurOjb9SK4cWNcBvWzM0HBA478RIvh/QTHMV4IUI8xo7R4HQf+Et0VqVKlAj+v10Rcsoysap2LDsC4Y7zFhCJnrC0ygChf8ErI0LQqF0bXXPCeQ+ATu7ZEIR/uXaC5aoEiQ6uucpbOc2QJOIKtcSRa5HboyzRAmyzBelvKtbqBE0W+WyXvCFgreVXG95jq9FfoeyQ/PcjEapCxkKy+1c3EqocmajkTC/h0zpgoWCmN9u7Jd8jLw7fxj79eqYKz7oml8u6J0Aq3p+E2R1uaAg3RAieBREJev6MHPnQTOCJywwdYwxNpy4oSIMOXn+WNX3SOkZ5v3m+yOdOtl2xrJxOpjdpztZmUpyZoz3HGRdlmG3L5llOts2Xx+V+25tZ2qYz3tzw/WgUOBTTJSU5oA0X/Kx1cVtIWKLvUJBnk8zTylH3jxz+36k22fpX2bDWdbshT9FwYL0TTDYtVTlYW6iq6YTMWw5ar5doJ1c7UPXOW0XP/lZ/4oVUCDK1r7dd4z5hD+S2IaqK+KmTUFyjmaeqrqYdmalt/eX9cHEbd4RVB5MMDTQW/2nBK06psqYKkVqHYUuIpna+pR0RkknoAIjrc/1IMURHWlRXlEuXaWB3wsF9dGKupsIo7FFUg5eJ+nGf71njJ9ksWFZKmnZdWe46msMe5hlMjn3iG5VptzXKIH7LlF+3UCIObCSjKSCn9AChVEHiHRUYL7sN6EvhEmK60Ct6sQ99gJEQVtBq21YIrlJE8I9P/HtyGxJhVYqAJ+QW8rSZcMTO847QH5X7cEmQxKAPb5lGWekOQymf710mmVVkgj4ZzPZdri6lrQZl9iWLE+Wz3ZXWCntmQdA94n3oRzws+0EVWXCr4R/RpXGBfU0M6mHqPwdfU22psEpPBp+CvoLGp4QIBqikjILGzSUxS7XYVHMU9zq82o03X4YjpvNZEKda2WlbE1Ikizt2ph3ZaJ4ruiHqtE3kVNq+7lj51oAp7OKVRLcvu9T/Lddk9blNnSRK2XxjmtbOjkyQq6yBZzEwtZ0UAH/FebLfFmX1/me0WYuyPexrAhbRbyFX00kNJulB0k6nSn54NNdk7gyTnwXPZ6nt1/4JT58C2WC/EPPWBFUPdPDxZ2yLDZ4Ouusbf0AfVOMIMmWV+MYU1nqT0Vv4qsahBe6Qa9vbHqDKa3/lyfDVs/8Q6YCZuW7f5NNjl9X80zLcYbC+zKYjmJbt8fALsIvs/zpt4tDrP+oIad7e+2cH65qpg9Nx20GSXwrbt4JU0vV6wKAk8Wc0WC8HR0iRwuQ/N3bJAQT6of/VZdY1lqOOkOuRj4aIGmNRdh0lTx5B4RATTYRiver8kM7d7GAAKH4YpoqG1RbnTewu7zX/lon0w/5WKane2uyo11vYRqseaamYmyM/UtmHeU/h/8j2EU+VfRi4igIV913hogtGO3GVnTVyQj35eY3sdT434EV1SqdlzP96VtcWwt90qIuylroN8DHKFSQEWdtG9OHJh5+vzfbsFtWHGukKIqsi8S0fISD7xlTZDsniLHu4hF+8aBWimreQYb/wUH/vUxpXBGX3zDISDvrnWaW0asI8QVNjbIuq65pB9EnrdR34QWUj6RPLDVvSAaPcpD9m8cHYJO9M73CVW/5sIeZOeQs1AgWxu/7NJevj2H8TA9/8D \ No newline at end of file diff --git a/examples/custom-logger/README.md b/examples/custom-logger/README.md index ad55c94bfc9..b150602eb85 100644 --- a/examples/custom-logger/README.md +++ b/examples/custom-logger/README.md @@ -1,17 +1,22 @@ # custom-logger + custom-logger is an example of how the Pion API provides an customizable logging API. By default all Pion projects log to stdout, but we also allow users to override this and process messages however they want. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fcustom-logger%2Fdrawio) + ## Instructions + ### Download custom-logger + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/custom-logger ``` ### Run custom-logger -`custom-logger` +`custom-logger` You should see messages from our customLogger, as two PeerConnections start a session diff --git a/examples/custom-logger/drawio b/examples/custom-logger/drawio new file mode 100644 index 00000000000..b391b0bfc01 --- /dev/null +++ b/examples/custom-logger/drawio @@ -0,0 +1 @@ +7Vtbc+I2GP01PJKxLV8fA9lL22xLh2a6+yhsAZ61LVcWAfLrK+OrLhAgYGATMhOsz7Isn/NdJdMDw3j1hcB0/g0HKOoZWrDqgYeeYeiuabGvXLIuJB5wC8GMhEHZqRGMwxdUCrVSuggDlHEdKcYRDVNe6OMkQT7lZJAQvOS7TXHE3zWFMyQJxj6MZOm/YUDnhdQ1nEb+FYWzeXVn3faKMzGsOpdPks1hgJctEfjUA0OCMS2O4tUQRTl4FS7FdZ+3nK0nRlBC97ngMf4Wpz55epngPz068/7+6x+3X47yDKNF+cDlZOm6QgAlwX0OJGslOGHCQQCzOcpH1VljTuOoPMzlI0gpIslGYmiASTNK8M8aPCOX/ETUn5cX+QvyXA8mP1M5QRRwNJVP+AXhGFGyZh2WDTlWCfi8xUslIyiCNHzmyYWljszq4eo7jHDIZmJopT6bWjlOqc2mp/FDZHhBfFRe1SZDGAh43p1jc2OxwfmxKCQzRKWx2EHryRvRhu4DqAcK6u2I4TWYcApg/7fIVXQwxQntZxsDvWcddDddNSfZ0Sz/vk+yJSKIVEOxmU2qc5JmUbSivAYVujLEESaNuk3DKBJEMApnuY75TE/YzcDgGREaMqu9L0/EYRDktxks5yFF4xT6+T2XzEcxGcGLJNjonCZq41YFzG+AVjtVsDxrAYvjVTeMu1LSUlJvh5Kq9JFj/1CqHYlqnyBIUS93GTaMc1CK/zlBKNfTCDM02ff4YcT+4+k051Tgr8FR34J0m9o2zG1KewYIIHKnvsQ/O2P7LppMT0OM6dVEVOZbId4iRrctmRnRNE/GjLudmQBSOJxDFtaiW0feEtwm8BS4q9z22XDXze3ApwiRYZFOhDi5dex14PFhxlbpfKfYW+8Fe1HvrwB7+yPqnyXq6455bVFfl8O+RAYrStL8cBFH9z7FbVAf4QRFI5yFG0sEDxNMKY4VqFMsGB5e0ChM0LAuyTQOftk2mY6VlZ/unoYOQ+PpsBwFG0DBhn0uNgxVvv1O2LBs69rYUPnBLWxMI7QqK+BBqxj2I5hloc+DvcPJiLhyha8QnqZW/qcMT5vPDZTKYuyzTJcfYu9S+bWBzlwnG3KOPmam1lRH1x/fzuFgXaGU8rw7r/0xJQNXWjg4m4V7Em1FZUtQjDe5poq8G0swxeTeci+dYII9HCuvqW8B2UJuYKpAdo0J2O0m9we5bwnVq6EA2ekyelXstUCOwoyiBJHsvfmjqrRSLCm4Xfob84hFtmJxDW6qp5t3RSafcdumwko6XeMx5cD9keOdNMcTUzMHOMfleGKyKA105hzPlJOFjxyvcaCVSSt8bG2+nThZSw58Ejcf+5U9bpvRcnkSHYGcQ7YshbHqdLMjM7UMif5fL6eXfKEqpz9XIB0tw4E1+oM8xRPnceCPBuNp2pdRz5fmtd98NIRJEAabJOe2Qa9T6irHB3p3oA+Tr0u6+Ez839PlLHsavMT9leLNjDqd9BcZxXE/wrNZnjdqMA2vAH8JbAUlW/Gva6pq+bzLQlaJv6z0EsZcKDgsa2SwkPX3vHFnVc0f7XMPK661rlqrkH6v7siOfzRDsFZzUd6orlFGJKW9FKHgdaUs3PwOR11s8V1s6VHn16YkJdk7LRXWrXXxdZ8t8Y4pAly3uqV5h2zHhAGv/Yam7Z6XI/QHXH92UMzg2OCr5H6P/YsLGoR25QZhXtIgDGAq9evwHBAAbpWXTwelBa8TmYchqvsr5mGI5tSFecgvlJzUPI7w+41JcQbV2NcWkzrOPHZljlceL4DO64t5bLwAtpBFnileGGK2aukHzasq7M9qEPJbPpJBdL8R8KYk1RbWQzrdCFBiLG+2/AL7AG/iyBF9v6KQONe+gJIieVvgGovnt9mFJ9gFUNhFp8XzHiv/p8hV9cMC64VzVWffYHzRXNUSd1tF57l38aZv8danLt7EoG/tzk5N86TBmDWb3xAV3ZtfYoFP/wM= \ No newline at end of file diff --git a/examples/data-channels-detach/README.md b/examples/data-channels-detach/README.md index 9bc5b63c707..2b5b8c53616 100644 --- a/examples/data-channels-detach/README.md +++ b/examples/data-channels-detach/README.md @@ -1,13 +1,18 @@ # data-channels-detach + data-channels-detach is an example that shows how you can detach a data channel. This allows direct access the the underlying [pion/datachannel](https://github.com/pion/datachannel). This allows you to interact with the data channel using a more idiomatic API based on the `io.ReadWriteCloser` interface. The example mirrors the data-channels example. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fdata-channels-detach%2Fdrawio) + ## Install + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/data-channels-detach ``` ## Usage + The example can be used in the same way as the data-channel example or can be paired with the data-channels-detach-create example. In the latter case; run both example and exchange the offer/answer text by copy-pasting them on the other terminal. diff --git a/examples/data-channels-detach/drawio b/examples/data-channels-detach/drawio new file mode 100644 index 00000000000..702329e7601 --- /dev/null +++ b/examples/data-channels-detach/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/data-channels-detach/jsfiddle/demo.html b/examples/data-channels-detach/jsfiddle/demo.html index 6afd5f4bfe7..f2f888b796f 100644 --- a/examples/data-channels-detach/jsfiddle/demo.html +++ b/examples/data-channels-detach/jsfiddle/demo.html @@ -2,14 +2,14 @@
Golang base64 Session Description
-
+


- +Message
+
+

Logs
diff --git a/examples/data-channels-detach/jsfiddle/demo.js b/examples/data-channels-detach/jsfiddle/demo.js new file mode 100644 index 00000000000..16b466d3b89 --- /dev/null +++ b/examples/data-channels-detach/jsfiddle/demo.js @@ -0,0 +1,49 @@ +/* eslint-env browser */ + +let pc = new RTCPeerConnection({ + iceServers: [ + { + urls: 'stun:stun.l.google.com:19302' + } + ] +}) +let log = msg => { + document.getElementById('logs').innerHTML += msg + '
' +} + +let sendChannel = pc.createDataChannel('foo') +sendChannel.onclose = () => console.log('sendChannel has closed') +sendChannel.onopen = () => console.log('sendChannel has opened') +sendChannel.onmessage = e => log(`Message from DataChannel '${sendChannel.label}' payload '${e.data}'`) + +pc.oniceconnectionstatechange = e => log(pc.iceConnectionState) +pc.onicecandidate = event => { + if (event.candidate === null) { + document.getElementById('localSessionDescription').value = btoa(JSON.stringify(pc.localDescription)) + } +} + +pc.onnegotiationneeded = e => + pc.createOffer().then(d => pc.setLocalDescription(d)).catch(log) + +window.sendMessage = () => { + let message = document.getElementById('message').value + if (message === '') { + return alert('Message must not be empty') + } + + sendChannel.send(message) +} + +window.startSession = () => { + let sd = document.getElementById('remoteSessionDescription').value + if (sd === '') { + return alert('Session Description must not be empty') + } + + try { + pc.setRemoteDescription(new RTCSessionDescription(JSON.parse(atob(sd)))) + } catch (e) { + alert(e) + } +} diff --git a/examples/data-channels-flow-control/README.md b/examples/data-channels-flow-control/README.md index b00839e53c3..03d5cdaf13e 100644 --- a/examples/data-channels-flow-control/README.md +++ b/examples/data-channels-flow-control/README.md @@ -1,4 +1,5 @@ # data-channels-flow-control + This example demonstrates how to use the following property / methods. * func (d *DataChannel) BufferedAmount() uint64 @@ -7,9 +8,12 @@ This example demonstrates how to use the following property / methods. * func (d *DataChannel) OnBufferedAmountLow(f func()) These methods are equivalent to that of JavaScript WebRTC API. -See https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel for more details. +See for more details. + +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fdata-channels-flow-control%2Fdrawio) ## When do we need it? + Send or SendText methods are called on DataChannel to send data to the connected peer. The methods return immediately, but it does not mean the data was actually sent onto the wire. Instead, it is queued in a buffer until it actually gets sent out to the wire. @@ -22,7 +26,6 @@ The rate you wish to send data might be much higher than the rate the data chann actually send to the peer over the Internet. The above properties/methods help your application to pace the amount of data to be pushed into the data channel. - ## How to run the example code The demo code (main.go) implements two endpoints (offerPC and answerPC) in it. @@ -45,10 +48,10 @@ connection, and data channel (label: "data"). Once the data channel is successfully opened, offerPC will start sending a series of 1024-byte packets to answerPC as fast as it can, until you kill the process by Ctrl-c. - Here's how to run the code. At the root of the example, `pion/webrtc/examples/data-channels-flow-control/`: + ``` $ go run main.go 2019/08/31 14:56:41 OnOpen: data-824635025728. Start sending a series of 1024-byte packets as fast as it can diff --git a/examples/data-channels-flow-control/drawio b/examples/data-channels-flow-control/drawio new file mode 100644 index 00000000000..2d18ae87a46 --- /dev/null +++ b/examples/data-channels-flow-control/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/data-channels/README.md b/examples/data-channels/README.md index 11872b3df23..3fc505feec9 100644 --- a/examples/data-channels/README.md +++ b/examples/data-channels/README.md @@ -1,28 +1,41 @@ # data-channels + data-channels is a Pion WebRTC application that shows how you can send/recv DataChannel messages from a web browser +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fdata-channels%2Fdrawio) + ## Instructions + ### Download data-channels + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/data-channels ``` ### Open data-channels example page + [jsfiddle.net](https://jsfiddle.net/9tsx15mg/90/) ### Run data-channels, with your browsers SessionDescription as stdin + In the jsfiddle the top textarea is your browser's session description, copy that and: + #### Linux/macOS + Run `echo $BROWSER_SDP | data-channels` + #### Windows + 1. Paste the SessionDescription into a file. 1. Run `data-channels < my_file` ### Input data-channels's SessionDescription into your browser + Copy the text that `data-channels` just emitted and copy into second text area ### Hit 'Start Session' in jsfiddle + Under Start Session you should see 'Checking' as it starts connecting. If everything worked you should see `New DataChannel foo 1` Now you can put whatever you want in the `Message` textarea, and when you hit `Send Message` it should appear in your terminal! diff --git a/examples/data-channels/drawio b/examples/data-channels/drawio new file mode 100644 index 00000000000..87616e18cd6 --- /dev/null +++ b/examples/data-channels/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/ice-restart/README.md b/examples/ice-restart/README.md index b91b6f18ba9..1dc06660306 100644 --- a/examples/ice-restart/README.md +++ b/examples/ice-restart/README.md @@ -1,9 +1,13 @@ # ice-restart + ice-restart demonstrates Pion WebRTC's ICE Restart abilities. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fice-restart%2Fdrawio) + ## Instructions ### Download ice-restart + This example requires you to clone the repo since it is serving static HTML. ``` @@ -14,9 +18,11 @@ cd webrtc/examples/ice-restart ``` ### Run ice-restart + Execute `go run *.go` ### Open the Web UI + Open [http://localhost:8080](http://localhost:8080). This will automatically start a PeerConnection. This page will now prints stats about the PeerConnection and allow you to do an ICE Restart at anytime. diff --git a/examples/ice-restart/drawio b/examples/ice-restart/drawio new file mode 100644 index 00000000000..345a61ecb65 --- /dev/null +++ b/examples/ice-restart/drawio @@ -0,0 +1 @@ +7Vxbc5s6EP41nmkf0uEOfoydXqanPfE5Tue0jzLINlNAVMiJ019/JBAYJOHYDviSxpmJYQEh9vu02l0tHpjjeP0Rg3T5FQUwGhhasB6YNwODfhybfjHJYyHRTYNLFjgMuGwjmIa/IRdqXLoKA5g1TiQIRSRMm0IfJQn0SUMGMEYPzdPmKGreNQULKAmmPohk6X9hQJaF1DPcjfwTDBfL8s66MyyOxKA8mT9JtgQBeqiJzPcDc4wRIsVWvB7DiGmv1Etx3YeWo1XHMEzILhd8ib/GqY+//Z6hv4dkMfzn9s674q3cg2jFH5h3ljyWGoBJcM0USfcSlFDhKADZErJWdbqzJHHEN5l8AgiBOMklhmZSaUYw+lkpz2CSn5D4S36Rv8L3VWPyM/EOwqABE3/CjxDFkOBHesLDBhybK3xZw6WUYRgBEt43wQWcI4uqueoOExTSnhgaJ7Sl8XY4ne0S3LKJDK2wD/lVdTCeaEh3hIYIwAtIpIboRu2xN6Ic6z1wNxW4OxFV1miO8n5uCOD8WqHywFWWD9BreoLupevNQbq14N95K7NS8HnKAIUQ0683t/M5xBC/Lc+iXZ+JV1JZ0YVSLNCRwDVp0q4g2BhFCG84Og+jSBCBKFwwYvqUXLQ/5ugeYhLSoX7ND8RhELDbjB6WIYHTFPjsng/UslEZRqskyImqiRRuZS27AVxv5S0/apsCHwzjHTeUNWYPtzBbReIGa/aliCtRxMcQEDhgnHdAzJRS/GcAQUaaCFFt0u/pzYT+RwxtCb+NHvUWTdehrau5DunAMAMAvbkv4U+POL4HZ/NugLFcrwGM6WoSLHo5y9VxsfrCxZNwwfDXCmYMgNBn8PggCcKAQpVdvPY9uxwGXP+WpdC/yuL3pn99hzmzaSyeo2YbeoGlUrNnzEzH6UbNriGq2XAUavYUaq6EnevZltSMEmZVUphcOq1dS9S3aSr0bR2T1s5Wc8+neWpUQH3S15hgvATU944uHRTZ1pjayW2N1Y4Kc6rGRdQToosfEpUDXBogS+UAVWcdR/uyCXqh2rc8TZwAVPPscbUvW6SeYpSPqBajXCfZw2uQoh6jZpMjZxCk6HKUIoGRLUHKNldxdO0TVFfqFzCD0QRlYT6IzZsZIgTFCq0TJIxZtCJRmMBxlXbSGuqXhzWlC89u6V5XJrMJh+0q0DAVaIi5hs7QMFRphT8EDVuYwM4ADdl5iMKMwARiOTA8Q4vVA0iuKwU6hoySKs4xe0NJNc21jJl5BNc8FzuqpWX9CGRZ6Dfh20OxjRSs4H/Mbfan9D/yzwUkbaskbTUyh80mdk3aVsRoa6jnpK0hp36mdIjVUm5vJrfTu1xjeUbo7R86zCsfpATKHL6zdGmcK81xfwN9KKFXZE0xjFEeU+QYXnYgIYZxjnHqMMKUgzhJyR3aUrgOyXd+jG3/YBe9s/nezZq3ke888p1WvReGacvD2WdlaD1DjCItcTTtamqHwnqIKUYQfa+P7TArX1iS98puqrQlw+Iq+KGLy5ydjc5y2L/6qDWcmjBpqkDiqC6qdcBSYOGPgDyZcvmTWhMSx1NMakfNC1uyJygp+TVoeM5cJvr6ruceNpOJ0YfUUM8zmSW7nS1BQzFY/9iYQQRckQA3VCtyvZldW54bJWxei7MGrTVVblfFWY4Icc9D1jYk4F9epCgvt3qqNfCjTqv2frHi64gTBsrw0HBPbMgTh253I27yEI7syV/4Wzxzv4z8yWg6T6/kAffp7m6SO7MUjot3YKswq4wpbGXo19dY+7wYu+D9t+/os/51Pb52Q82/VVQe5+U9McwyVpJ9eo1L6lWAsEeFj6EqHOyrwkepcZnkkpYb1me/YEGd+DK2Z76oNvHj9/pOLV/GdjeX5XvNjJlgBQ9LofFET2FgnuLrqQytY0p1kIeaWkcucxJL+FqMLSUDeKydlrITsi2dHkp30huvKNCNos1DbbkSqB3WoDunuXuJNG/PKJ+M5nJd5KE+vGuLueiqmq9jmrtaWzFnrzSXXVWxJE27qpJzzbonLJYzZSlg5+f0z9sqS6bS6MrXGwWfcs3VDK1ZyVWYLIqiqxnCAcRXVCyXXmU+SZUdK/aSWZYOGlVWRc9O1FuCQZKlCJPL6XLow7utvW5hwAH9ZmXY3REDRpS2MBiXry5MQIj36O5Zpqw68COldbDNElvdj1TW3Nk9+ZHy0liEFi/HdRdVrnTcjxoqycn+M3kJ4ll6FoNSUz99UCrnyvOJ9LzecniW1sUCjRat91WioQ6t9kt07+Cls/WBDyAOI/aUn2B0D5kN5wdqmtXyT82tL7d3KduovHr9GF79Nr4+Gbx6p/TqTSG5Vys82NerN4UaBn0oNdVdplDNVTlvlVFuMidphXMAKRxhzJL09yF4WbZDstjD01tsfYes1rFsR2Uvfgw2CYJtJV+d2ABvRxugnzSDpQvL4KZ7sBGoSpQqn/joRkDOMdHA61+Y0fuyjs5WhJzFS2HPzGGLw/3UGWzFC3lzRDmTMf4vmc1lCsbRI4s5y7fhF4AewoUkxYienR2WCek04CXsnbMZzAdWThvKi9dw1xEKty3bkiinLMLoLdjd5QWzHsqHTzSXFIbtVHOE5+gC+gcmfz1doFF/v66jVuMO5Xknrjk/7pLEthXgJx0X56SclBexRDLtXNMuzqedsZLubn5HrDh983Ns5vv/AQ== \ No newline at end of file diff --git a/examples/ice-single-port/README.md b/examples/ice-single-port/README.md index 098d0a7f162..f9e270af6c8 100644 --- a/examples/ice-single-port/README.md +++ b/examples/ice-single-port/README.md @@ -1,13 +1,17 @@ # ice-single-port + ice-single-port demonstrates Pion WebRTC's ability to serve many PeerConnections on a single port. Pion WebRTC has no global state, so by default ports can't be shared between two PeerConnections. Using the SettingEngine a developer can manually share state between many PeerConnections and allow multiple to use the same port +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fice-single-port%2Fdrawio) + ## Instructions ### Download ice-single-port + This example requires you to clone the repo since it is serving static HTML. ``` @@ -18,9 +22,11 @@ cd webrtc/examples/ice-single-port ``` ### Run ice-single-port + Execute `go run *.go` ### Open the Web UI + Open [http://localhost:8080](http://localhost:8080). This will automatically open 5 PeerConnections. This page will print a Local/Remote line for each PeerConnection. Note that all 10 PeerConnections have different ports for their Local port. However for the remote they all will be using port 8443. diff --git a/examples/ice-single-port/drawio b/examples/ice-single-port/drawio new file mode 100644 index 00000000000..88c07299573 --- /dev/null +++ b/examples/ice-single-port/drawio @@ -0,0 +1 @@ +7Vxfc5s4EP80nuk9uMN/8GPstOn10otbp9P2UQbZ5gqICjlx+ulPAoFBkh3bAcdOk8zYsAgh9re72l2t3DNH8eoKg3TxCQUw6hlasOqZlz3DMGzXpF+M8lBQdEcbFJQ5DgNOWxMm4W/IiRqnLsMAZo2GBKGIhGmT6KMkgT5p0ADG6L7ZbIai5lNTMIcSYeKDSKZ+CwOyKKie4a7pH2A4X5RP1h3+fjEoG/M3yRYgQPc1kvmuZ44wQqQ4ilcjGDHulXwp7nu/4Wo1MAwTsssN1/GnOPXx199T9O+AzAefb269Pu/lDkRL/sJ8sOSh5ABMggvGSHqWoIQShwHIFpD1qtOTBYkjfsjoY0AIxElOMTSTUjOC0c+KeQaj/ITEX/Cb/CW+qzqT34kPEAYNmPgbXkEUQ4IfaIP7NTg2Z/iihktJwzACJLxrggu4jMyr7qonjFFIR2JoXKAtjffDxdkuwS27yNAS+5DfVQfjkY6oXjQ7IgDPIZE6oge1116Tcqz3wN1U4O5ElFnDGcrHuRYA59cSlRf6Wa6gF7SB7qWr9UV6NOffeS/TkvBxwgCFENOvNzezGcQQ/1W2okOfindSWjGEkiyII4Er0hS7QsBGKEJ4LaOzMIoEEojCORNMnwoXHY85vIOYhFTVL/iFOAwC9pjh/SIkcJICnz3znlo2SsNomQS5oGqiCG+UWvYAuNoqt/yqbQryYBhv7YJSk+zBFslWCXFDavYVEVcSER9DQGCPybwDYsaU4pMBBJnQRIhyk35PLsf0EzG0JfzWfNQ3cLoObZ3NdUh7hhkA6M18CX96xfE9OJ21A4zleg1gTFeTYNEdW8bF6goXT8IFw19LmDEAQp/B44MkCAMKVXb23PfsUg04/y1LwX+Vxe+M//oOc2bTWDyFzTb0AkvFZs+Ymo7TDptdQ2Sz4SjY7CnYXBFb57MtsRklzKqkMDl3sXYtkd+mqeC3dUyxdraaez7NU6MC6pO+xgijBaC+d3TuoMi2xtSe3dZYm1FhTtWoiHpCdPYqUTnApQEayO5P1eY4vJcN0AvlveVpovlXzbLH5b5sjzqKUK5QLUK5SLL71xBFraFmU0ZOIETR5RhFAiNbgJQdLuPowieoztRrMIXRGGVhrsTm5RQRgmIF1wkSdBYtSRQmcFQlnbQG+2W1puLCc1u615bBbMJhuwo0TAUaYqahNTQMVVLhD0HDFqavE0BDdh2iMCMwgVgOC0/QYnUAkutKYY4ho6SKcszOUFJNcxt0ZhbBFc/EDmtJWT8CWRb6Tfj2YGwjASv4HzOb/Sv9j/zvDFK2VYq20sxBs4tdU7aVYGzqqOOUrSEnfiZUxWoJtzfjm8ltzrE8H/TXH6rmlQ9SAmUO3lq6pOdKc9ydog8k9IqcKYYxymOKHMPzDiTEIM4xnjuMMOUgTmJyi7YUrkLynV9jxz/YTW9tfna54n3kJw/8ZCPfC8O05eXskzK0niFGkZaoTbua2oGwGmKKEUTXq2M7zMpnluLt202WKvMrrkI6dHGJszXdLJX+1UOtodQESZGFP6p7ah2wCFj4IiBPpJz/hNYExPEUE9pRM8KW7AVKTH4NGJ4yj4l+vuu5h81iYuQhddTxLGbJLueGgKFQ1j82XhABVyS/DdVaXGdm15ZnRgmb17Ks3sZqKretsixHhLhjlbUNCfiXFyXKC62eavX7qNOqvV+c+KpxgqIMDg31xI48UXXb07jxfTi0x//gr/HUvR764+FklvZlhftwezvOnVkKx9k7sFWQVZU0KMK+rjTt43zkgndfv6OP+qfV6MINNf9GUXGcl/XEMMtYKfaZ81uu7DFUBYNdVfYoOS6LuMTlhu3ZL1RQp7yM7TkvymD88L1+UsuUsdP1bfnZ03NlPKNTWJPHxfNEzKxjSvWPhxpaRy5vEkv3NphaKgzgodYsZQ2yLYMeSE/SG1sT6EHR56GWXIncDqvPrYu5ewZifgapY0euhzzUg3dtMQtdVfG1LOautqmIs1Mxlx1VsRhN61epuWbFExYLmbIUsPa5+Od9lcVSadT39Uahp1xtNUUrVmwVJvOi3GqKcABxn5LloqvMJ6lyYMVZMs3SXqO+qhjZM42WYJBkKcLkfIYc+vB266g3SMAB42bl1+0JBoyo2MJgVG5ZGIMQ7zHck0xYteBHDkxDsIeqYjtdWW1nd+RHyotiEZq/HNddXHRUOu5HDZXkVP9L2PwghaTOc4ekcp48n0Zf0N4GsTBDyfOuCjPUcdZ+Ke4dPHS2MvAexGHE3vEDjO4gs9/8Qo2vWv5Xc+nL412KNSqPXu/Ao98mnI8Grt5JefSmkNaryg329edNsW7BEjpqLz+ollM5X5VRuWTO0RLnaFJswpil5u9C8LKshmipLeu5LbW+Qy7rWFajshQ/euu0wBNKvLZp9eNpq9PKW+nC0rdlHKj+VUlStf36yOovZ5VoqPUFZvS5bJjTJSHnvwHMFV2ygcL1PWrOWrH5boaoxGRMGRbM2jIG4+iBRZnlvvc5oJdwQUkxoq2zw3IfrYa4hO0vm8JcqXKxoXLxGuA6QpG2ZVuSyCmLLjoLb3fZTNZBqfBx5pHSjp3I/OA5uoD+geleTxfEqLvf0VHzdYdyvGeuL+90EWLbGtqjTotzWjIpL1uJwrRz/bqU4uhMKq3pt/+uXfi5H6Sh/d670o3xZ8Ua+z2cfrmlnWkX47/p55uMTl0RzOWU8sxnQCOs2DF0fEdGmkIUMrg5zyFGi6oNKKoK6jYcGSUUxw1YSlthtBzArG3I2mz8aFiNbTZEUPBHjco2mX50ZbP4yYxny3uImwTFxced66JM0T9qy4TQ0/WPDhbN17/daL77Hw== \ No newline at end of file diff --git a/examples/ice-tcp/README.md b/examples/ice-tcp/README.md index 1f505eaf3ad..53570ce4312 100644 --- a/examples/ice-tcp/README.md +++ b/examples/ice-tcp/README.md @@ -1,9 +1,13 @@ # ice-tcp + ice-tcp demonstrates Pion WebRTC's ICE TCP abilities. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fice-tcp%2Fdrawio) + ## Instructions ### Download ice-tcp + This example requires you to clone the repo since it is serving static HTML. ``` @@ -14,9 +18,11 @@ cd webrtc/examples/ice-tcp ``` ### Run ice-tcp + Execute `go run *.go` ### Open the Web UI + Open [http://localhost:8080](http://localhost:8080). This will automatically start a PeerConnection. This page will now prints stats about the PeerConnection. The UDP candidates will be filtered out from the SDP. Congrats, you have used Pion WebRTC! Now start building something cool diff --git a/examples/ice-tcp/drawio b/examples/ice-tcp/drawio new file mode 100644 index 00000000000..88c07299573 --- /dev/null +++ b/examples/ice-tcp/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/insertable-streams/README.md b/examples/insertable-streams/README.md index c4bf0795173..4796ac5eb43 100644 --- a/examples/insertable-streams/README.md +++ b/examples/insertable-streams/README.md @@ -1,4 +1,5 @@ # insertable-streams + insertable-streams demonstrates how to use insertable streams with Pion. This example modifies the video with a single-byte XOR cipher before sending, and then decrypts in Javascript. @@ -6,35 +7,47 @@ decrypts in Javascript. insertable-streams allows the browser to process encoded video. You could implement E2E encyption, add metadata or insert a completely different video feed! +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Finsertable-streams%2Fdrawio) + ## Instructions + ### Create IVF named `output.ivf` that contains a VP8 track + ``` ffmpeg -i $INPUT_FILE -g 30 output.ivf ``` ### Download insertable-streams + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/insertable-streams ``` ### Open insertable-streams example page + [jsfiddle.net](https://jsfiddle.net/uqr80Lak/) you should see two text-areas and a 'Start Session' button. You will also have a 'Decrypt' checkbox. When unchecked the browser will not decrypt the incoming video stream, so it will stop playing or display certificates. ### Run insertable-streams with your browsers SessionDescription as stdin + The `output.ivf` you created should be in the same directory as `insertable-streams`. In the jsfiddle the top textarea is your browser, copy that and: #### Linux/macOS + Run `echo $BROWSER_SDP | insertable-streams` + #### Windows + 1. Paste the SessionDescription into a file. 1. Run `insertable-streams < my_file` ### Input insertable-streams's SessionDescription into your browser + Copy the text that `insertable-streams` just emitted and copy into second text area -### Hit 'Start Session' in jsfiddle, enjoy your video! +### Hit 'Start Session' in jsfiddle, enjoy your video + A video should start playing in your browser above the input boxes. `insertable-streams` will exit when the file reaches the end. To stop decrypting the stream uncheck the box and the video will not be viewable. diff --git a/examples/insertable-streams/drawio b/examples/insertable-streams/drawio new file mode 100644 index 00000000000..b744c3ff492 --- /dev/null +++ b/examples/insertable-streams/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/ortc/README.md b/examples/ortc/README.md index 54d370ff756..00c97a06969 100644 --- a/examples/ortc/README.md +++ b/examples/ortc/README.md @@ -1,4 +1,5 @@ # ortc + ortc demonstrates Pion WebRTC's [ORTC](https://ortc.org/) capabilities. Instead of using the Session Description Protocol to configure and communicate ORTC provides APIs. Users then can implement signaling with whatever protocol they wish. ORTC can then be used to implement WebRTC. A ORTC implementation can parse/emit Session Description and act as a WebRTC @@ -6,22 +7,29 @@ implementation. In this example we have defined a simple JSON based signaling protocol. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fortc%2Fdrawio) + ## Instructions + ### Download ortc + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/ortc ``` ### Run first client as offerer + `ortc -offer` this will emit a base64 message. Copy this message to your clipboard. ## Run the second client as answerer + Run the second client. This should be launched with the message you copied in the previous step as stdin. `echo BASE64_MESSAGE_YOU_COPIED | ortc` ### Enjoy + If everything worked you will see `Data channel 'Foo'-'' open.` in each terminal. Each client will send random messages every 5 seconds that will appear in the terminal diff --git a/examples/ortc/drawio b/examples/ortc/drawio new file mode 100644 index 00000000000..eff991db9d6 --- /dev/null +++ b/examples/ortc/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/pion-to-pion/README.md b/examples/pion-to-pion/README.md index 7bf909bb760..238b3279fcf 100644 --- a/examples/pion-to-pion/README.md +++ b/examples/pion-to-pion/README.md @@ -1,17 +1,24 @@ # pion-to-pion + pion-to-pion is an example of two pion instances communicating directly! The SDP offer and answer are exchanged automatically over HTTP. The `answer` side acts like a HTTP server and should therefore be ran first. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fpion-to-pion%2Fdrawio) + ## Instructions + First run `answer`: + ```sh export GO111MODULE=on go install github.com/pion/webrtc/v3/examples/pion-to-pion/answer answer ``` + Next, run `offer`: + ```sh go install github.com/pion/webrtc/v3/examples/pion-to-pion/offer offer @@ -19,7 +26,8 @@ offer You should see them connect and start to exchange messages. -## You can use Docker-compose to start this example: +## You can use Docker-compose to start this example + ```sh docker-compose up -d ``` diff --git a/examples/pion-to-pion/drawio b/examples/pion-to-pion/drawio new file mode 100644 index 00000000000..d19b3c48a7c --- /dev/null +++ b/examples/pion-to-pion/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/play-from-disk-renegotation/README.md b/examples/play-from-disk-renegotation/README.md index 17669e531bd..802f4c2b6d9 100644 --- a/examples/play-from-disk-renegotation/README.md +++ b/examples/play-from-disk-renegotation/README.md @@ -1,11 +1,15 @@ # play-from-disk-renegotiation + play-from-disk-renegotiation demonstrates Pion WebRTC's renegotiation abilities. For a simpler example of playing a file from disk we also have [examples/play-from-disk](/examples/play-from-disk) +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fplay-from-disk-renegotation%2Fdrawio) + ## Instructions ### Download play-from-disk-renegotiation + This example requires you to clone the repo since it is serving static HTML. ``` @@ -28,6 +32,7 @@ ffmpeg -i $INPUT_FILE -g 30 -b:v 2M output.ivf The `output.ivf` you created should be in the same directory as `play-from-disk-renegotiation`. Execute `go run *.go` ### Open the Web UI + Open [http://localhost:8080](http://localhost:8080) and you should have a `Add Track` and `Remove Track` button. Press these to add as many tracks as you want, or to remove as many as you wish. Congrats, you have used Pion WebRTC! Now start building something cool diff --git a/examples/play-from-disk-renegotation/drawio b/examples/play-from-disk-renegotation/drawio new file mode 100644 index 00000000000..147a6c15802 --- /dev/null +++ b/examples/play-from-disk-renegotation/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/play-from-disk/README.md b/examples/play-from-disk/README.md index 15204ec9445..5922a580923 100644 --- a/examples/play-from-disk/README.md +++ b/examples/play-from-disk/README.md @@ -1,10 +1,15 @@ # play-from-disk + play-from-disk demonstrates how to send video and/or audio to your browser from files saved to disk. For an example of playing H264 from disk see [play-from-disk-h264](https://github.com/pion/example-webrtc-applications/tree/master/play-from-disk-h264) +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fplay-from-disk%2Fdrawio) + ## Instructions + ### Create IVF named `output.ivf` that contains a VP8 track and/or `output.ogg` that contains a Opus track + ``` ffmpeg -i $INPUT_FILE -g 30 -b:v 2M output.ivf ffmpeg -i $INPUT_FILE -c:a libopus -page_duration 20000 -vn output.ogg @@ -20,23 +25,30 @@ go get github.com/pion/webrtc/v3/examples/play-from-disk ``` ### Open play-from-disk example page + [jsfiddle.net](https://jsfiddle.net/a1cz42op/) you should see two text-areas, 'Start Session' button and 'Copy browser SessionDescription to clipboard' ### Run play-from-disk with your browsers Session Description as stdin + The `output.ivf` you created should be in the same directory as `play-from-disk`. In the jsfiddle press 'Copy browser Session Description to clipboard' or copy the base64 string manually. Now use this value you just copied as the input to `play-from-disk` #### Linux/macOS + Run `echo $BROWSER_SDP | play-from-disk` + #### Windows + 1. Paste the SessionDescription into a file. 1. Run `play-from-disk < my_file` ### Input play-from-disk's Session Description into your browser + Copy the text that `play-from-disk` just emitted and copy into the second text area in the jsfiddle -### Hit 'Start Session' in jsfiddle, enjoy your video! +### Hit 'Start Session' in jsfiddle, enjoy your video + A video should start playing in your browser above the input boxes. `play-from-disk` will exit when the file reaches the end Congrats, you have used Pion WebRTC! Now start building something cool diff --git a/examples/play-from-disk/drawio b/examples/play-from-disk/drawio new file mode 100644 index 00000000000..32431491b5d --- /dev/null +++ b/examples/play-from-disk/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/reflect/README.md b/examples/reflect/README.md index 77abe8e0bff..887f905b0b2 100644 --- a/examples/reflect/README.md +++ b/examples/reflect/README.md @@ -1,28 +1,41 @@ # reflect + reflect demonstrates how with one PeerConnection you can send video to Pion and have the packets sent back. This example could be easily extended to do server side processing. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Freflect%2Fdrawio) + ## Instructions + ### Download reflect + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/reflect ``` ### Open reflect example page + [jsfiddle.net](https://jsfiddle.net/9jgukzt1/) you should see two text-areas and a 'Start Session' button. ### Run reflect, with your browsers SessionDescription as stdin + In the jsfiddle the top textarea is your browser, copy that and: + #### Linux/macOS + Run `echo $BROWSER_SDP | reflect` + #### Windows + 1. Paste the SessionDescription into a file. 1. Run `reflect < my_file` ### Input reflect's SessionDescription into your browser + Copy the text that `reflect` just emitted and copy into second text area -### Hit 'Start Session' in jsfiddle, enjoy your video! +### Hit 'Start Session' in jsfiddle, enjoy your video + Your browser should send video to Pion, and then it will be relayed right back to you. Congrats, you have used Pion WebRTC! Now start building something cool diff --git a/examples/reflect/drawio b/examples/reflect/drawio new file mode 100644 index 00000000000..c63bbac2504 --- /dev/null +++ b/examples/reflect/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/rtp-forwarder/README.md b/examples/rtp-forwarder/README.md index 8f3bb1aa786..41e57035f45 100644 --- a/examples/rtp-forwarder/README.md +++ b/examples/rtp-forwarder/README.md @@ -1,34 +1,49 @@ # rtp-forwarder + rtp-forwarder is a simple application that shows how to forward your webcam/microphone via RTP using Pion WebRTC. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Frtp-forwarder%2Fdrawio) + ## Instructions + ### Download rtp-forwarder + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/rtp-forwarder ``` ### Open rtp-forwarder example page + [jsfiddle.net](https://jsfiddle.net/1qva2zd8/) you should see your Webcam, two text-areas and a 'Start Session' button ### Run rtp-forwarder, with your browsers SessionDescription as stdin + In the jsfiddle the top textarea is your browser, copy that and: + #### Linux/macOS + Run `echo $BROWSER_SDP | rtp-forwarder` + #### Windows + 1. Paste the SessionDescription into a file. 1. Run `rtp-forwarder < my_file` ### Input rtp-forwarder's SessionDescription into your browser + Copy the text that `rtp-forwarder` just emitted and copy into second text area -### Hit 'Start Session' in jsfiddle and enjoy your RTP forwarded stream! +### Hit 'Start Session' in jsfiddle and enjoy your RTP forwarded stream + You can run any of these commands at anytime. The media is live/stateless, you can switch commands without restarting Pion. #### VLC + Open `rtp-forwarder.sdp` with VLC and enjoy your live video! #### ffmpeg/ffprobe + Run `ffprobe -i rtp-forwarder.sdp -protocol_whitelist file,udp,rtp` to get more details about your streams Run `ffplay -i rtp-forwarder.sdp -protocol_whitelist file,udp,rtp` to play your streams @@ -36,4 +51,5 @@ Run `ffplay -i rtp-forwarder.sdp -protocol_whitelist file,udp,rtp` to play your You can add `-fflags nobuffer -flags low_delay -framedrop` to lower the latency. You will have worse playback in networks with jitter. Read about minimizing the delay on [Stackoverflow](https://stackoverflow.com/a/49273163/5472819). #### Twitch/RTMP + `ffmpeg -protocol_whitelist file,udp,rtp -i rtp-forwarder.sdp -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv rtmp://live.twitch.tv/app/$STREAM_KEY` Make sure to replace `$STREAM_KEY` at the end of the URL first. diff --git a/examples/rtp-forwarder/drawio b/examples/rtp-forwarder/drawio new file mode 100644 index 00000000000..9ad55517512 --- /dev/null +++ b/examples/rtp-forwarder/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/rtp-to-webrtc/README.md b/examples/rtp-to-webrtc/README.md index fd467472317..27ab07c2509 100644 --- a/examples/rtp-to-webrtc/README.md +++ b/examples/rtp-to-webrtc/README.md @@ -1,39 +1,49 @@ # rtp-to-webrtc + rtp-to-webrtc demonstrates how to consume a RTP stream video UDP, and then send to a WebRTC client. With this example we have pre-made GStreamer and ffmpeg pipelines, but you can use any tool you like! +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Frtp-to-webrtc%2Fdrawio) + ## Instructions + ### Download rtp-to-webrtc + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/rtp-to-webrtc ``` ### Open jsfiddle example page -[jsfiddle.net](https://jsfiddle.net/z7ms3u5r/) you should see two text-areas and a 'Start Session' button +[jsfiddle.net](https://jsfiddle.net/z7ms3u5r/) you should see two text-areas and a 'Start Session' button ### Run rtp-to-webrtc with your browsers SessionDescription as stdin + In the jsfiddle the top textarea is your browser's SessionDescription, copy that and: #### Linux/macOS + Run `echo $BROWSER_SDP | rtp-to-webrtc` #### Windows + 1. Paste the SessionDescription into a file. 1. Run `rtp-to-webrtc < my_file` ### Send RTP to listening socket -You can use any software to send VP8 packets to port 5004. We also have the pre made examples below +You can use any software to send VP8 packets to port 5004. We also have the pre made examples below #### GStreamer + ``` gst-launch-1.0 videotestsrc ! video/x-raw,width=640,height=480,format=I420 ! vp8enc error-resilient=partitions keyframe-max-dist=10 auto-alt-ref=true cpu-used=5 deadline=1 ! rtpvp8pay ! udpsink host=127.0.0.1 port=5004 ``` #### ffmpeg + ``` ffmpeg -re -f lavfi -i testsrc=size=640x480:rate=30 -vcodec libvpx -cpu-used 5 -deadline 1 -g 10 -error-resilient 1 -auto-alt-ref 1 -f rtp 'rtp://127.0.0.1:5004?pkt_size=1200' ``` @@ -51,14 +61,17 @@ ffmpeg -re -f lavfi -i testsrc=size=640x480:rate=30 -pix_fmt yuv420p -c:v libx26 ``` ### Input rtp-to-webrtc's SessionDescription into your browser + Copy the text that `rtp-to-webrtc` just emitted and copy into second text area -### Hit 'Start Session' in jsfiddle, enjoy your video! +### Hit 'Start Session' in jsfiddle, enjoy your video + A video should start playing in your browser above the input boxes. Congrats, you have used Pion WebRTC! Now start building something cool ## Dealing with broken/lossy inputs + Pion WebRTC also provides a [SampleBuilder](https://pkg.go.dev/github.com/pion/webrtc/v3@v3.0.4/pkg/media/samplebuilder). This consumes RTP packets and returns samples. It can be used to re-order and delay for lossy streams. You can see its usage in this example in [daf27b](https://github.com/pion/webrtc/commit/daf27bd0598233b57428b7809587ec3c09510413). diff --git a/examples/rtp-to-webrtc/drawio b/examples/rtp-to-webrtc/drawio new file mode 100644 index 00000000000..dae0280ff1f --- /dev/null +++ b/examples/rtp-to-webrtc/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/save-to-disk/README.md b/examples/save-to-disk/README.md index 1aae297e43c..fcd64085e64 100644 --- a/examples/save-to-disk/README.md +++ b/examples/save-to-disk/README.md @@ -1,30 +1,43 @@ # save-to-disk + save-to-disk is a simple application that shows how to record your webcam/microphone using Pion WebRTC and save VP8/Opus to disk. If you wish to save VP8/Opus inside the same file see [save-to-webm](https://github.com/pion/example-webrtc-applications/tree/master/save-to-webm) +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fsave-to-disk%2Fdrawio) + ## Instructions + ### Download save-to-disk + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/save-to-disk ``` ### Open save-to-disk example page + [jsfiddle.net](https://jsfiddle.net/vfmcg8rk/1/) you should see your Webcam, two text-areas and a 'Start Session' button ### Run save-to-disk, with your browsers SessionDescription as stdin + In the jsfiddle the top textarea is your browser, copy that and: + #### Linux/macOS + Run `echo $BROWSER_SDP | save-to-disk` + #### Windows + 1. Paste the SessionDescription into a file. 1. Run `save-to-disk < my_file` ### Input save-to-disk's SessionDescription into your browser + Copy the text that `save-to-disk` just emitted and copy into second text area -### Hit 'Start Session' in jsfiddle, wait, close jsfiddle, enjoy your video! +### Hit 'Start Session' in jsfiddle, wait, close jsfiddle, enjoy your video + In the folder you ran `save-to-disk` you should now have a file `output-1.ivf` play with your video player of choice! > Note: In order to correctly create the files, the remote client (JSFiddle) should be closed. The Go example will automatically close itself. diff --git a/examples/save-to-disk/drawio b/examples/save-to-disk/drawio new file mode 100644 index 00000000000..98183c9228a --- /dev/null +++ b/examples/save-to-disk/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/simulcast/README.md b/examples/simulcast/README.md index d48bf11b869..e5f3877c15d 100644 --- a/examples/simulcast/README.md +++ b/examples/simulcast/README.md @@ -1,32 +1,45 @@ # simulcast + demonstrates of how to handle incoming track with multiple simulcast rtp streams and show all them back. The browser will not send higher quality streams unless it has the available bandwidth. You can look at the bandwidth estimation in `chrome://webrtc-internals`. It is under `VideoBwe` when `Read Stats From: Legacy non-Standard` is selected. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fsimulcast%2Fdrawio) + ## Instructions + ### Download simulcast + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/simulcast ``` ### Open simulcast example page + [jsfiddle.net](https://jsfiddle.net/rxk4bftc) you should see two text-areas and a 'Start Session' button. ### Run simulcast, with your browsers SessionDescription as stdin + In the jsfiddle the top textarea is your browser, copy that and: + #### Linux/macOS + Run `echo $BROWSER_SDP | simulcast` + #### Windows + 1. Paste the SessionDescription into a file. 1. Run `simulcast < my_file` ### Input simulcast's SessionDescription into your browser + Copy the text that `simulcast` just emitted and copy into second text area -### Hit 'Start Session' in jsfiddle, enjoy your video! +### Hit 'Start Session' in jsfiddle, enjoy your video + Your browser should send a simulcast track to Pion, and then all 3 incoming streams will be relayed back. Congrats, you have used Pion WebRTC! Now start building something cool diff --git a/examples/simulcast/drawio b/examples/simulcast/drawio new file mode 100644 index 00000000000..508008c9503 --- /dev/null +++ b/examples/simulcast/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/examples/swap-tracks/README.md b/examples/swap-tracks/README.md index d8a8627522b..ffcfa72ffcf 100644 --- a/examples/swap-tracks/README.md +++ b/examples/swap-tracks/README.md @@ -1,28 +1,41 @@ # swap-tracks + swap-tracks demonstrates how to swap multiple incoming tracks on a single outgoing track. +## [architecture](https://viewer.diagrams.net/?tags=%7B%7D&highlight=FFFFFF&edit=_blank&layers=1&nav=1&title=drawio#Uhttps%3A%2F%2Fraw.githubusercontent.com%2Fmohammadne%2Fwebrtc-pion%2Fmaster%2Fexamples%2Fswap-tracks%2Fdrawio) + ## Instructions + ### Download swap-tracks + ``` export GO111MODULE=on go get github.com/pion/webrtc/v3/examples/swap-tracks ``` ### Open swap-tracks example page + [jsfiddle.net](https://jsfiddle.net/dzc17fga/) you should see two text-areas and a 'Start Session' button. ### Run swap-tracks, with your browsers SessionDescription as stdin + In the jsfiddle the top textarea is your browser, copy that and: + #### Linux/macOS + Run `echo $BROWSER_SDP | swap-tracks` + #### Windows + 1. Paste the SessionDescription into a file. 1. Run `swap-tracks < my_file` ### Input swap-tracks's SessionDescription into your browser + Copy the text that `swap-tracks` just emitted and copy into second text area -### Hit 'Start Session' in jsfiddle, enjoy your video! +### Hit 'Start Session' in jsfiddle, enjoy your video + Your browser should send streams to Pion, and then a stream will be relayed back, changing every 5 seconds. Congrats, you have used Pion WebRTC! Now start building something cool diff --git a/examples/swap-tracks/drawio b/examples/swap-tracks/drawio new file mode 100644 index 00000000000..a11556d5e19 --- /dev/null +++ b/examples/swap-tracks/drawio @@ -0,0 +1 @@ +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 \ No newline at end of file