├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── help-wanted-or-question.md └── workflows │ ├── build_bundle.yaml │ └── build_bundle_dev.yaml ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── SECURITY.md ├── _BUNDLE_OF ├── _RESTREAMER-UI+CORE ├── readme-promo.gif ├── readme.png ├── run.sh └── ui-root ├── index.html └── index_icon.svg /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: datarhei 5 | open_collective: datarhei 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: datarhei 11 | otechie: # Replace with a single Otechie username 12 | custom: ['https://datarhei.com'] 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | 40 | ## Business inquiries 41 | **We provide support for commercial requirements with professional support, agile software development, and consulting.** If you have a commercial request, be it a bug or a feature enhancement, please contact us directly at support@datarhei.com. 42 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: feature 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | 22 | ## Business inquiries 23 | **We provide support for commercial requirements with professional support, agile software development, and consulting.** If you have a commercial request, be it a bug or a feature enhancement, please contact us directly at support@datarhei.com. 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/help-wanted-or-question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Help wanted or question 3 | about: Get help and ask questions 4 | title: '' 5 | labels: help wanted, question 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Subject of the issue** 11 | Describe your issue here. 12 | 13 | **Your environment** 14 | Explain your setup so we can better understand what's going on. 15 | 16 | **Files** 17 | Add the Restreamer [Process-Report](https://www.youtube.com/watch?v=mZMGrweFCsM), the [Publication-Service Process-Report](https://youtu.be/7z95qnafzLo) or a list of relevant files for this issue. This will help us navigate the project and explain where to start. 18 | 19 | **Steps to reproduce** 20 | Tell us how to reproduce this issue. 21 | 22 | **Awesome** ⭐⭐⭐⭐⭐ 23 | If the Restreamer has problems processing your video signals, it would be constructive if you send us this origin stream by mail with the GitHub issue number to support@datarhei.com. This way, we can better see why the Restreamer is not working correctly. 24 | 25 | **Expected behavior** 26 | Tell us what should happen 27 | 28 | **Actual behavior** 29 | Tell us what happens instead 30 | 31 | ## Business inquiries 32 | **We provide support for commercial requirements with professional support, agile software development, and consulting.** If you have a commercial request, be it a bug or a feature enhancement, please contact us directly at support@datarhei.com. 33 | -------------------------------------------------------------------------------- /.github/workflows/build_bundle.yaml: -------------------------------------------------------------------------------- 1 | name: 'Build restreamer latest images' 2 | 3 | on: 4 | workflow_dispatch: 5 | workflow_call: 6 | push: 7 | branches-ignore: 8 | - '**' 9 | 10 | jobs: 11 | versions: 12 | runs-on: ubuntu-latest 13 | outputs: 14 | uiversion: ${{ steps.restreamerui.outputs.version }} 15 | bundleversion: ${{ steps.restreamerui.outputs.bundle }} 16 | coreversion: ${{ steps.core.outputs.version }} 17 | steps: 18 | - name: Checkout restreamr-ui repo 19 | uses: actions/checkout@v4 20 | with: 21 | repository: datarhei/restreamer-ui 22 | path: ./ui 23 | 24 | - name: Get latest version and bundle from UI 25 | id: restreamerui 26 | run: | 27 | echo "version=$(cat ./ui/package.json | jq '.version' | sed 's/\"//g')" >> "$GITHUB_OUTPUT" 28 | echo "bundle=$(cat ./ui/package.json | jq '.bundle' | sed 's/\"//g' | sed 's/restreamer-v//g' )" >> "$GITHUB_OUTPUT" 29 | 30 | - name: Checkout core repo 31 | uses: actions/checkout@v4 32 | with: 33 | repository: datarhei/core 34 | path: ./core 35 | 36 | - name: Get latest version from core 37 | id: core 38 | run: | 39 | echo "version=$(cat ./core/app/version.go | grep -E -o '(Major|Minor|Patch): [0-9]+,' | sed -E 's/^.*: ([0-9]+),.*$/\1/g' | paste -sd '.' - )" >> "$GITHUB_OUTPUT" 40 | 41 | - name: Show versions 42 | run: | 43 | echo "ui: ${{ steps.restreamerui.outputs.version }}" 44 | echo "bundle: ${{ steps.restreamerui.outputs.bundle }}" 45 | echo "core: ${{ steps.core.outputs.version }}" 46 | 47 | docker: 48 | needs: versions 49 | runs-on: [self-hosted] 50 | strategy: 51 | matrix: 52 | include: 53 | - ui: ${{ needs.versions.outputs.uiversion }} 54 | core: core${{ needs.versions.outputs.coreversion }}-alpine3.20 55 | ffmpeg: ffmpeg6.1.1-alpine3.20 56 | platforms: linux/amd64,linux/arm64,linux/arm/v7 57 | prefix: 58 | - ui: ${{ needs.versions.outputs.uiversion }} 59 | core: core${{ needs.versions.outputs.coreversion }}-alpine3.20 60 | ffmpeg: ffmpeg6.1.1-rpi-alpine3.20 61 | platforms: linux/arm64,linux/arm/v7 62 | prefix: rpi- 63 | - ui: ${{ needs.versions.outputs.uiversion }} 64 | core: core${{ needs.versions.outputs.coreversion }}-ubuntu22.04 65 | ffmpeg: ffmpeg6.1.1-vaapi-ubuntu22.04 66 | platforms: linux/amd64 67 | prefix: vaapi- 68 | - ui: ${{ needs.versions.outputs.uiversion }} 69 | core: core${{ needs.versions.outputs.coreversion }}-ubuntu22.04 70 | ffmpeg: ffmpeg6.1.1-cuda-ubuntu22.04-cuda11.7.1 71 | platforms: linux/amd64 72 | prefix: cuda- 73 | steps: 74 | - name: Checkout 75 | uses: actions/checkout@v4 76 | 77 | - name: Docker meta 78 | id: meta 79 | uses: docker/metadata-action@v5 80 | with: 81 | images: | 82 | datarhei/restreamer 83 | tags: | 84 | type=raw,value=${{ matrix.prefix }}${{ needs.versions.outputs.bundleversion }}-ui${{ needs.versions.outputs.uiversion }}-${{ matrix.core }}-${{ matrix.ffmpeg }} 85 | type=raw,value=${{ matrix.prefix }}${{ needs.versions.outputs.bundleversion }} 86 | type=raw,value=${{ matrix.prefix }}latest 87 | 88 | - name: Set up QEMU 89 | uses: docker/setup-qemu-action@master 90 | with: 91 | platforms: all 92 | 93 | - name: Set up Docker Buildx 94 | id: buildx 95 | uses: docker/setup-buildx-action@master 96 | 97 | - name: Login to DockerHub 98 | if: github.event_name != 'pull_request' 99 | uses: docker/login-action@v3 100 | with: 101 | username: ${{ secrets.DOCKER_USERNAME }} 102 | password: ${{ secrets.DOCKER_PASSWORD }} 103 | 104 | - name: Build Multi-Arch 105 | uses: docker/build-push-action@v5 106 | with: 107 | builder: ${{ steps.buildx.outputs.name }} 108 | context: . 109 | file: ./Dockerfile 110 | build-args: | 111 | RESTREAMER_UI_IMAGE=datarhei/restreamer-ui:${{ matrix.ui }} 112 | CORE_IMAGE=datarhei/base:${{ matrix.core }} 113 | FFMPEG_IMAGE=datarhei/base:${{ matrix.ffmpeg }} 114 | platforms: ${{ matrix.platforms }} 115 | push: true 116 | tags: ${{ steps.meta.outputs.tags }} 117 | labels: ${{ steps.meta.outputs.labels }} 118 | -------------------------------------------------------------------------------- /.github/workflows/build_bundle_dev.yaml: -------------------------------------------------------------------------------- 1 | name: 'Build restreamer dev images' 2 | 3 | on: 4 | workflow_dispatch: 5 | workflow_call: 6 | schedule: 7 | - cron: '37 5 * * *' 8 | push: 9 | branches-ignore: 10 | - '**' 11 | 12 | jobs: 13 | docker: 14 | runs-on: [self-hosted] 15 | strategy: 16 | matrix: 17 | include: 18 | - ui: dev 19 | core: core-dev-alpine3.21 20 | ffmpeg: ffmpeg7.1.1-alpine3.21 21 | platforms: linux/amd64,linux/arm64,linux/arm/v7 22 | name: dev 23 | - ui: dev 24 | core: core-dev-alpine3.21 25 | ffmpeg: ffmpeg7.1.1-rpi-alpine3.21 26 | platforms: linux/arm64,linux/arm/v7 27 | name: rpi-dev 28 | - ui: dev 29 | core: core-dev-ubuntu24.04 30 | ffmpeg: ffmpeg7.1.1-vaapi-ubuntu24.04 31 | platforms: linux/amd64 32 | name: vaapi-dev 33 | - ui: dev 34 | core: core-dev-ubuntu24.04 35 | ffmpeg: ffmpeg7.1.1-cuda-ubuntu24.04-cuda12.8.0 36 | platforms: linux/amd64 37 | name: cuda-dev 38 | steps: 39 | - name: Checkout 40 | uses: actions/checkout@v4 41 | 42 | - name: Docker meta 43 | id: meta 44 | uses: docker/metadata-action@v5 45 | with: 46 | images: | 47 | datarhei/restreamer 48 | tags: | 49 | type=raw,value=${{ matrix.name }} 50 | 51 | - name: Set up QEMU 52 | uses: docker/setup-qemu-action@master 53 | with: 54 | platforms: all 55 | 56 | - name: Set up Docker Buildx 57 | id: buildx 58 | uses: docker/setup-buildx-action@master 59 | 60 | - name: Login to DockerHub 61 | if: github.event_name != 'pull_request' 62 | uses: docker/login-action@v3 63 | with: 64 | username: ${{ secrets.DOCKER_USERNAME }} 65 | password: ${{ secrets.DOCKER_PASSWORD }} 66 | 67 | - name: Build Multi-Arch 68 | uses: docker/build-push-action@v5 69 | with: 70 | builder: ${{ steps.buildx.outputs.name }} 71 | context: . 72 | file: ./Dockerfile 73 | build-args: | 74 | RESTREAMER_UI_IMAGE=datarhei/restreamer-ui:${{ matrix.ui }} 75 | CORE_IMAGE=datarhei/base:${{ matrix.core }} 76 | FFMPEG_IMAGE=datarhei/base:${{ matrix.ffmpeg }} 77 | platforms: ${{ matrix.platforms }} 78 | push: true 79 | tags: ${{ steps.meta.outputs.tags }} 80 | labels: ${{ steps.meta.outputs.labels }} 81 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Restreamer 2 | 3 | ## 2.12.0 4 | 5 | ### UI v1.13.0 > v1.14.0 6 | 7 | - Add wettercom service 8 | - Add option to select which channels will be displayed on the playersite ([#392](https://github.com/datarhei/restreamer/issues/392), [#800](https://github.com/datarhei/restreamer/issues/800)) 9 | - Mod updates public videojs >v8 10 | - Fix erroneous filter setting 11 | - Fix encoded address 12 | - Fix double -filter parameter when encoder sets filter ([#787](https://github.com/datarhei/restreamer/issues/787)) 13 | - Fix Docker build ([#64](https://github.com/datarhei/restreamer-ui/issues/64)) 14 | 15 | ### 🧡💚💜 Thank you to all Patrons and donors 16 | 17 | - Michael Shepherd 18 | - Jacob Fritsche 19 | - Martin H. 20 | - Paulo Gonçalves 21 | - Philipp Burkart 22 | - Mark Stephens 23 | - Fabian Stoll 24 | - Perry Johnson 25 | - Alex O'Carroll 26 | - Fiberian 27 | - Ivan Hašek 28 | - krischan941 29 | - Doug Roberts 30 | - Bassim Charafeddine 31 | - josue osorto 32 | - Raketenbaum 33 | - Byron Garcia 34 | - Jeff Moe 35 | - Ramakrishna Chillara 36 | - Eduardo Sarabia 37 | - Giovanni Russo 38 | - Gioele Cerati 39 | - Blueman2 (Robert G. Pearse) 40 | - Alex Fuhr 41 | - Frank Schulz 42 | 43 | ## 2.11.0 44 | 45 | ### UI v1.12.0 > v1.13.0 46 | 47 | - Add to allow stream hints in case probing fails 48 | - Mod enables ff-loglevel and prepares the logging component 49 | - Mod uses official Instagram-RTMP target 50 | - Mod Remove unused imports 51 | - Mod Update translations 52 | - Mod updates dependencies 53 | - Fix player position 54 | 55 | ### Core v16.15.0 > v16.16.0 56 | 57 | - Add ConnectionIdleTimeout to RTMP server 58 | - Add WithLevel() to Logger interface 59 | - Fix datarhei/restreamer#759 60 | - Fix various RTMP bugs 61 | - Fix wrong log output when receiving a RTMP stream 62 | - Fix skipping session handling if collectors are nil 63 | - Update dependencies 64 | 65 | ### 🧡💚💜 Thank you to all Patrons and donors 66 | 67 | - Michael Shepherd 68 | - Jacob Fritsche 69 | - Martin H. 70 | - Paulo Gonçalves 71 | - Philipp Burkart 72 | - Mark Stephens 73 | - Fabian Stoll 74 | - Perry Johnson 75 | - Alex O'Carroll 76 | - Fiberian 77 | - Ivan Hašek 78 | - krischan941 79 | - Doug Roberts 80 | - Bassim Charafeddine 81 | - josue osorto 82 | - Raketenbaum 83 | - Byron Garcia 84 | - Jeff Moe 85 | - Ramakrishna Chillara 86 | - Eduardo Sarabia 87 | - Giovanni Russo 88 | - Gioele Cerati 89 | - Blueman2 (Robert G. Pearse) 90 | - Alex Fuhr 91 | - Frank Schulz 92 | 93 | ## 2.10.0 94 | 95 | ### UI v1.11.0 > v1.12.0 96 | 97 | - Add option to select different SRT stream in wizard 98 | - Add option to select different RTMP stream in wizard 99 | - Fix selecting other than first audio stream ([#710](https://github.com/datarhei/restreamer/issues/710)) 100 | - Fix reset of previous audio settings when editing profile ([#730](https://github.com/datarhei/restreamer/issues/730)) 101 | - Fix RTMP URL for receive mode 102 | 103 | ### 🧡💚💜 Thank you to all Patrons and donors 104 | 105 | - Jacob Fritsche 106 | - Martin H. 107 | - Paulo Gonçalves 108 | - Philipp Burkart 109 | - Mark Stephens 110 | - Fabian Stoll 111 | - Perry Johnson 112 | - Alex O'Carroll 113 | - Fiberian 114 | - Ivan Hašek 115 | - krischan941 116 | - Doug Roberts 117 | - Bassim Charafeddine 118 | - josue osorto 119 | - Raketenbaum 120 | - Byron Garcia 121 | - Jeff Moe 122 | - Ramakrishna Chillara 123 | - Eduardo Sarabia 124 | - Giovanni Russo 125 | - Gioele Cerati 126 | - Blueman2 (Robert G. Pearse) 127 | - Alex Fuhr 128 | - Frank Schulz 129 | 130 | ## 2.9.0 131 | 132 | ### UI v1.10.0 > v1.11.0 133 | 134 | - Add allow to stream HEVC and AV1 to Youtube via RTMP 135 | - Add librav1e AV1 encoder 136 | - Add support for AV1 CUDA decoding ([PR 46](https://github.com/datarhei/restreamer-ui/pull/46)) 137 | - Add FFmpeg 6 support 138 | - Add HEVC VideoToolbox encoder 139 | - Fix anonymize error message ([#688](https://github.com/datarhei/restreamer/issues/688)) 140 | - Fix chromecast config ([#37](https://github.com/datarhei/restreamer-ui/issues/37)) 141 | 142 | ### Core v16.14.0 > v16.15.0 143 | 144 | - Add migrating to ffmpeg 6 145 | - Fix missing process data if process has been deleted meanwhile 146 | - Fix maintaining the metadata on process config update (datarhei/restreamer#698) 147 | - Fix placeholder parsing 148 | - Fix concurrent memfs accesses 149 | - Fix memfs concurrent read and write performance 150 | 151 | ### 🧡💚💜 Thank you to all Patrons and donors 152 | 153 | - Jacob Fritsche 154 | - Martin H. 155 | - Paulo Gonçalves 156 | - Philipp Burkart 157 | - Mark Stephens 158 | - Fabian Stoll 159 | - Perry Johnson 160 | - Alex O'Carroll 161 | - Fiberian 162 | - Ivan Hašek 163 | - krischan941 164 | - Doug Roberts 165 | - Bassim Charafeddine 166 | - josue osorto 167 | - Raketenbaum 168 | - Byron Garcia 169 | - Jeff Moe 170 | - Ramakrishna Chillara 171 | - Eduardo Sarabia 172 | - Giovanni Russo 173 | - Gioele Cerati 174 | - Blueman2 (Robert G. Pearse) 175 | - Alex Fuhr 176 | - Frank Schulz 177 | 178 | ## 2.8.0 179 | 180 | ### UI v1.9.0 > v1.10.0 181 | 182 | - Add resource usage and ffmpeg command to process details 183 | - Add audio loop source 184 | - Add to allow to select from already publishing RTMP and SRT streams 185 | - Fix wrongly displayed SRT URL ([#635](https://github.com/datarhei/restreamer/issues/635)) 186 | - Fix RTMPS address with custom ports ([#658](https://github.com/datarhei/restreamer/issues/658)) 187 | - Fix allow RTSPS protocol ([#677](https://github.com/datarhei/restreamer/issues/677)) 188 | 189 | ### Core v16.13.1 > v16.14.0 190 | 191 | - Add support for SRTv4 clients 192 | - Add support for Enhanced RTMP in internal RTMP server 193 | - Fix require positive persist interval (session) 194 | - Fix race condition (process) 195 | - Update dependencies 196 | 197 | ### 🧡💚💜 Thank you to all Patrons and donors 198 | 199 | - Jacob Fritsche 200 | - Martin H. 201 | - Paulo Gonçalves 202 | - Philipp Burkart 203 | - Mark Stephens 204 | - Fabian Stoll 205 | - Perry Johnson 206 | - Alex O'Carroll 207 | - Fiberian 208 | - Ivan Hašek 209 | - krischan941 210 | - Doug Roberts 211 | - Bassim Charafeddine 212 | - josue osorto 213 | - Raketenbaum 214 | - Byron Garcia 215 | - Jeff Moe 216 | - Ramakrishna Chillara 217 | - Eduardo Sarabia 218 | - Giovanni Russo 219 | - Gioele Cerati 220 | - Blueman2 (Robert G. Pearse) 221 | - Alex Fuhr 222 | - Frank Schulz 223 | 224 | ## 2.7.0 225 | 226 | ### UI v1.8.0 > v1.9.0 227 | 228 | - Add enlarged channel overview 229 | - Add new publication services: Dailymotion, Livepush, kick.com, NimoTV, PicartoTV, Rumble 230 | - Add frame interpolation (framerate) filter (thanks to orryverducci) 231 | - Add -referer option for pulling HTTP streams ([PR 40](https://github.com/datarhei/restreamer-ui/pull/40), thanks to mdastgheib) 232 | - Add a/v filter to the publication components ([#593](https://github.com/datarhei/restreamer-ui/issues/593)) 233 | - Add video or image loop as input ([#528](https://github.com/datarhei/restreamer/discussions/528)) 234 | - Add option for custom poster image in player ([#632](https://github.com/datarhei/restreamer/issues/632)) 235 | - Add option to allow to set limits for ingest and egress processes ([#636](https://github.com/datarhei/restreamer/issues/636)) 236 | - Mod extends twitch's server list 237 | - Mod uses placeholders for ingress setups ([#560](https://github.com/datarhei/restreamer-ui/issues/560)) 238 | - Mod updates npm 239 | - Fix Owncast typo 240 | - Fix Restream grid 241 | - Fix the advanced settings in the MPEG-TS publication service ([#597](https://github.com/datarhei/restreamer/issues/597), thanks to orryverducci) 242 | - Fix ALSA demuxer option names 243 | - Fix index out-of-range warning, list ALSA devices for Raspicam video source 244 | - Fix MUI warning 245 | - Fix videojs skin 246 | 247 | ### Core v16.13.0 > v16.13.1 248 | 249 | - Fix transfer of reports to updated process 250 | - Fix calling Wait after process has been read 251 | - Fix 509 return code if non-existing stream is requested 252 | - Fix default search paths for config file 253 | - Fix sized filesystem 254 | - Update dependencies 255 | 256 | ### Thank you to all Patrons and donors 257 | 258 | - Jacob Fritsche 259 | - Martin H. 260 | - Paulo Gonçalves 261 | - Philipp Burkart 262 | - Mark Stephens 263 | - Fabian Stoll 264 | - Perry Johnson 265 | - Alex O'Carroll 266 | - Fiberian 267 | - Ivan Hašek 268 | - krischan941 269 | - Doug Roberts 270 | - Bassim Charafeddine 271 | - josue osorto 272 | - Raketenbaum 273 | - Byron Garcia 274 | - Jeff Moe 275 | - Ramakrishna Chillara 276 | - Eduardo Sarabia 277 | - Giovanni Russo 278 | - Gioele Cerati 279 | - Blueman2 (Robert G. Pearse) 280 | - Alex Fuhr 281 | - Frank Schulz 282 | 283 | ## 2.6.0 284 | 285 | ## v1.7.0 > v1.8.0 286 | 287 | - Add Ukrainian translation (thanks to Yurii Denys) 288 | - Add Add stream key field and protocol detection to RTMP publication service 289 | - Add Chinese (simplified) translation (thanks to Huyg0180110559) 290 | - Fix empty force_key_frames value 291 | - Fix Icecast publication service 292 | - Fix imprint, terms and credit without share ([#525](https://github.com/datarhei/restreamer/issues/529)) 293 | - Fix proxy error on the playersite ([#525](https://github.com/datarhei/restreamer/issues/525)) 294 | - Fix saving RTMP advanced options ([#518](https://github.com/datarhei/restreamer/issues/518)) 295 | - Fix help buttons for other languages than English and German ([#24](https://github.com/datarhei/restreamer-ui/issues/24)) 296 | - Fix internal player skin (volume bar) 297 | - Fix security hints (npm dep.) 298 | 299 | ### Core v16.12.0 > v16.13.0 300 | 301 | - Add updated_at field in process infos 302 | - Add preserve process log history when updating a process 303 | - Add support for input framerate data from jsonstats patch 304 | - Add number of keyframes and extradata size to process progress data 305 | - Mod bumps FFmpeg to v5.1.3 (datarhei/core:tag bundles) 306 | - Fix better naming for storage endpoint documentation 307 | - Fix freeing up S3 mounts 308 | - Fix URL validation if the path contains FFmpeg specific placeholders 309 | - Fix purging default file from HTTP cache 310 | - Fix parsing S3 storage definition from environment variable 311 | - Fix checking length of CPU time array ([#10](https://github.com/datarhei/core/issues/10)) 312 | - Fix possible infinite loop with HLS session rewriter 313 | - Fix not propagating process limits 314 | - Fix URL validation if the path contains FFmpeg specific placeholders 315 | - Fix RTMP DoS attack (thx Johannes Frank) 316 | - Deprecate ENV names that do not correspond to JSON name 317 | 318 | ### FFmpeg v5.1.2 > v5.1.3 319 | 320 | - Add alsa support by default 321 | - Add min, max, avg of incoming framerates for each input and output (jsonstats patch) 322 | - Add keyframe count for each input and output (jsonstats patch) 323 | - Add size in bytes for each input and output (jsonstats patch) 324 | - Mod bumps FFmpeg to v5.1.3 325 | 326 | ### Thank you to all Patrons and donors 327 | 328 | - Martin H. 329 | - Paulo Gonçalves 330 | - Philipp Burkart 331 | - Mark Stephens 332 | - Fabian Stoll 333 | - Perry Johnson 334 | - Alex O'Carroll 335 | - Fiberian 336 | - Ivan Hašek 337 | - krischan941 338 | - Doug Roberts 339 | - Bassim Charafeddine 340 | - josue osorto 341 | - Raketenbaum 342 | - Byron Garcia 343 | - Jeff Moe 344 | - Ramakrishna Chillara 345 | - Eduardo Sarabia 346 | - Giovanni Russo 347 | - Gioele Cerati 348 | - Blueman2 (Robert G. Pearse) 349 | - Alex Fuhr 350 | - Frank Schulz 351 | 352 | ## 2.5.0 353 | 354 | ## Restreamer UI v1.6.0 > v1.7.0 355 | 356 | - Add analyzeduration, probesize and max_probe_packets input options 357 | - Add avoid_negative_ts input option 358 | - Add http_proxy input option ([#513](https://github.com/datarhei/restreamer/issues/513)) 359 | - Add copyts, start_at_zero and use_wallclock_as_timestamps input options 360 | - Add heuristic to find core address if UI is proxied 361 | - Add Turkish translation (thanks to Ramazan Sancar) ([#22](https://github.com/datarhei/restreamer-ui/issues/22)) 362 | - Add Danish translation (Thanks to Filip Stadler and Info) 363 | - Add Slovenian translation (thanks to Grega) 364 | - Add Greek translation 365 | - Mod allows general input settings for pull and push streams 366 | - Mod updates npm dependencies 367 | - Fix Creative Commons icons 368 | - Fix positioning of the deinterlacing filter ([#465](https://github.com/datarhei/restreamer/issues/465)) 369 | 370 | ### Core v16.11.0 > v16.12.0 371 | 372 | - Add S3 storage support 373 | - Add support for variables in placeholde parameter 374 | - Add support for RTMP token as stream key as last element in path 375 | - Add support for soft memory limit with debug.memory_limit_mbytes in config 376 | - Add support for partial process config updates 377 | - Add support for alternative syntax for auth0 tenants as environment variable 378 | - Fix config timestamps created_at and loaded_at 379 | - Fix /config/reload return type 380 | - Fix modifying DTS in RTMP packets ([#487](https://github.com/datarhei/restreamer/issues/487), [#367](https://github.com/datarhei/restreamer/issues/367)) 381 | - Fix default internal SRT latency to 20ms 382 | 383 | ## 2.4.2 384 | 385 | ### Restreamer UI v1.5.1 > v1.6.0 386 | 387 | - Add Bob Weaver Deinterlacing Filter ([#465](https://github.com/datarhei/restreamer/issues/465)) 388 | - Add tests for wizard, network source, and coders 389 | - Add Korean translation (thanks to Jihaeng) 390 | - Mod splitting wizard in components 391 | - Fix wrong call to encoder defaults ([#467](https://github.com/datarhei/restreamer/issues/467)) 392 | 393 | ## 2.4.1 394 | 395 | ### Restreamer UI v1.5.0 > v1.5.1 396 | 397 | - Fix FFmpeg version check for RTSP sources ([#455](https://github.com/datarhei/restreamer/issues/455)) 398 | - Fix requires Core >= v16.11.0 and FFmpeg >= 5.1.0 399 | 400 | ## 2.4.0 401 | 402 | ### Attention 403 | 404 | Restreamer v2.4.0 includes an update to FFmpeg v5.1.2. 405 | All necessary process adjustments are activated at the first start of the Restreamer. 406 | 407 | If you want to switch back to the old version follow these steps: 408 | [https://docs.datarhei.com/restreamer/installing/migration](https://docs.datarhei.com/restreamer/installing/migration) 409 | 410 | _Hint: The backup restores only the previous processes._ 411 | 412 | ### Restreamer UI v1.4.0 > v1.5.0 413 | 414 | - Add changelog viewer 415 | - Add skills props to encoder and decoder components 416 | - Add fps_mode to x264, x265, vp9 encoder 417 | - Add scale filter to non-hwaccel encoders 418 | - Add PeerTube and Media Network to publication services (plattforms, software) 419 | - Add reset button to hide a player logo ([#431](https://github.com/datarhei/restreamer/issues/431)) 420 | - Mod expands V4L2_M2M options (an unstable RPI 64bit encoder) 421 | - Mod indicates a faulty cache configuration 422 | - Mod switches to the improved SRT syntax (thx to SA Consulting) 423 | - Mod improves display of progress data 424 | - Mod removes deprecated param ocl - now ochl (ff5) 425 | - Mod simplifies the setup of Restreamer-to-Restreamer connections 426 | - Mod adds Istafeed.me as StreamKey service to Instagram's publishing service 427 | - Mod renames "Low delay" to "Low latency (buffer)" and set false as default (requires more feedback) 428 | - Del removes support for clappr player 429 | - Fix npm dependencies (security fixes) 430 | - Fix videojs-overlay logo size ([#431](https://github.com/datarhei/restreamer/issues/431)) 431 | - Fix use of TLS for input from local RTMP server 432 | - Fix Icecast publication service settings ([#429](https://github.com/datarhei/restreamer/issues/429)) 433 | - Fix removes SRT bitstream on tee (OBS > RTMP > SRT is faulty) 434 | 435 | ### Core v16.10.1 > v16.11.0 436 | 437 | - Add FFmpeg v4.4 to FFmpeg v5.1 migration tool 438 | - Add alternative SRT streamid 439 | - Mod bump FFmpeg to v5.1.2 (datarhei/core:tag bundles) 440 | - Fix crash with custom SSL certificates ([restreamer/#425](https://github.com/datarhei/restreamer/issues/425)) 441 | - Fix proper version handling for config 442 | - Fix widged session data 443 | - Fix resetting process stats when process stopped 444 | - Fix stale FFmpeg process detection for streams with only audio 445 | - Fix wrong return status code ([#6](https://github.com/datarhei/core/issues/6))) 446 | - Fix use SRT defaults for key material exchange 447 | 448 | ### FFmpeg v4.4.2 > v5.1.2 449 | 450 | - Mod FFmpeg v4.4.2 > v5.1.2 (+ patches) 451 | - Mod Nvidia CUDA v11.4.2 > v11.7.1 452 | - Mod Intel Media Driver v20.1.1 453 | 454 | _We recommend OpenMAX IL for Raspberry PI (3/4) with a 32-bit operating system._ 455 | 456 | ### Documentation 457 | 458 | - Add [v2.4+ to v2.3.x (downgrade) migration guide](https://docs.datarhei.com/restreamer/installing/migration) 459 | - Add [Windows install guides (Docker Desktop, Terminal)](https://docs.datarhei.com/restreamer/installing/windows) 460 | - Add [OSX installation guide (Docker Desktop, Terminal)](https://docs.datarhei.com/restreamer/installing/mac) 461 | - Mod small adjustments 462 | 463 | ## 2.3.0 464 | 465 | - Mod exposes ports (Docker desktop) 466 | 467 | ### Restreamer UI v1.2.0 > v1.4.0 468 | 469 | - Add email field for Let's Encrypt certification 470 | - Add low_delay option to processing (default: true) 471 | - Mod uses the ingest stream for publication ([#411](https://github.com/datarhei/restreamer/issues/411)) 472 | - Add dlive & Trovo publication services 473 | - Mod optimized DVR on DiskFS 474 | - Mod updates packages 475 | - Fix SRT bitstream on tee 476 | - Fix typo 477 | - Fix viewer count (datarhei/restreamer#394) 478 | - Fix user registration if username and/or password are set via environment ([#13](https://github.com/datarhei/restreamer-ui/issues/13)) 479 | - Fix Dockerfile, Reduce size, serve production build (datarhei/restreamer-ui#12) 480 | 481 | ### Core v16.9.1 > v16.10.1 482 | 483 | - Add email address in TLS config for Let's Encrypt 484 | - Add HLS session middleware to diskfs 485 | - Add /v3/metrics (get) endpoint to list all known metrics 486 | - Add logging HTTP request and response body sizes 487 | - Add process id and reference glob pattern matching 488 | - Add cache block list for extensions not to cache 489 | - Mod exclude .m3u8 and .mpd files from disk cache by default 490 | - Mod replaces x/crypto/acme/autocert with caddyserver/certmagic 491 | - Mod exposes ports (Docker desktop) 492 | - Fix use of Let's Encrypt production CA 493 | - Fix assigning cleanup rules for diskfs 494 | - Fix wrong path for swagger definition 495 | - Fix process cleanup on delete, remove empty directories from disk 496 | - Fix SRT blocking port on restart (upgrade datarhei/gosrt) 497 | - Fix RTMP communication (Blackmagic Web Presenter, thx 235 MEDIA) 498 | - Fix RTMP communication (Blackmagic ATEM Mini, datarhei/restreamer#385) 499 | - Fix injecting commit, branch, and build info 500 | - Fix API metadata endpoints responses 501 | 502 | ## 2.2.0 503 | 504 | ### Restreamer UI v1.1.0 > v1.2.0 505 | 506 | - Add allow writing HLS to disk 507 | - Add audio pan filter 508 | - Add video rotation filter ([#347](https://github.com/datarhei/restreamer/discussions/347)) 509 | - Add video h/v flip filter 510 | - Add audio volume filter ([#313](https://github.com/datarhei/restreamer/issues/313)) 511 | - Add audio loudness normalization filter 512 | - Add audio resample filter, that was before part of the encoders 513 | - Add HLS Master playlist (requires FFmpeg hlsbitrate.patch) (thx Dwaynarang, Electra Player compatibility) 514 | - Add linkedIn & Azure Media Services to publication services (thx kalashnikov) 515 | - Add AirPlay support with silvermine videojs plugin 516 | - Add Chromecast support (thx badincite, [#10](https://github.com/datarhei/restreamer-ui/pull/10)) 517 | - Add stream distribution across multiple internal servers 518 | - Add SRT settings 519 | - Add HLS version selection (thx Dwaynarang, Electra Player compatibility) 520 | - Add Owncast to publication services ([#369](https://github.com/datarhei/restreamer/issues/369)) 521 | - Add Telegram to publication services (thx Martin Held) 522 | - Add Polish translations (thx Robert Rykała) 523 | - Mod extends the datarhei Core publication service with srt streaming 524 | - Mod allow decoders and encoders to set global options 525 | - Mod allow trailing slash on Core address 526 | - Fix player problem with different stream formats (9:16) 527 | - Fix process report naming 528 | - Fix publication service icon styles 529 | - Fix VAAPI encoder 530 | 531 | ### Core v16.9.0 > v16.9.1 532 | 533 | - Fix v1 import app 534 | - Fix race condition 535 | 536 | ### Core v16.8.0 > v16.9.0 537 | 538 | - Add new placeholders and parameters for placeholder 539 | - Add optional escape character to process placeholder 540 | - Add experimental SRT connection stats and logs API 541 | - Add experimental SRT server (datarhei/gosrt) 542 | - Add trailing slash for routed directories ([#340](https://github.com/datarhei/restreamer/issues/340)) 543 | - Mod allow RTMP server if RTMPS server is enabled 544 | - Mod create v16 in go.mod 545 | - Mod allow relative URLs in content in static routes 546 | - Fix output address validation for tee outputs 547 | - Fix updating process config 548 | - Fix hide /config/reload endpoint in reade-only mode 549 | - Fix data races, tests, lint, and update dependencies 550 | 551 | ## 2.1.0 552 | 553 | - Fix Dockerfile (bundles frontend, backend and FFmpeg) 554 | 555 | ### Restreamer UI v1.0.0 > v1.1.0 556 | 557 | - Add "HLS cleanup" as an optional function ([Philipp Trenz](https://github.com/philipptrenz)) 558 | - Add /ui info to / ([#326](https://github.com/datarhei/restreamer/issues/326)) 559 | - Add Russian translation (thx Inthegamelp) 560 | - Add missed VAAPI encoder 561 | - Add missed V4L2_M2M encoder 562 | - Add missed Raspberry Pi 64bit Docker image 563 | - Mod updates VideoJS 564 | - Add option to disable playersites share-button (thx Anders Mellgren) 565 | - Fix hides unset content license on playersite (thx Anders Mellgren) 566 | - Fix updates V4L2 device-list on select 567 | - Fix snapshot interval ([#341](https://github.com/datarhei/restreamer/issues/340)) 568 | - Fix reverse proxy issue ([#340](https://github.com/datarhei/restreamer/issues/340)) 569 | - Fix double escape failer ([#336](https://github.com/datarhei/restreamer/issues/336)) 570 | - Fix type in player plugin ([#336](https://github.com/datarhei/restreamer/issues/336)) 571 | - Fix deletes processes with dependencies (thx Patron Ramakrishna Chillara) 572 | - Fix datarhei Core publication service 573 | - Fix dependabot alerts 574 | - Fix code scanning alerts 575 | - Merge security pr 576 | 577 | Preparation for FFmpeg v5.0 (migration will not work) 578 | 579 | - Add FFmpeg v5.0 commands (preparation) 580 | - Mod allows FFmpeg v5.0 (preparation) 581 | 582 | ### Core v16.7.2 > v16.8.0 583 | 584 | - Add purge_on_delete function 585 | - Mod updated dependencies 586 | - Mod updated API docs 587 | - Fix disabled session logging 588 | - Fix FFmpeg skills reload 589 | - Fix ignores processes with invalid references (thx Patron Ramakrishna Chillara) 590 | - Fix code scanning alerts 591 | 592 | ### FFmpeg v4.2.2 > v4.2.2-1 593 | 594 | - Mod enables libv4l2 + v4l2_m2m for all Docker images ([#339](https://github.com/datarhei/restreamer/issues/339)) 595 | - Mod updates packages (freetype, libxml2, VAAPI-Libs (gmmlib, media-driver, media-sdk)) 596 | - Fix cuda Docker image ([#328](https://github.com/datarhei/restreamer/issues/328)) 597 | - Fix VAAPI Docker image 598 | 599 | ### FFmpeg v5.0.1 600 | 601 | - Add FFmpeg v5.0 JSONSTATS patch (preparation) 602 | 603 | ### Documentation 604 | 605 | - Add [Basic troubleshooting guide](https://docs.datarhei.com/restreamer/knowledge-base/troubleshooting/basic-troubleshooting) 606 | - Add [custom playersite guide](https://docs.datarhei.com/restreamer/knowledge-base/user-guides/how-to-integrate-a-website) ([#337](https://github.com/datarhei/restreamer/issues/337)) 607 | - Add [guide for custom RTMP port](https://docs.datarhei.com/restreamer/knowledge-base/user-guides/how-to-change-the-rtmp-port) 608 | - Add [encoding compatiblity list](https://docs.datarhei.com/restreamer/knowledge-base/troubleshooting/encoding-compatibility-list)) 609 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | Contributor Code of Conduct 2 | =========================== 3 | 4 | As contributors and maintainers of this project, we pledge to respect all 5 | people who contribute through reporting issues, posting feature requests, 6 | updating documentation, submitting pull requests or patches, and other 7 | activities. 8 | 9 | Examples of unacceptable behavior by participants include: 10 | - Sexual language or imagery. 11 | - Derogatory comments or personal attacks. 12 | - Trolling, public or private harassment. 13 | - Insults. 14 | - Other unprofessional conduct. 15 | 16 | Examples of unacceptable behavior by participants include sexual 17 | language or imagery, derogatory comments or personal attacks, trolling, public 18 | or private harassment, insults, or other unprofessional conduct. 19 | 20 | Project maintainers have the right and responsibility to remove, edit, or reject 21 | comments, commits, code, wiki edits, issues, and other contributions that are not 22 | aligned with this Code of Conduct. In addition, project maintainers who do not 23 | follow the Code of Conduct may be removed from the project team. 24 | 25 | This code of conduct applies both within a project and in public spaces when an 26 | individual represents the project or its community. 27 | 28 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 29 | reported by opening an issue or contacting one or more of the project maintainers. 30 | 31 | This Code of Conduct is adapted from the [Contributor 32 | Covenant](https://contributor-covenant.org/), version 1.1.0, available at 33 | [https://contributor-covenant.org/version/1/1/0/](https://contributor-covenant.org/version/1/1/0/) 34 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute 2 | 3 | Before you start developing, please start a discussion or open an issue. In principle, 4 | pull requests are very welcome. However, contributing to the `datarhei Restreamer` is 5 | currently sometimes tricky. We know this and are working on official guidelines to understand the code structures better. 6 | 7 | If you have any questions, you can also send us an email at support@datarhei.com. 8 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG RESTREAMER_UI_IMAGE=datarhei/restreamer-ui:latest 2 | ARG CORE_IMAGE=datarhei/base:alpine-core-latest 3 | ARG FFMPEG_IMAGE=datarhei/base:alpine-ffmpeg-latest 4 | 5 | FROM $RESTREAMER_UI_IMAGE AS restreamer-ui 6 | FROM $CORE_IMAGE AS core 7 | FROM $FFMPEG_IMAGE 8 | 9 | COPY --from=core /core /core 10 | COPY --from=restreamer-ui /ui/build /core/ui 11 | 12 | ADD https://raw.githubusercontent.com/datarhei/restreamer/2.x/CHANGELOG.md /core/ui/CHANGELOG.md 13 | COPY ./run.sh /core/bin/run.sh 14 | COPY ./ui-root /core/ui-root 15 | 16 | RUN ffmpeg -buildconf 17 | 18 | ENV CORE_CONFIGFILE=/core/config/config.json 19 | ENV CORE_DB_DIR=/core/config 20 | ENV CORE_ROUTER_UI_PATH=/core/ui 21 | ENV CORE_STORAGE_DISK_DIR=/core/data 22 | 23 | EXPOSE 8080/tcp 24 | EXPOSE 8181/tcp 25 | EXPOSE 1935/tcp 26 | EXPOSE 1936/tcp 27 | EXPOSE 6000/udp 28 | 29 | VOLUME ["/core/data", "/core/config"] 30 | ENTRYPOINT ["/core/bin/run.sh"] 31 | WORKDIR /core 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2022 FOSS GmbH 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Restreamer

2 |

A really nice and free alternative for handling live streams.

3 |

4 | License 5 | License 6 | Docker pulls 7 | Documentation 8 |

9 |

Try live demo
10 | demo username 11 | demo password 12 | 13 |

14 | 15 | Restreamer Promo Video 16 | 17 |

18 | 19 |

Self-hosting solution to stream live to your website and publish to many like YouTube-Live, Twitter, Twitch, Vimeo, and other platforms or services. Our Docker-Image is easy to install and runs on Linux environments (MacOS/Windows by Docker Desktop). Moreover, combine the Restreamer with single-board computers like Raspberry Pi or GPU powered systems for Video-Encoding.

20 |
21 |
22 | 23 | ## Features 24 | 25 | - Simplified User-Interface 26 | - Easy wizard configuration 27 | - Multiple audio/video inputs, outputs, protocols, and codecs 28 | - ReStreaming to platforms such as YouTube-Live, to software such as Wowza Media Server, and others based on protocols such as RTMP, SRT, ... 29 | - Option to mux a separate audio channel to the video 30 | - Build-in VideoJS-Player for your Website 31 | - Configurable publication website for streaming without player embedding 32 | - Content license with Creative Commons 33 | - HTTP/S- (HLS), RTMP/S- & SRT-Streaming Server 34 | - Automatic Let's Encrypt HTTPS certification 35 | - Viewer/Bandwidth Monitoring and limiting 36 | - Raspberry Pi (MMAL/OMX), Nvidia Cuda, Intel VAAPI support 37 | - Support for Hardware- and Virtual-Devices 38 | - FFmpeg Video-Processing (as native as possible) 39 | - REST-API (JSON) and 100% Swagger documented 40 | - Resource Monitoring (optionally by Prom-Metrics) 41 | - Server- and Process-Logging 42 | - GDPR compliant without third-party providers and does not save audience data 43 | 44 | ## Quick setup 45 | 46 | ### AMD64/ARMv7/ARM64: 47 | ```sh 48 | docker run -d --restart=always --name restreamer \ 49 | -v /opt/restreamer/config:/core/config -v /opt/restreamer/data:/core/data \ 50 | -p 8080:8080 -p 8181:8181 \ 51 | -p 1935:1935 -p 1936:1936 \ 52 | -p 6000:6000/udp \ 53 | datarhei/restreamer:latest 54 | ``` 55 | 56 | *`--privileged` just for local devices like usb cameras.* 57 | *Try `--security-opt seccomp=unconfined` if no network source can be reached.* 58 | 59 | ### ARMv7/ARM64 Raspberry Pi: 60 | ```sh 61 | docker run -d --restart=always --name restreamer \ 62 | -v /opt/restreamer/config:/core/config -v /opt/restreamer/data:/core/data \ 63 | --privileged \ 64 | -p 8080:8080 -p 8181:8181 \ 65 | -p 1935:1935 -p 1936:1936 \ 66 | -p 6000:6000/udp \ 67 | datarhei/restreamer:rpi-latest 68 | ``` 69 | 70 | *`--privileged` just for local devices like usb cameras.* 71 | *Try `--security-opt seccomp=unconfined` if no network source can be reached.* 72 | 73 | ### AMD64 Nvidia Cuda: 74 | ```sh 75 | docker run -d --restart=always --name restreamer \ 76 | -v /opt/restreamer/config:/core/config -v /opt/restreamer/data:/core/data \ 77 | --runtime=nvidia --privileged \ 78 | -p 8080:8080 -p 8181:8181 \ 79 | -p 1935:1935 -p 1936:1936 \ 80 | -p 6000:6000/udp \ 81 | datarhei/restreamer:cuda-latest 82 | ``` 83 | 84 | *`--privileged` just for local devices like usb cameras.* 85 | *Try `--security-opt seccomp=unconfined` if no network source can be reached.* 86 | 87 | ### AMD64 Intel VAAPI: 88 | ```sh 89 | docker run -d --restart=always --name restreamer \ 90 | -v /opt/restreamer/config:/core/config -v /opt/restreamer/data:/core/data \ 91 | -v /dev/dri:/dev/dri --privileged \ 92 | -p 8080:8080 -p 8181:8181 \ 93 | -p 1935:1935 -p 1936:1936 \ 94 | -p 6000:6000/udp \ 95 | datarhei/restreamer:vaapi-latest 96 | ``` 97 | 98 | *`--privileged` just for local devices like usb cameras.* 99 | *Try `--security-opt seccomp=unconfined` if no network source can be reached.* 100 | 101 | *For external access (http/s, rtmp/s, srt), port forwarding from your Internet-Router to the Restreamer's internal IP address may need to be set up.* 102 | 103 | ## Documentation 104 | 105 | Documentation is available on [docs.datarhei.com/restreamer](https://docs.datarhei.com/restreamer). We give many pieces of information, from setting up a camera, embedding your player upon your website, and streaming to services like, e.g., YouTube-Live, and many more. 106 | 107 | - [Quick start](https://docs.datarhei.com/restreamer/getting-started/quick-start) 108 | - [Installation](https://docs.datarhei.com/restreamer/installing/minimum-requirements) 109 | - [Manual](https://docs.datarhei.com/restreamer/knowledge-base/manual) 110 | - [Guides](https://docs.datarhei.com/restreamer/knowledge-base/user-guides) 111 | 112 | ## Development 113 | 114 | ### Create a custom image (bundle): 115 | 116 | #### [Restreamer FFmpeg](https://github.com/datarhei/ffmpeg): 117 | ``` 118 | $ git clone github.com/datarhei/ffmpeg 119 | $ cd ffmpeg 120 | $ docker build -f Dockerfile.alpine -t myffmpeg . 121 | ``` 122 | 123 | #### [Restreamer backend](https://github.com/datarhei/core) (Golang): 124 | 125 | ``` 126 | $ git clone github.com/datarhei/core 127 | $ cd core 128 | $ docker build -t mycore . 129 | ``` 130 | 131 | #### [Restreamer interface](https://github.com/datarhei/restreamer-ui) (React): 132 | ``` 133 | $ git clone github.com/datarhei/restreamer-ui 134 | $ cd restreamer-ui 135 | $ docker build -t myrsui . 136 | ``` 137 | 138 | #### Restreamer bundle: 139 | ``` 140 | $ git clone github.com/datarhei/restreamer 141 | $ cd restreamer 142 | $ docker build --build-arg FFMPEG_IMAGE=myffmpeg --build-arg CORE_IMAGE=mycore --build-arg RESTREAMER_UI_IMAGE=myrsui -t myrestreamer . 143 | $ docker run -it --rm -p 8080:8080 myrestreamer 144 | ``` 145 | 146 | ### To add/fix translations in the [Restreamer interface](https://github.com/datarhei/restreamer-ui): 147 | 148 | The Restreamer interface is currently translated in different languages, such as German, French, Italian, Spanish, and more. If you find errors in the translations or have better suggestions for some sentences, you can become a translation contributor on [poeditor.com](https://poeditor.com/join/project/ogATl3F48K). 149 | There you can also start a translation into a language that is not yet available in the Restreamer interface. 150 | 151 | Contribute to the translations on: [https://poeditor.com/join/project/ogATl3F48K](https://poeditor.com/join/project/ogATl3F48K) 152 | 153 | ## Community support 154 | 155 | For general help using Restreamer, please refer to the official [documentation](https://docs.datarhei.com/restreamer). For additional support, you can use Github to ask a question (Bug reports, Contributions, Features). 156 | 157 | ## License 158 | See the [LICENSE](./LICENSE) file for licensing information. 159 | 160 | ## Business inquiries 161 | **We provide support for commercial requirements with professional support, agile software development, and consulting.** If you have a commercial request, be it a bug or a feature enhancement, please contact us directly at support@datarhei.com. 162 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | All versions in the list receive security updates. 6 | 7 | | Version | Supported | 8 | | ------- | ------------------ | 9 | | 2.0.0 | :white_check_mark: | 10 | | < 2.0 | :x: | 11 | 12 | ## Reporting a Vulnerability 13 | 14 | If you have found or just suspect a security problem somewhere in Restreamer or Core, report it on support@datarhei.com. 15 | 16 | We treat security issues with confidentiality until controlled and disclosed responsibly. 17 | -------------------------------------------------------------------------------- /_BUNDLE_OF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datarhei/restreamer/056921f120b24bf3904c1c7fac800e2515e4abde/_BUNDLE_OF -------------------------------------------------------------------------------- /_RESTREAMER-UI+CORE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datarhei/restreamer/056921f120b24bf3904c1c7fac800e2515e4abde/_RESTREAMER-UI+CORE -------------------------------------------------------------------------------- /readme-promo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datarhei/restreamer/056921f120b24bf3904c1c7fac800e2515e4abde/readme-promo.gif -------------------------------------------------------------------------------- /readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datarhei/restreamer/056921f120b24bf3904c1c7fac800e2515e4abde/readme.png -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Start script for the Restreamer bundle 4 | 5 | # First run the import program. It will read the db.dir from the config file in order to 6 | # find an old v1.json. This will be converted to the new db format. 7 | 8 | if [ -x ./bin/import ]; then 9 | ./bin/import 10 | if [ $? -ne 0 ]; then 11 | exit 1 12 | fi 13 | fi 14 | 15 | # Run the FFmpeg migration program. In case a FFmpeg 5 binary is present, it will create a 16 | # backup of the current DB and modify the FFmpeg parameter such that they are compatible 17 | # with FFmpeg 5. 18 | 19 | if [ -x ./bin/ffmigrate ]; then 20 | ./bin/ffmigrate 21 | if [ $? -ne 0 ]; then 22 | exit 1 23 | fi 24 | fi 25 | 26 | # Create a hint for the admin interface if there is no index.html 27 | 28 | if ! [ -f "${CORE_STORAGE_DISK_DIR}/index.html" ]; then 29 | cp /core/ui-root/index.html /core/ui-root/index_icon.svg ${CORE_STORAGE_DISK_DIR} 30 | fi 31 | 32 | # Now run the core with the possibly converted configuration. 33 | 34 | exec ./bin/core 35 | -------------------------------------------------------------------------------- /ui-root/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Restreamer 11 | 51 | 52 | 53 |
54 |
55 | datarhei Restreamer logo 56 |

57 | An easy to use video server and framework for video streaming. 58 |

59 |

60 |


61 | Did you mean to go to the admin panel? 62 |

63 |
64 |
65 | 66 | 67 | -------------------------------------------------------------------------------- /ui-root/index_icon.svg: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------