Release history
MediaMTX releases
Ready-to-use, zero-dependency real-time media server and proxy to publish, read, record, playback and route video/audio streams over SRT, WebRTC, RTSP, RTMP, HLS, MPEG-TS, RTP.
All releases
10 shown
- MTX_QUERY now URL‑encoded preventing code injection (GHSA issue #5707)
- Support for reading and writing KLV in HLS streams
- hlsCDNSecret configuration to simplify CDN‑backed HLS serving
Full changelog
Fixes and improvements
General
- prevent code injection in case of MTX_QUERY in hooks (https://github.com/bluenviron/mediamtx/issues/5707) When MTX_QUERY is used explicitly in hooks, for instance "curl http://something/?$MTX_QUERY", it can be used to inject arbitrary commands. MTX_QUERY is now url-encoded to prevent any abuse regardless of the configuration.
- use temporary redirects instead of permanent redirects (https://github.com/bluenviron/mediamtx/issues/5710) this prevents unwanted caching.
HLS
- prevent open redirect attacks (https://github.com/bluenviron/mediamtx/issues/5708)
- support reading and writing KLV (https://github.com/bluenviron/mediamtx/issues/5604)
- add hlsCDNSecret (https://github.com/bluenviron/mediamtx/issues/5716) this allows to serve HLS streams behind a CDN in a simplified way, compatible with the new HLS session system.
- add public attribute to cache-control header (https://github.com/bluenviron/gohlslib/issues/349)
- allow caching non-low-latency playlists (https://github.com/bluenviron/gohlslib/issues/350)
WebRTC
- prevent open redirect attacks (https://github.com/bluenviron/mediamtx/issues/5708)
RPI Camera
- Merge request->controls instead of overwriting (https://github.com/bluenviron/mediamtx-rpicamera/issues/97) libcamera 0.7.0 is more strict about changing controls; assignment is no longer allowed since https://github.com/raspberrypi/libcamera/commit/310cd8bc0756717cde97fe5b083926f6d6931f58 Instead, we use the merge call with overwrite.
Security
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
- Deprecated and disabled the authJWTInHTTPQuery configuration option, removing support for JWTs in HTTP query parameters.
- Disabled authJWTInHTTPQuery – resolves long‑standing security flaw allowing JWT injection via query strings.
- HLS track sessions via cookies or query parameters for session‑level logging, metrics, and API inspection.
- Support serving HLS streams through a CDN.
Full changelog
New major features
HLS
- track sessions (https://github.com/bluenviron/mediamtx/issues/962) (https://github.com/bluenviron/mediamtx/issues/5683) sessions are now tracked through cookies or query parameters. This provides the ability to inspect sessions through logs, metrics and API, allows more precise tracking of outbound bytes, decreases load on external HTTP authentication URLs since they are now called once per session and not once per request.
- support serving streams with a CDN (https://github.com/bluenviron/mediamtx/issues/5696)
Fixes and improvements
General
- improve listener labels (https://github.com/bluenviron/mediamtx/issues/5635) add a label after every "listener opened on :XXX" message that mentions protocols of every listener.
- dump unencrypted TLS sessions (https://github.com/bluenviron/mediamtx/issues/5624) when dumpPackets is true, embed TLS master keys into the dump, in a format which is natively compatible with Wireshark.
- use "token" as query parameter key to pass tokens (https://github.com/bluenviron/mediamtx/issues/5647) the legacy "jwt" query parameter key is still supported.
- deprecate authJWTInHTTPQuery and disable JWTs in query parameters (https://github.com/bluenviron/mediamtx/issues/5648) This fixes a long standing security flaw. Even though it's a breaking change, few users should be impacted since this feature has been discouraged for some time.
- expose token passed as query parameter to HTTP authentication too (https://github.com/bluenviron/mediamtx/issues/5649) this allows to parse tokens coming from RTSP and RTMP without additional effort.
- playback: return errors as JSON (https://github.com/bluenviron/mediamtx/issues/5656) this is aligned with all other HTTP-based services.
- prevent out-of-memory errors (https://github.com/bluenviron/mediamtx/issues/5674) impose a maximum size on body of incoming HTTP requests and responses.
- metrics: improve performance (https://github.com/bluenviron/mediamtx/issues/5663) use string.Builder instead of string concatenation
- metrics: add labels to the output (https://github.com/bluenviron/mediamtx/issues/5687) group metrics under visible, distinct labels.
- metrics: fix filtering by type=rtmp_conns and type=rtmps_conns (https://github.com/bluenviron/mediamtx/issues/5689)
- metrics: add readerType attribute to the path_readers metric (https://github.com/bluenviron/mediamtx/issues/5690) this allows to filter path readers by type.
- metrics: use an enum for parsing metrics type (https://github.com/bluenviron/mediamtx/issues/5692)
- metrics: fix race condition when reloading configuration (https://github.com/bluenviron/mediamtx/issues/5693)
- docs: add scaling page (https://github.com/bluenviron/mediamtx/issues/5695)
API
- sort path readers (https://github.com/bluenviron/mediamtx/issues/5691)
RTSP
- client: fix RTSP-over-HTTP tunnel request target (https://github.com/bluenviron/gortsplib/issues/1041)
- client: support Axis SRTP variant (https://github.com/bluenviron/gortsplib/issues/1033)
- improve SDP parser compatibility with malformed connection information (https://github.com/bluenviron/gortsplib/issues/1025)
- support parsing responses with no status message (https://github.com/bluenviron/gortsplib/issues/1043) (https://github.com/bluenviron/gortsplib/issues/1050)
- client: don't block RTSP-over-HTTP tunnel startup on POST response (https://github.com/bluenviron/gortsplib/issues/1047)
HLS
- return JSON with error message in case path conf is not available (https://github.com/bluenviron/mediamtx/issues/5655) this behavior is aligned with WebRTC one.
- improve muxer performance (https://github.com/bluenviron/mediamtx/issues/5660) use a mutex instead of a channel to get current instance.
- fix running linter when there are unstaged git changes (https://github.com/bluenviron/gohlslib/issues/336)
- client: use redirected URL when reloading playlist (https://github.com/bluenviron/gohlslib/issues/340) this allows to store and use tokens and signed URLs.
- client: support reading KLV (https://github.com/bluenviron/gohlslib/issues/337)
- prevent out-of-memory errors (https://github.com/bluenviron/gohlslib/issues/343)
- muxer: generate init segment once (https://github.com/bluenviron/gohlslib/issues/344) Previously, the init segment was regenerated in case of codec parameter changes, but changing the init segment has been proved to cause video and audio discontinuities on iOS. Now the init file contains starting parameters only and never changes during the stream lifetime.
- client: increase size limit of segments and parts (https://github.com/bluenviron/gohlslib/issues/345)
- return a custom error when body size limit is exceeded (https://github.com/bluenviron/gohlslib/issues/346)
- muxer: store non-low-latency playlists and init files on disk (https://github.com/bluenviron/gohlslib/issues/348)
Dependencies
- code.cloudfoundry.org/bytefmt updated from v0.67.0 to v0.69.0
- github.com/alecthomas/kong updated from v1.14.0 to v1.15.0
- github.com/bluenviron/gohlslib/v2 updated from v2.2.9 to v2.3.0
- github.com/bluenviron/gortsplib/v5 updated from v5.5.1 to v5.5.2
- github.com/go-git/go-git/v5 updated from v5.17.2 to v5.18.0
- github.com/matthewhartstonge/argon2 updated from v1.4.6 to v1.5.2
- github.com/pion/ice/v4 updated from v4.2.2 to v4.2.5
- golang.org/x/crypto updated from v0.49.0 to v0.50.0
- golang.org/x/sys updated from v0.42.0 to v0.43.0
- golang.org/x/term updated from v0.41.0 to v0.42.0
- github.com/pion/stun/v3 updated from v3.1.1 to v3.1.2
- github.com/pion/turn/v4 removed
- golang.org/x/net updated from v0.52.0 to v0.53.0
- golang.org/x/text updated from v0.35.0 to v0.36.0
- golang.org/x/time updated from v0.12.0 to v0.14.0
- github.com/pion/turn/v5 v5.0.3 added
- hls.js updated from v1.6.15 to v1.6.16
Security
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
- Prevent directory traversal attacks by forbidding special characters that escape intended directories in recorder, playback server, and all HTTP‑based components
- Fill server name indication (SNI) for TLS connections in RTSP and RTMP clients
- Implement AbortMessage support for RTMP
Full changelog
Fixes and improvements
General
- prevent directory traversal attacks (https://github.com/bluenviron/mediamtx/issues/5602) Path names are used as part of paths in several components: in the recorder, in the playback server and in every HTTP-based component (WebRTC, HLS, API). Special characters that allow to escape from the intended directory are now forbidden in order to prevent directory traversal attacks.
RTSP
- client: fill server name indication (SNI) of TLS connections (https://github.com/bluenviron/gortsplib/issues/1038)
RTMP
- implement AbortMessage (https://github.com/bluenviron/mediamtx/issues/4673) (https://github.com/bluenviron/gortmplib/issues/59)
- client: fill server name indication (SNI) of TLS connections (https://github.com/bluenviron/gortmplib/issues/63)
WebRTC
- fix random absolute timestamps with Opus, G711 and LPCM (https://github.com/bluenviron/mediamtx/issues/5597) When rewriting audio RTP timestamps in WebRTC egress, NTP was derived using regenerated packet timestamps minus the incoming RTP base timestamp. That mixed timestamp domains and could shift absolute time by an arbitrary offset while still exposing mapping as available. Fix by using a consistent outgoing RTP domain in rewritten audio paths
- strip TWCC extension of incoming RTP packets (https://github.com/bluenviron/mediamtx/issues/5146) (https://github.com/bluenviron/mediamtx/issues/5605) The TWCC extension is used as part of the WebRTC congestion control algorithm placed between the publisher and the server. If this extension is routed untouched from the server to readers, it messes with the congestion control algorithm present between the server and each reader. Remove it.
RPI Camera
- restore Docker compatibility with armv6 devices (https://github.com/bluenviron/mediamtx/issues/5590) (https://github.com/bluenviron/mediamtx/issues/5595)
- restore compatibility with armv6 devices (https://github.com/bluenviron/mediamtx/issues/5590) (https://github.com/bluenviron/mediamtx-rpicamera/issues/95)
Dependencies
- github.com/bluenviron/gortmplib updated from v0.3.0 to v0.3.1
- github.com/bluenviron/gortsplib/v5 updated from v5.5.0 to v5.5.1
- github.com/gin-contrib/pprof updated from v1.5.3 to v1.5.4
- github.com/go-git/go-git/v5 updated from v5.17.0 to v5.17.2
- github.com/pion/ice/v4 updated from v4.2.1 to v4.2.2
- github.com/pion/webrtc/v4 updated from v4.2.9 to v4.2.11
- github.com/pion/sctp updated from v1.9.2 to v1.9.4
- github.com/bluenviron/mediamtx-rpicamera updated from v2.5.4 to v2.5.5
Security
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
- Publish multiple video/audio renditions over WebRTC (simulcast).
- Track details endpoint added to API.
- User field now included in RTSP, RTMP, SRT, and WebRTC connection/session objects.
Full changelog
New major features
WebRTC
- support publishing multiple video/audio renditions (https://github.com/bluenviron/mediamtx/issues/5573) this allows to receive multiple video tracks from OBS Studio with the new WebRTC Simulcast feature introduced in v32.1.0.
API
- provide track details (https://github.com/bluenviron/mediamtx/issues/5307) (https://github.com/bluenviron/mediamtx/issues/5333) (https://github.com/bluenviron/mediamtx/issues/1726) (https://github.com/bluenviron/mediamtx/issues/5585)
- add user field to RTSP, RTMP, SRT, WebRTC conns and sessions (https://github.com/bluenviron/mediamtx/issues/5104) (https://github.com/bluenviron/mediamtx/issues/5565)
- add RTSP reported lost packets (https://github.com/bluenviron/mediamtx/issues/5198) (https://github.com/bluenviron/mediamtx/issues/5579) The new outboundRtpPacketsReportedLost property allows to track RTP packets that have been reported lost by readers. Furthermore, stats now have a "inbound" or "outbound" prefix to improve readability.
- rename WebRTC stats to match RTSP ones (https://github.com/bluenviron/mediamtx/issues/5581)
- add new stats (https://github.com/bluenviron/mediamtx/issues/5582) - RTSPSession.outboundRTPPacketsDiscarded - Path.inboundFramesInError - SRTConn.outboundFramesDiscarded - WebRTCSession.outboundFramesDiscarded - RTMPConn.outboundFramesDiscarded - HLSMuxer.outboundFramesDiscarded
Fixes and improvements
General
- avoid buffering HTTP response body in loggerWriter (https://github.com/bluenviron/mediamtx/issues/5552) loggerWriter was shadow-copying every response byte into a bytes.Buffer to report the body size, causing the entire response to be accumulated in memory for the lifetime of each request. Replace the buffer with a plain int counter since dump() only ever reported the byte count anyway.
- optionally validate JWT iss and aud claims (https://github.com/bluenviron/mediamtx/issues/5569)
- metrics: add two missing SRT stats (https://github.com/bluenviron/mediamtx/issues/5580)
API
- add deprecated fields to the OpenAPI definition (https://github.com/bluenviron/mediamtx/issues/5575)
- add missing enums and move all enums in dedicated components (https://github.com/bluenviron/mediamtx/issues/5576)
RTSP
- fix rtsps scheme not being used in requests (https://github.com/bluenviron/mediamtx/issues/5236) (https://github.com/bluenviron/mediamtx/issues/5544)
- support unwrapping MPEG-TS tracks (https://github.com/bluenviron/mediamtx/issues/5476) this allows to use MPEG-TS tracks with other protocols and with the recording system
- client: fix support for hostnames in source and dest headers (https://github.com/bluenviron/gortsplib/issues/1009) (https://github.com/bluenviron/mediamtx/issues/5304) (https://github.com/bluenviron/gortsplib/issues/1014)
- allocate a rtp sender for each server session (https://github.com/bluenviron/gortsplib/issues/1021) this produces more realistic statistics and in the future will allow to implement per-session statistics and packet retransmission.
- store reported lost RTP packets in stats (https://github.com/bluenviron/mediamtx/issues/5198) (https://github.com/bluenviron/gortsplib/issues/1023)
HLS
- muxer: support muxing KLS with MPEG-TS (https://github.com/bluenviron/gohlslib/issues/327)
- client: fix deadlock when processing fMP4s (https://github.com/bluenviron/gohlslib/issues/333) (https://github.com/bluenviron/gohlslib/issues/334)
WebRTC
- fix panic with WHIP POST authentication failures (https://github.com/bluenviron/mediamtx/issues/5566)
Dependencies
- code.cloudfoundry.org/bytefmt updated from v0.64.0 to v0.67.0
- github.com/abema/go-mp4 updated from v1.4.1 to v1.5.0
- github.com/bluenviron/gohlslib/v2 updated from v2.2.8 to v2.2.9
- github.com/bluenviron/gortsplib/v5 updated from v5.4.0 to v5.5.0
- github.com/bluenviron/mediacommon/v2 updated from v2.8.2 to v2.8.3
- golang.org/x/crypto updated from v0.48.0 to v0.49.0
- golang.org/x/sys updated from v0.41.0 to v0.42.0
- golang.org/x/term updated from v0.40.0 to v0.41.0
- golang.org/x/net updated from v0.51.0 to v0.52.0
- golang.org/x/text updated from v0.34.0 to v0.35.0
Security
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
Fix corrupted video when alwaysAvailableFile points to H265/H264 tracks after an online stream closes.
Full changelog
Fixes and improvements
General
- fill product version of Windows executable (https://github.com/bluenviron/mediamtx/issues/5167) (https://github.com/bluenviron/mediamtx/issues/5511)
- improve JSON decoder performance (https://github.com/bluenviron/mediamtx/issues/5526) avoid decoding JSON twice.
- fix panic when setting writeQueueSize to zero (https://github.com/bluenviron/mediamtx/issues/5360) (https://github.com/bluenviron/mediamtx/issues/5527)
- prevent using alwaysAvailableFile and alwaysAvailableTracks together (https://github.com/bluenviron/mediamtx/issues/5529)
- improve playback precision of alwaysAvailable offline segment (https://github.com/bluenviron/mediamtx/issues/5530)
- fix MPEG-4 audio configuration not matching error (https://github.com/bluenviron/mediamtx/issues/5468) (https://github.com/bluenviron/mediamtx/issues/5533) This happened when using alwaysAvailableFile and a MPEG-4 audio track.
- fix corrupted video with alwaysAvailableFile (https://github.com/bluenviron/mediamtx/issues/5534) when alwaysAvailableFile points to a file with a H265 or H264 track, server is started, an online stream is published and then closed, video was getting corrupted since the online video was overriding the parameters of the offline video.
- fix audio from alwaysAvailableFile not being streamed (https://github.com/bluenviron/mediamtx/issues/5535)
- fix alwaysAvailableFile restarting when a publisher fails (https://github.com/bluenviron/mediamtx/issues/5536) when a publisher try to start an online stream and there's an error, alwaysAvailableFile restarted without any reason.
- revert to Go 1.25 (https://github.com/bluenviron/mediamtx/issues/5521) (https://github.com/bluenviron/mediamtx/issues/5538) It seems like Go 1.26 is causing segmentation faults, related to channels, on Windows.
- inherit MPEG-4 audio type from alwaysAvailableFile (https://github.com/bluenviron/mediamtx/issues/5539)
- mpegts: properly compute PTS of async KLV frames (https://github.com/bluenviron/mediacommon/issues/291) (https://github.com/bluenviron/mediacommon/issues/311) Store last valid PTS as soon as possible, by parsing PES headers in advance, then use this PTS as timestamp of KLV frames without PTS.
HLS
- client: fix initial packet loss after astits upgrade (https://github.com/bluenviron/gohlslib/issues/331)
Dependencies
- Go updated from 1.26 to 1.25
- github.com/asticode/go-astits updated from v1.14.0 to v1.15.0
- github.com/bluenviron/gohlslib/v2 updated from v2.2.6 to v2.2.8
- github.com/bluenviron/gortsplib/v5 updated from v5.3.2 to v5.4.0
- github.com/bluenviron/mediacommon/v2 updated from v2.8.0 to v2.8.2
- github.com/gin-gonic/gin updated from v1.11.0 to v1.12.0
- github.com/go-git/go-billy/v5 updated from v5.7.0 to v5.8.0
- github.com/go-git/go-git/v5 updated from v5.16.5 to v5.17.0
- github.com/bytedance/sonic updated from v1.14.0 to v1.15.0
- github.com/bytedance/sonic/loader updated from v0.3.0 to v0.5.0
- github.com/cloudflare/circl updated from v1.6.1 to v1.6.3
- github.com/gabriel-vasile/mimetype updated from v1.4.8 to v1.4.12
- github.com/go-playground/validator/v10 updated from v10.27.0 to v10.30.1
- github.com/quic-go/quic-go updated from v0.57.0 to v0.59.0
- github.com/ugorji/go/codec updated from v1.3.0 to v1.3.1
- golang.org/x/arch updated from v0.20.0 to v0.22.0
- golang.org/x/net updated from v0.50.0 to v0.51.0
- google.golang.org/protobuf updated from v1.36.9 to v1.36.10
- github.com/bytedance/gopkg v0.1.3 added
- go.mongodb.org/mongo-driver/v2 v2.5.0 added
Security
Binaries are compiled from source code by the Release workflow without human intervention.
You can verify that binaries have been produced by the workflow by using GitHub Attestations:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
- gopkg.in/yaml.v2 removed – migrate to github.com/goccy/go-yaml
- Unix+rtp protocol deprecated (use alternative transports)
- Go runtime updated from 1.25 to 1.26
- Support X-Forwarded-Proto in playback server for reverse‑proxy URL schema handling
- Add integrated packet dumper (pcapng output)
- Allow tuning WHEP timeouts via whepHandshakeTimeout, whepTrackGatherTimeout, whepSTUNGatherTimeout
Full changelog
Fixes and improvements
General
- support X-Forwarded-Proto in playback server (https://github.com/bluenviron/mediamtx/issues/4970) (https://github.com/bluenviron/mediamtx/issues/5445) allow reverse proxies to change the schema of URLs returned by the server through the X-Forwarded-Proto header.
- make config file YAML 1.2 compliant (https://github.com/bluenviron/mediamtx/issues/5345) (https://github.com/bluenviron/mediamtx/issues/5456)
- replace YAML parser (https://github.com/bluenviron/mediamtx/issues/5461) switch from the unmaintained gopkg.in/yaml to goccy/go-yaml
- deprecate unix+rtp (https://github.com/bluenviron/mediamtx/issues/5318) (https://github.com/bluenviron/mediamtx/issues/4999) (https://github.com/bluenviron/mediamtx/issues/5351) (https://github.com/bluenviron/mediamtx/issues/5470) Unix socket are stream-based connections, while RTP requires packet-based connections. While packet-based Unix sockets exist (unixgram), no client supports them. Consequently we are forced to deprecate unix+rtp.
- fix codec parameters not being loaded from alwaysAvailableFile (https://github.com/bluenviron/mediamtx/issues/5484)
- warn when alwaysAvailableFile is not MP4 (https://github.com/bluenviron/mediamtx/issues/5483)
- suggest using JWTs in query parameters for RTSP and RTMP (https://github.com/bluenviron/mediamtx/issues/5267) (https://github.com/bluenviron/mediamtx/issues/5493) In case of RTSP and RTMP, JWTs cannot be used as passwords since there's a size limit. Therefore, documentation is updated to suggest passing JWT through query parameters, and authJWTInHTTPQuery is updated to act on HTTP requests only.
- fix error 400 with parallel describe and publish requests (https://github.com/bluenviron/mediamtx/issues/5095) (https://github.com/bluenviron/mediamtx/issues/5502) When a path is dynamic, and the path receives multiple describe and publish requests in parallel, describe requests might cause the path to be deleted, and this might cause pending publish requests to fail, since the path has been deleted. This patch improves the situation by checking for pending requests before deleting a path.
- add integrated packet dumper (https://github.com/bluenviron/mediamtx/issues/5488) this allows to dump any incoming and outgoing packet, to disk, in pcapng format.
- log packet sizes if UDPMaxPayloadSize is exceeded (https://github.com/bluenviron/mediamtx/issues/4668)
- improve video/audio sync of alwaysAvailable (https://github.com/bluenviron/mediamtx/issues/5443) (https://github.com/bluenviron/mediamtx/issues/5508) store elapsed time once for the entire stream and start PTS of sub streams from there.
- improve pmp4 and fmp4 parser robustness (https://github.com/bluenviron/mediacommon/issues/299)
- mp4: fix H265 + iOS compatibility (https://github.com/bluenviron/mediacommon/issues/290) On iOS, H265 requires the hvc1 box instead of the hev1 box.
- h264: prevent Annex-B from decoding more NALUs than MaxNALUsPerAccessUnit (https://github.com/bluenviron/mediacommon/issues/303)
- improve H264 and MPEG-4 video performance (https://github.com/bluenviron/mediamtx/issues/4971) (https://github.com/bluenviron/mediacommon/issues/304)
- mp4: fill reserved fields properly (https://github.com/bluenviron/mediacommon/issues/307)
- mpegts: parse Opus channel configuration (https://github.com/bluenviron/mediamtx/issues/5002) (https://github.com/bluenviron/mediacommon/issues/309)
API
- add conns to RTSP Sessions (https://github.com/bluenviron/mediamtx/issues/5454) this allows to find connections associated with a RTSP session.
RTMP
- prevent legacy clients from reading multiple video/audio tracks (https://github.com/bluenviron/mediamtx/issues/5478)
- fix marshaling H264 VideoExCodedFrames (https://github.com/bluenviron/mediamtx/issues/4996) (https://github.com/bluenviron/gortmplib/issues/46) These messages were marshaled wrongly, causing errors when trying to read H264 tracks with an ID >= 1.
- support reading H265 with video codec id 12 (https://github.com/bluenviron/mediamtx/issues/5105) (https://github.com/bluenviron/gortmplib/issues/48)
HLS
- client: support storing and sending cookies (https://github.com/bluenviron/mediamtx/issues/5444)
WebRTC
- allow tuning WHEP timeouts (https://github.com/bluenviron/mediamtx/issues/5027) (https://github.com/bluenviron/mediamtx/issues/5479) add whepHandshakeTimeout, whepTrackGatherTimeout, whepSTUNGatherTimeout
- add whepBearerTokenParameter (https://github.com/bluenviron/mediamtx/issues/3796) (https://github.com/bluenviron/mediamtx/issues/5486) this allows to pass Authorization: Bearer to servers that require it.
SRT
- set timeout of idle peers to readTimeout (https://github.com/bluenviron/mediamtx/issues/5489)
RPI Camera
- fix cross-compilation (https://github.com/bluenviron/mediamtx-rpicamera/issues/89)
- fix kernel warning when closing camera (https://github.com/bluenviron/mediamtx/issues/4988) (https://github.com/bluenviron/mediamtx-rpicamera/issues/88) close camera and encoder handlers properly.
Dependencies
- Go updated from 1.25 to 1.26
- code.cloudfoundry.org/bytefmt updated from v0.63.0 to v0.64.0
- github.com/MicahParks/keyfunc/v3 updated from v3.7.0 to v3.8.0
- github.com/bluenviron/gohlslib/v2 updated from v2.2.5 to v2.2.6
- github.com/bluenviron/gortmplib updated from v0.2.1 to v0.3.0
- github.com/bluenviron/gortsplib/v5 updated from v5.3.1 to v5.3.2
- github.com/bluenviron/mediacommon/v2 updated from v2.7.1 to v2.8.0
- github.com/datarhei/gosrt updated from v0.9.0 to v0.10.0
- github.com/go-git/go-git/v5 updated from v5.16.4 to v5.16.5
- github.com/matthewhartstonge/argon2 updated from v1.4.5 to v1.4.6
- github.com/pion/ice/v4 updated from v4.2.0 to v4.2.1
- github.com/pion/sdp/v3 updated from v3.0.17 to v3.0.18
- github.com/pion/webrtc/v4 updated from v4.2.3 to v4.2.9
- golang.org/x/crypto updated from v0.47.0 to v0.48.0
- golang.org/x/sys updated from v0.40.0 to v0.41.0
- golang.org/x/term updated from v0.39.0 to v0.40.0
- gopkg.in/yaml.v2 removed
- github.com/goccy/go-yaml updated from v1.18.0 to v1.19.2
- github.com/pion/dtls/v3 updated from v3.0.10 to v3.1.2
- golang.org/x/net updated from v0.49.0 to v0.50.0
- golang.org/x/text updated from v0.33.0 to v0.34.0
- github.com/google/gopacket v1.1.19 added
- github.com/bluenviron/mediamtx-rpicamera updated from v2.5.3 to v2.5.4
Security
Binaries are compiled from source code by the Release workflow without human intervention.
You can verify that binaries have been produced by the workflow by using GitHub Attestations:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
- Added authHTTPFingerprint configuration option
- Improved PMP4 compatibility
Full changelog
Fixes and improvements
General
- fix typo in error message ('alwaysAvailableVideo' -> 'alwaysAvailableFile') (https://github.com/bluenviron/mediamtx/issues/5417)
- emit structured logs with nanosecond precision (https://github.com/bluenviron/mediamtx/issues/4924) (https://github.com/bluenviron/mediamtx/issues/5404)
- set default udpMaxPayloadSize to an IPv6 compatible value (https://github.com/bluenviron/mediamtx/issues/4882) (https://github.com/bluenviron/mediamtx/issues/5402) When using IPv6, there are 20 bytes less available for UDP payload, which has been adjusted accordingly.
- add authHTTPFingerprint (https://github.com/bluenviron/mediamtx/issues/5413) (https://github.com/bluenviron/mediamtx/issues/5422)
- add additional checks on always-available streams (https://github.com/bluenviron/mediamtx/issues/5408) make sure that published streams match MPEG-4 audio, G711 and LPCM parameters declared in configuration or used by the offline file.
- improve JSON error message (https://github.com/bluenviron/mediamtx/issues/5412) (https://github.com/bluenviron/mediamtx/issues/5433)
- pmp4: improve compatibility (https://github.com/bluenviron/mediamtx/issues/5423) (https://github.com/bluenviron/mediacommon/issues/298)
RTSP
- rtpreceiver: fix panic (https://github.com/bluenviron/gortsplib/issues/994)
- support Amatek AR-N3222F NVR (https://github.com/bluenviron/gortsplib/issues/989)
- rtpreceiver: fix TotalReceived computation (https://github.com/bluenviron/gortsplib/issues/995) one packet was missing.
RPI Camera
- fix unsetting rpiCameraAWBGains (https://github.com/bluenviron/mediamtx/issues/4935) (https://github.com/bluenviron/mediamtx-rpicamera/issues/85)
Dependencies
- code.cloudfoundry.org/bytefmt updated from v0.62.0 to v0.63.0
- github.com/alecthomas/kong updated from v1.13.0 to v1.14.0
- github.com/bluenviron/gortsplib/v5 updated from v5.3.0 to v5.3.1
- github.com/bluenviron/mediacommon/v2 updated from v2.7.0 to v2.7.1
- github.com/pion/interceptor updated from v0.1.43 to v0.1.44
- github.com/pion/rtp updated from v1.10.0 to v1.10.1
- github.com/bluenviron/mediamtx-rpicamera updated from v2.5.2 to v2.5.3
Security
Binaries are compiled from source code by the Release workflow without human intervention.
You can verify that binaries have been produced by the workflow by using GitHub Attestations:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
- Moved away from balenalib Docker images; users must update container base images.
- Deprecation of fallback feature (RTSP only) – migrate to alwaysAvailable configuration.
- Always‑available streams: server fills gaps with a repeat video when publisher offline, concatenating without re‑encoding.
- API adds available, availableTime, online, onlineTime properties replacing ready/readyTime to monitor always‑available behavior.
Full changelog
New major features
General
- add always available streams (https://github.com/bluenviron/mediamtx/issues/5335) When the publisher or source of a stream is offline, the server can be configured to fill gaps in the stream with a video that is played on repeat until a publisher comes back online. This allows readers to stay connected regardless of the state of the stream. The offline video and any future online stream are concatenated without decoding or re-encoding packets, using the original codec.
API
- add available, availableTime, online, onlineTime properties (https://github.com/bluenviron/mediamtx/issues/5391) these replace ready and readyTime and allow to monitor the new "always-available" feature.
WebRTC
- support reading KLV tracks (https://github.com/bluenviron/mediamtx/issues/4722)
Fixes and improvements
General
- move away from balenalib Docker images (https://github.com/bluenviron/mediamtx/issues/5313)
- print OS and Arch in first log line (https://github.com/bluenviron/mediamtx/issues/5315)
- print last decode error (https://github.com/bluenviron/mediamtx/issues/5319) decode errors are still grouped together, but the last one is now printed.
- print last processing error (https://github.com/bluenviron/mediamtx/issues/5323)
- use the same filtering process for every codec (https://github.com/bluenviron/mediamtx/issues/5324) this allows to apply features that were previously implemented for single codecs (like RTP packet resizing), to any codec, and simplifies future development.
- prevent several configuration errors (https://github.com/bluenviron/mediamtx/issues/5368)
- fix typos in documentation (https://github.com/bluenviron/mediamtx/issues/5370)
- fix overriding default user with environment variables (https://github.com/bluenviron/mediamtx/issues/5371) MTX_AUTHINTERNALUSERS_0_USER and MTX_AUTHINTERNALUSERS_0_PASS are now working even when the configuration file is present.
- prevent setting empty usernames with environment variables (https://github.com/bluenviron/mediamtx/issues/5373)
- fix panic with environment variables (https://github.com/bluenviron/mediamtx/issues/5374) this happened when loading deprecated slices of structs with environment variables.
- prevent setting slices to null (https://github.com/bluenviron/mediamtx/issues/5375) In Golang, slices can be set to nil, while in most other languages they cannot. This causes compatibility issues, especially because the OpenAPI definition of the API does not allow slices to be nil. This prevents slices from being set to nil through JSON/YAML, and also sets default slices to an empty list instead of nil.
- Update hlsEncryption documentation on Low-Latency HLS requirements (https://github.com/bluenviron/mediamtx/issues/5379)
- fix race condition when closing HTTP servers (https://github.com/bluenviron/mediamtx/issues/5390) when a HTTP server is closed, open connections are now immediately closed and open routines are waited before the server is considered closed.
- deprecate fallback (https://github.com/bluenviron/mediamtx/issues/5388) The fallback feature worked with RTSP only and did not allow readers to resume the original stream. It has been replaced by alwaysAvailable.
- mpegts: add E-AC-3 (Dolby Digital Plus) codec support (https://github.com/bluenviron/mediacommon/issues/272)
- mpeg4audio: support channel_config=0 (https://github.com/bluenviron/mediacommon/issues/273)
- mpeg4audio: in ASC, prefer marshaling legacy ChannelConfig when available (https://github.com/bluenviron/mediacommon/issues/280)
- pmp4: increase compatibility (https://github.com/bluenviron/mediacommon/issues/293)
- pmp4: support MP4s with data before track definitions (https://github.com/bluenviron/mediacommon/issues/294)
API
- improve OpenAPI definition (https://github.com/bluenviron/mediamtx/issues/5380) add uint64, uint, uuid, move WebRTCICEServer into dedicated schema
RTSP
- fix log labels of RTSPS listeners (https://github.com/bluenviron/mediamtx/issues/5367) use "TCP/RTSPS", "UDP/SRTP", "UDP/SRTCP" to refer to secure listeners
- add rtspUDPSourcePortRange param (https://github.com/bluenviron/mediamtx/issues/5363) (https://github.com/bluenviron/mediamtx/issues/5397)
HLS
- fix playback starting point for VOD streams without EXT-X-PLAYLIST-TYPE (https://github.com/bluenviron/gohlslib/issues/308)
- client: return every unit before an error (https://github.com/bluenviron/gohlslib/issues/314) In case of an error, downloaded unit that were not processed yet were discarded. Now they are returned before the client exits.
WebRTC
- print incoming data channel messages (https://github.com/bluenviron/mediamtx/issues/5357)
RPI Camera
- move away from balenalib Docker images (https://github.com/bluenviron/mediamtx-rpicamera/issues/82)
Dependencies
- code.cloudfoundry.org/bytefmt updated from v0.59.0 to v0.62.0
- github.com/bluenviron/gohlslib/v2 updated from v2.2.4 to v2.2.5
- github.com/bluenviron/gortmplib updated from v0.2.0 to v0.2.1
- github.com/bluenviron/gortsplib/v5 updated from v5.2.2 to v5.3.0
- github.com/bluenviron/mediacommon/v2 updated from v2.6.0 to v2.7.0
- github.com/golang-jwt/jwt/v5 updated from v5.3.0 to v5.3.1
- github.com/matthewhartstonge/argon2 updated from v1.4.4 to v1.4.5
- github.com/pion/ice/v4 updated from v4.1.0 to v4.2.0
- github.com/pion/interceptor updated from v0.1.42 to v0.1.43
- github.com/pion/rtp updated from v1.9.0 to v1.10.0
- github.com/pion/transport/v3 removed
- github.com/pion/webrtc/v4 updated from v4.2.1 to v4.2.3
- golang.org/x/crypto updated from v0.46.0 to v0.47.0
- golang.org/x/sys updated from v0.39.0 to v0.40.0
- golang.org/x/term updated from v0.38.0 to v0.39.0
- github.com/pion/datachannel updated from v1.5.10 to v1.6.0
- github.com/pion/dtls/v3 updated from v3.0.9 to v3.0.10
- github.com/pion/sctp updated from v1.9.0 to v1.9.2
- github.com/pion/srtp/v3 updated from v3.0.9 to v3.0.10
- github.com/pion/stun/v3 updated from v3.0.2 to v3.1.1
- github.com/pion/turn/v4 updated from v4.1.3 to v4.1.4
- golang.org/x/net updated from v0.48.0 to v0.49.0
- golang.org/x/text updated from v0.32.0 to v0.33.0
- github.com/pion/transport/v4 v4.0.1 added
- github.com/bluenviron/mediamtx-rpicamera updated from v2.5.1 to v2.5.2
Security
Binaries are compiled from source through the Release workflow without human intervention, preventing any external interference.
You can verify that binaries have been produced by the workflow by using GitHub Attestations:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check