Skip to end of metadata
Go to start of metadata

Overview

Since WCS build 5.2.1193 it is possible to publish MPEG-TS RTP stream via UDP to WCS, and since build 5.2.1253 MPEG-TS stream may be published via SRT. The feature can be used to publish H264+AAC stream from software or hardware encoder supporting MPEG-TS.

SRT protocol is more reliable than UDP, so it is recommended to use SRT for MPEG-TS publishing if possible.

Codecs supported

  • H264
  • AAC

Operation flowchart

1. Publisher sends REST API query /mpegts/startup 

2. Publisher receives 200 OK with URI to publish

3. Stream is publishing to WCS using URI

4. Browser establishes Websocket connestion and sends play  command.

5. Browser receives WebRTC stream and plays it on web page.

Testing

1. For test we use:

  • WCS server
  • ffmpeg to publish MPEG-TS stream
  • Player web application in Chrome browser to play the stream

2. Send /mpegts/startup query with stream name test 

SRT:

curl -H "Content-Type: application/json" -X POST http://test1.flashphoner.com:8081/rest-api/mpegts/startup -d '{"localStreamName":"test","transport":"srt"}'

UDP:

curl -H "Content-Type: application/json" -X POST http://test1.flashphoner.com:8081/rest-api/mpegts/startup -d '{"localStreamName":"test","transport":"udp"}'

Where test1.flashphoner.com - WCS server address

3. Receive 200 OK response

SRT:

{
  "localMediaSessionId": "32ec1a8e-7df4-4484-9a95-e7eddc45c508",
  "localStreamName": "test",
  "uri": "srt://test1.flashphoner.com:31014",
  "status": "CONNECTED",
  "hasAudio": true,
  "hasVideo": true,
  "record": false,
  "timeout": 90000,
  "maxTimestampDiff": 90000
}

UDP:

{
  "localMediaSessionId": "32ec1a8e-7df4-4484-9a95-e7eddc45c508",
  "localStreamName": "test",
  "uri": "udp://test1.flashphoner.com:31014",
  "status": "CONNECTED",
  "hasAudio": true,
  "hasVideo": true,
  "record": false,
  "timeout": 90000,
  "maxTimestampDiff": 90000
}

4. Publish MPEG-TS stream using URI from the response

SRT:

 ffmpeg -re -i bunny360p.mp4 -c:v libx264 -c:a aac -b:a 160k -bsf:v h264_mp4toannexb -keyint_min 60 -profile:v baseline -preset veryfast -f mpegts "srt://test1.flashphoner.com:31014"

UDP:

 ffmpeg -re -i bunny360p.mp4 -c:v libx264 -c:a aac -b:a 160k -bsf:v h264_mp4toannexb -keyint_min 60 -profile:v baseline -preset veryfast -f mpegts "udp://test1.flashphoner.com:31014?pkt_size=1316"

5. Open Player web application. Set the stream name test to "Stream name" field and click "Start" button. Stream playback will start

Configuration

Stop stream publishing if there are no media data

By default, MPEG-TS stream publishing will stop at server side if server doe not receive any media data from publisher in 90 seconds. The timeout is set in milliseconds by the following papameter

mpegts_stream_timeout=90000

Close subscribers sessions if publisher stops sending media data

If publisher stopped sending media data by some reason, then started again (for example, ffmpeg was restarted), the stream frame timestamps sequence is corrupting. Te stream cannot be played via WebRTC correctky in this case. As workaround, all the subscribers sessions will be closed if stream timestamps sequence corruption occurs, then all the si=ubscribers should connect to the stream again. A maximum timestamp difference is set in seconds by the following parameter

mpegts_max_pts_diff=1

REST API

A REST-query should be HTTP/HTTPS POST request as follows:

  • HTTP: http://test.flashphoner.com:8081/rest-api/mpegts/startup
  • HTTPS: https://test.flashphoner.com:8444/rest-api/mpegts/startup

Where:

  • test.flashphoner.com - is the address of the WCS server
  • 8081 - is the standard REST / HTTP port of the WCS server
  • 8444 - is the standard HTTPS port
  • rest-api - is the required part of the URL
  • /mpegts/startup - REST mathod to use

REST methods and response states

REST method

REST query body example

REST response body example

Response states

Description

/mpegts/startup

{
  "localStreamName":"test",
  "transport":"srt",
  "hasAudio": true,
  "hasVideo": true
}
{
  "localMediaSessionId": "32ec1a8e-7df4-4484-9a95-e7eddc45c508",
  "localStreamName": "test",
  "uri": "srt://192.168.1.39:31014",
  "status": "CONNECTED",
  "hasAudio": true,
  "hasVideo": true,
  "record": false,
  "timeout": 90000,
  "maxTimestampDiff": 90000
}

200 - OK

409 - Conflict

500 - Internal error


Start MPEG-TS publishing


/mpegts/find
{
  "localStreamName":"test",
  "uri": "srt://192.168.1.39:31014"
}
[
 {
  "localMediaSessionId": "32ec1a8e-7df4-4484-9a95-e7eddc45c508",
  "localStreamName": "test",
  "uri": "srt://192.168.1.39:31014",
  "status": "CONNECTED",
  "hasAudio": true,
  "hasVideo": true,
  "record": false,
  "timeout": 90000,
  "maxTimestampDiff": 90000
 }
]

200 – streams found

404 – streams not found

500 - Internal error

Find the MPEG-TS stream by criteria

/mpegts/find_all


[
 {
  "localMediaSessionId": "32ec1a8e-7df4-4484-9a95-e7eddc45c508",
  "localStreamName": "test",
  "uri": "srt://192.168.1.39:31014",
  "status": "CONNECTED",
  "hasAudio": true,
  "hasVideo": true,
  "record": false,
  "timeout": 90000,
  "maxTimestampDiff": 90000
 }
]

200 – streams found

404 – streams not found

500 - Internal error

Find all MPEG-TS streams

/mpegts/terminate

{
  "localStreamName":"test"
}

200 - stream stopped

404 - stream not found

500 - Internal error

Stop MPEG-TS stream

Parameters

Name

Description

Example

localStreamNameName to set to the stream on servertest
transportTransport to usesrt
uriEndpoint URI to publish the streamudp://192.168.1.39:31014
localMediaSessionIdStream media session Id32ec1a8e-7df4-4484-9a95-e7eddc45c508
statusStream statusCONNECTED
hasAudioStream has audio tracktrue
hasVideoStream has video tracktrue
recordStream is recordingfalse
timeoutMaximum media data receiving timeout, ms90000
maxTimestampDiffMaximum stream timestamps difference, ms90000

allowedList

Client addresses list which are allowed to publish the stream

["192.168.1.0/24"] 

Audio only or video only publishing

Since build 5.2.1253, audio only or video only stream can be published using REST API query /mpegts/startup parameters

  • video only stream publishing
{
  "localStreamName":"mpegts-video-only",
  "transport":"srt",
  "hasAudio": false
}
  • audio only stream publishing
{
  "localStreamName":"mpegts-audio-only",
  "transport":"srt",
  "hasVideo": false
}

Publishing audio with various samplerates

By default, the following video and audio parameters are used to publish MPEG-TS stream

v=0
o=- 1988962254 1988962254 IN IP4 0.0.0.0
c=IN IP4 0.0.0.0
t=0 0
a=sdplang:en
m=audio 1 RTP/AVP 102
a=rtpmap:102 mpeg4-generic/44100/2
a=sendonly
m=video 1 RTP/AVP 119
a=rtpmap:119 H264/90000
a=sendonly

Video track must be published in H264 codec with clock rate 90000 Hz, audio track must be published in AAC with samplerate 44100 Hz, two channels.

An additional samplerates or one channel may be enabled for audio publishing if necessary. Do the following to enable:

1. Create the file mpegts_agent.sdp in /usr/local/FlashphonerWebCallServer/conf folder

sudo touch /usr/local/FlashphonerWebCallServer/conf/mpegts_agent.sdp

2. Add necessary SDP parameters to the file

sudo nano /usr/local/FlashphonerWebCallServer/conf/mpegts_agent.sdp

for example

v=0
o=- 1988962254 1988962254 IN IP4 0.0.0.0
c=IN IP4 0.0.0.0
t=0 0
a=sdplang:en
m=audio 1 RTP/AVP 102 103 104
a=rtpmap:102 mpeg4-generic/44100/2
a=rtpmap:103 mpeg4-generic/48000/2
a=rtpmap:104 mpeg4-generic/32000/1
a=sendonly
m=video 1 RTP/AVP 119
a=rtpmap:119 H264/90000
a=sendonly

3. Set the necessary permissions and restart WCS to apply changes

sudo nano /usr/local/FlashphonerWebCallServer/bin/webcallserver set-permissions
sudo systemctl restart webcallserver

Renewing the stream publishing after interruption

A separate UDP port is opened for every MPEG-TS publishing session to accept client connection (for SRT only) and receive media traffic. Due to security reasons, since build 5.2.1299, the stream will be stopped on server if client stops publishing (like WebRTC one), and publisher can't connect and send traffic to the same port. All the stream viewers will receive STREAM_STATUS.FAILED in this case. A new REST API query should be used to renew the stream publishing, with the same name if necessary.

Publishers restriction by IP address

Since build 5.2.1314 it is possible to restrict client IP addresses whic are allowed to publish MPEG-TS stream using REST API /mpegts/startup query parameter

{
  "localStreamName":"mpegts-stream",
  "transport":"udp",
  "allowedList": [
    "192.168.0.100",
    "172.16.0.1/24"
  ]
}

The list may contain both exact IP adresses and address masks. If REST API query contains a such list, only the clients with IP addresses matching the list can publish the stream.

Known issues

1. When MPEG-TS stream publishing via UDP is stopped at server side via REST API query /mpegts/terminate , publishing encoder still sends media data

Symptoms: ffmpeg still sends data via UDP when MPEG-TS stream publishing is stopped on server

Solution: this is normal behaviour for UDP because the protocol itself provides no any methods to let publisher know the UDP port is already closed. Use SRT which handles the case correctly if possible.