Playing URL Rules
1. Components of a URL
Taking rtsp://somedomain.com:554/live/0?token=abcdefg&field=value
as an example, this URL is divided into the following parts:
Protocol(scheam)
: RTSP protocol, default port 554Virtual Host(vhost)
: somedomain.com. This field can be either a domain name or an IP. If it is an IP, the corresponding virtual host is__defaultVhost__
Server Port(port)
: 554. If the port number is not specified, the protocol's default port number is usedApplication Name(app)
: liveStream ID(streamid)
: 0Parameters(args)
: token=abcdefg&field=value
2. Stream Media Source in ZLMediaKit
In ZLMediaKit, a stream media source is a data object that can be used for functions such as live broadcasting and stream forwarding, and is referred to as MediaSource
in this project. Currently, it supports five types of stream media sources, namely RtspMediaSource
, RtmpMediaSource
, HlsMediaSource
, TSMediaSource
, FMP4MediaSource
.
Identifying a stream media source is mainly based on four elements (referred to as 4-tuples hereafter), which are:
Protocol(scheam)
Virtual Host(vhost)
Application Name(app)
Stream ID(streamid)
RtspMediaSource
supports RTSP playback, RTSP streaming, WebRTC playback, and WebRTC streaming.
RtmpMediaSource
supports RTMP streaming/playback, HTTP-FLV playback, and WS-FLV playback.
HlsMediaSource
supports HLS playback.
TSMediaSource
supports HTTP-TS playback and WS-TS playback.
FMP4MediaSource
supports HTTP-FMP4 playback and WS-FMP4 playback.
3. Playback URLs Corresponding to the Stream Media Source
Suppose there is a RtspMediaSource
, and its 4-tuple are rtsp (RtspMediaSource is always rtsp)
, somedomain.com
, live
, and 0
Then the URLs for playing this stream media source correspond to:
rtsp://somedomain.com/live/0
rtsps://somedomain.com/live/0
rtsp://127.0.0.1/live/0?vhost=somedomain.com
rtsps://127.0.0.1/live/0?vhost=somedomain.com
If there is a RtmpMediaSource
, and its 4-tuple are rtmp (RtmpMediaSource is always rtmp)
, somedomain.com
, live
, and 0
Then the URLs for playing this stream media source correspond to:
rtmp://somedomain.com/live/0
rtmps://somedomain.com/live/0
rtmp://127.0.0.1/live/0?vhost=somedomain.com
rtmps://127.0.0.1/live/0?vhost=somedomain.com
RTMP types of stream media sources also support live streaming through http-flv
, websocket
, and other protocols. The corresponding URLs are as follows:
Note: Old code live broadcast suffix is .flv, and it has been changed to .live.flv in the new code
http://somedomain.com/live/0.live.flv
https://somedomain.com/live/0.live.flv
http://127.0.0.1/live/0.live.flv?vhost=somedomain.com
https://127.0.0.1/live/0.live.flv?vhost=somedomain.com
ws://somedomain.com/live/0.live.flv
wss://somedomain.com/live/0.live.flv
ws://127.0.0.1/live/0.live.flv?vhost=somedomain.com
wss://127.0.0.1/live/0.live.flv?vhost=somedomain.com
Sure, ZLMediaKit typically converts RTSP and RTMP media streams to each other and also transforms them into HLS/HTTP-TS/WS-TS/HTTP-fMP4/WS-fMP4. The playback URLs are as follows:
HLS
http://somedomain.com/live/0/hls.m3u8
https://somedomain.com/live/0/hls.m3u8
http://127.0.0.1/live/0/hls.m3u8?vhost=somedomain.com
https://127.0.0.1/live/0/hls.m3u8?vhost=somedomain.com
HTTP-TS/WS-TS (with the suffix .live.ts, to resolve the conflict with HLS)
http://somedomain.com/live/0.live.ts
https://somedomain.com/live/0.live.ts
http://127.0.0.1/live/0.live.ts?vhost=somedomain.com
https://127.0.0.1/live/0.live.ts?vhost=somedomain.com
ws://somedomain.com/live/0.live.ts
wss://somedomain.com/live/0.live.ts
ws://127.0.0.1/live/0.live.ts?vhost=somedomain.com
wss://127.0.0.1/live/0.live.ts?vhost=somedomain.com
HTTP-fMP4/WS-fMP4 (with the suffix .live.mp4, to resolve the conflict with MP4 on-demand)
http://somedomain.com/live/0.live.mp4
https://somedomain.com/live/0.live.mp4
http://127.0.0.1/live/0.live.mp4?vhost=somedomain.com
https://127.0.0.1/live/0.live.mp4?vhost=somedomain.com
ws://somedomain.com/live/0.live.mp4
wss://somedomain.com/live/0.live.mp4
ws://127.0.0.1/live/0.live.mp4?vhost=somedomain.com
wss://127.0.0.1/live/0.live.mp4?vhost=somedomain.com
Generally speaking, all the above URLs are valid in ZLMediaKit, as ZLMediaKit converts media sources by default.
4. Video-on-Demand URL
ZLMediaKit typically implements video-on-demand via MP4 files, and we recommend using HTTP MP4 on-demand as it is the simplest method and the server does not need to demultiplex the MP4 files. ZLMediaKit currently also supports RTSP, RTMP, HTTP-FLV, and WebSocket-FLV MP4 on-demand. The corresponding URLs are similar to live broadcast URLs and will not be elaborated here; only the differences are discussed.
- ZLMediaKit restricts the application name for on-demand to the default
record
. - Suppose an MP4 file is placed in the HTTP root directory record folder (
www/record
). Its relative path iswww/record/0.mp4
, then the on-demand URL would be:rtsp://somedomain.com/record/0.mp4
rtmp://somedomain.com/record/0.mp4
http://somedomain.com/record/0.mp4
(This is a generic HTTP file on-demand; the server does not need to demultiplex the file)http://somedomain.com/record/0.mp4.live.flv
(This is HTTP-FLV live streaming, not HTTP on-demand; the server needs to demultiplex the file)ws://somedomain.com/record/0.mp4.live.flv
http://somedomain.com/record/0.mp4.live.ts
(This is HTTP-TS live streaming, not HTTP on-demand; the server needs to demultiplex the file)ws://somedomain.com/record/0.mp4.live.ts
http://somedomain.com/record/0.mp4.live.mp4
(This is HTTP-fMP4 live streaming, not HTTP on-demand; the server needs to demultiplex the file)ws://somedomain.com/record/0.mp4.live.mp4
- If virtual hosting is enabled, then the on-demand files should be placed in
www/somedomain.com/record/0.mp4
.
5. WebRTC Push/Pull
WebRTC playback is slightly different from the methods mentioned above. The WebRTC protocol itself does not define a signaling interaction protocol, and users need to implement the sdp+icecandidate
exchange logic themselves. So, WebRTC does not have a standard player, and you need to use JS or a native SDK to implement playback.
ZLMediaKit implements the WebRTC SDP+icecandidate
exchange method via HTTP POST
. The interface name is /index/api/webrtc
. This interface uses POST content to pass the offer sdp
while passing the media source's four-tuple app
stream_id
in the URL query parameters. Since HTTP inherently supports vhost
, there's no need to specify vhost
separately. WebRTC in ZLMediaKit can be considered another representation of the RTSP protocol. Their push and playback use the same data source, which is RtspMediaSource
.
When pushing WebRTC, the HTTP POST interface for exchanging WebRTC SDP+icecandidate
is similar to: http://127.0.0.1/index/api/webrtc?app=live&stream=test&type=push
When playing WebRTC, the HTTP POST interface for exchanging WebRTC SDP+icecandidate
is similar to: http://127.0.0.1/index/api/webrtc?app=live&stream=test&type=play
.
ZLMediaKit comes with a WebRTC test player/pusher. After starting ZLMediaKit, you can access it by visiting http://127.0.0.1/webrtc/
in your browser.
Additionally, ZLMediaKit also supports playing MP4 files via WebRTC. The HTTP POST interface is similar to: http://127.0.0.1/index/api/webrtc?app=record&stream=test.mp4&type=play
.
6. URL Parameters
ZLMediaKit recognizes the string after the question mark in the URL as parameters, which are consistent with HTTP formats. Among them, vhost
is a built-in parameter supported by ZLMediaKit, which allows specifying a virtual host. URL parameters are mainly used for streaming and playback authentication. When triggering the hook API, these parameters will be submitted to the third-party business server.