Video playback. VoD/OTT

This section covers methods allowing to organize the playback of a Video On Demand (VOD) or Over The Top (OTT) stream.

The core idea of this module is to get a playlist and video segments of the required quality and length, regardless of what is the source stream. SRT, RTSP and all of the inputs declared in the technical specification are supported.

Creating a new player
Expand
POST
/api/vod/create

Creates a process that will play the stream from the specified input.

If necessary, the stream can be transcoded here without any additional calls to other modules.

Once successful connection to the incoming stream is established, it generates the address from where you can pick up the M3U8 or MPD playlist and its segments.

 

Publish RTSP stream:

ffmpeg -re -i "./videos/awesome-video.mp4" -f mpegts "rtsp://127.0.0.1/live.sdp"

Or publish SRT stream:

ffmpeg -re -i "./videos/awesome-video.mp4" -f mpegts "srt://127.0.0.1:1935/publisher/awesome-srt-server/srt-stream-01"

Play video on demand (as HLS):

ffplay -i "http://1.2.3.4/hls/622c93b366b14700326ff543/622c93b366b14700326ff543/index.m3u8"

Play video on demand (as MPEG-DASH) via HTTPS:

ffplay -i "https://1.2.3.4/hls/622c93b366b14700326ff543/622c93b366b14700326ff543/index.mpd"

 

Query parameters
vod_name
string | required | unique

Unique player name

input
object | required

Accepts an object with specified input parameters.

Depending on the input type, different parameters are passed:

 

1. When input is SRT Servers module from the Callaba Engine:

{ input_type: "INPUT_TYPE_SRT_SOFTWARE", input_server_id: Objectid, input_stream_id: "publisher/srt-server-name/srt-stream-01" }

Note:

Use INPUT_TYPE_SRT_HARDWARE, if you plan to get your stream from a hardware encoder. This will perform additional optimization
inside Callaba Engine. If your senders are mobile devices or computers, use INPUT_TYPE_SRT_SOFTWARE

 

2. When input is RTMP Servers module from Callaba Engine:

{ input_type: "INPUT_TYPE_RTMP_SOFTWARE" input_server_id: Objectid, input_stream_id: "publisher/srt-server-name/srt-stream-01" }

In this case, you pass in the ID of your RTMP server and the key of the stream you want to convert.

Note

Use INPUT_TYPE_RTMP_HARDWARE, if you plan get your stream from a hardware encoder. This will perform additional optimization inside Callaba Engine. If your senders are mobile devices or computers, use INPUT_TYPE_RTMP_SOFTWARE

In this case, you are passing in the id of your SRT server and the publisher's id of the stream you want to convert.

3. When input is received via port listening, without using other modules.

Possible input_type values:

INPUT_TYPE_SRT_LISTEN: listen on SRT port
INPUT_TYPE_RTMP_LISTEN: listen on RTMP port
INPUT_TYPE_RTSP_LISTEN: listen on RSTP port
INPUT_TYPE_UDP_LISTEN: listen on UDP port
INPUT_TYPE_HTTP_LISTEN: - listen on HTTP port


Example of the SRT listen request on port 2035 :

{ input_type: "INPUT_TYPE_SRT_URL" , input_stream_listen_port: { port: 2035, transport: "UDP" } }

For this type of input, you must explicitly specify the port you are listening and the type of transport you are using.
Optionally, you can also pass module_name and module_type for more flexible organization of your application.

For example, if you use the method for receiving all the inputs, you'd be able to see which of the processes you've made earlier occupies the server port.

This type of input accepts the following transport values :

For SRT, WEBRTC, RTP the transport value is UDP.
For all of the rest transport value is TCP.

 

4. When input is a URL, from where the stream is picked up for further conversion.

Possible input_type values:

INPUT_TYPE_SRT_URL: listen SRT address
INPUT_TYPE_RTMP_URL: listen RTMP address
INPUT_TYPE_RTSP_URL: listen RTSP address
INPUT_TYPE_UDP_URL: listen UDP address
INPUT_TYPE_HTTP_URL: listen HTTP address
INPUT_TYPE_OTHER: listen any address
INPUT_TYPE_HLS_URL: listen HLS address
INPUT_TYPE_MPEG_DASH_URL: listen MPEG-DASH address

For this type of input, specify the address where you want to receive video.

{ input_type: "INPUT_TYPE_SRT_URL", input_stream_url : "srt://1.2.3.4:8000" }

Additionally, you can control the protocol by adjusting its parameters.

For example:

{ input_stream_url : "srt://1.2.3.4:8000?rcvbuf=12036704" }

Controlling parameters is available for all protocols.

 

5. When you don't have video but need a test stream of video and audio

{ input_type: "INPUT_TYPE_GENERATE_TEST_VIDEO" } 

It generates a default test stream (1920 by 1080, 24, 6000Kbit/s) with a duration of 1 hour and 216 Hz sine wave audio.

If necessary, you can control the settings of the test video by passing parameters to the input object:

  • encoding_rate. Default value is 24 
  • sound_hz. Default value is 216
  • resolution_width. Default value is 1920
  • resolution_height. Default value is 1080
  • video_duration_sec. Default value is 3600
  • test_video_bitrate. Default value is 6000

Example:

{ input_type: "INPUT_TYPE_GENERATE_TEST_VIDEO", test_video_bitrate: 2500

vod_port
number | required | unique

Acceptable values are from 1 to 65535.

Since HLS or MPEG-DASH uses TCP as a transport, after creating a player on the specified port, the corresponding TCP port will be used.

To find out if a port is free, use the /api/ports/getAll method from the /api/ports section

initial_live_manifest_size
number | required | unique

This parameter specifies how many HLS fragments must be loaded before playing. For good HLS experience we recommend loading 3 fragments.

live_sync_duration_count
number | required | unique

Edge of live delay.  If set to 3, playback will start from fragment N-3, N being the last fragment of the live playlist. Decreasing this value is likely to cause playback stalls. For good HLS experience we recommend using 4 fragments

hls_fragment_size
number | required | unique

HLS fragment size. For good HLS experience we recommend using 3 seconds fragments.

Please make sure you have key frames at least every 2 seconds in your input video stream (or a close value) in your HLS fragment settings.

Use the transcoding to change GOP value if you cannot change this parameter in your input video stream

hls_fragment_length
number | required | unique

HLS fragments playlist length. For good HLS experience we recommend using 60 seconds.

dash_fragment_size
number | required | unique

DASH fragment size. For good DASH experience we recommend using 3 seconds fragments.

Please make sure you have key frames at least every 2 seconds in your input video stream or value near your DASH fragment settings.

Use the transcoding to change GOP value if you cannot change this parameter in your input video stream

dash_fragment_length
number | required | unique

DASH fragments playlist length. For good DASH experience we recommend using 60 seconds.

transcoding
object | required

Takes an object with transform settings:

Example:

{ video_transcoding: "libx265", output_video_bitrate: 4000 } 

Properties:

video_transcoding - controls output codec type. Possible values:

  • libx264 - convert to H.264 via CPU
  • libx265 - convert to H.265 via CPU
  • mpsoc_vcu_h264 - convert to H.264 via graphics accelerator card on Amazon Web Services (VT1 instances)
  • mpsoc_vcu_hevc - convert to HEVC via graphics accelerator card on Amazon Web Services (VT1 instances)

output_video_bitrate - controls output bitrate. The value is specified in kilobits.

force_key_frames - use this parameter if you need to cut your stream into smaller HLS fragments. For good the streaming experience we recommend inserting a key frame every 2 seconds

gop - Set this to 2x frame rate for a 2 second GOP

Frame width  - For example, 1920

Frame height  - For example, 1080

preset - controls codec preset settings. Possible values: Disabled, ultrafast, superfast, very fast, faster, fast, medium, slow, slower, veryslow

tune - controls the fine tuning of the codec, possible values: Disabled, film, animation, grain, stillimage, fastdecode, zerolatency.

crf - sets the constant video quality to be controlled. Possible values are from 0 to 51 where 0 is lossless and 51 is the worst possible.

pix_fmt - video pixel format. Possible values: Disable, yuv420p, yuvj420p, yuv422p, yuvj422p, yuv444p, yuvj444p, nv12, nv16, nv21, yuv420p10le, yuv444p10le, nv20le

filter_fps - allows you to change the number of frames per second, through a filter
after transcoding and before output.

audio_trancoding - allows to convert audio. Possible values: aac, mp3

output_audio_bitrate - sets the output bitrate, in kilobits, for example 320

sample_rate - sets the resampling rate, in hertz. For example 44100. We recommend using AAC, because some browsers still don't work well with MP3s

Additional settings for the graphics accelerator card:

  • slices. Valid values: 0 to 68 Slices are a fundamental part of the stream format. You can operate on slices in parallel to increase speed at which a stream is processed. However, operating on multiple “slices” of video at once will have a negative impact on video quality. This option must be used when encoding 4k streams to H.264 in order to sustain real-time performance. The maximum practical value for this option is 4 since there are 4 encoder cores in a device.
  • cores. Valid values: 0 to 4 The encoder plugin automatically determines how many encoder cores are needed to sustain real-time performance (e.g. 1 for 1080p60, 4 for 4K60). The -cores option can be used to manually specify how many encoder cores are to be used for a given job. When encoding file-based clips with a resolution of 1080p60 or lower, leveraging additional cores may increase performance. This option will provide diminishing returns when multiple streams are processed on the same device. This option has no impact on live streaming use-cases as a video stream cannot be processed faster than it is received.
active
boolean | optional

Controls the state of the process. Possible values are true or false. The default value is true.

Creating a new player
cURL
curl -X 'POST' \
'http://1.2.3.4/api/vod/create' \
-H 'accept: application/json' \
-H 'x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyMGJlYjA2MTM3YmIzMDAyYzhmNjAwYSIsImlhdCI6MTY0Njc0Njk4MiwiZXhwIjoxNjQ5MzM4OTgyfQ.qRphsD6OD8KYnRL5fUX8XEckp1XNCmZAYldWWnZbAxE' \
-H 'Content-Type: application/json' \
-d '{
"vod_name": "Awesome RTSP player",
"input": {
"input_type": "INPUT_TYPE_RTSP_URL",
"input_stream_url": "rtsp://127.0.0.1/live.sdp"
},
"vod_port": 10001,
"initial_live_manifest_size": 4,
"live_sync_duration_count": 4,
"hls_fragment_size": 3,
"hls_fragment_length": 60,
"dash_fragment_size": 3,
"dash_fragment_length": 60,
"active": true
}'
Response
id
ObjectId | unique

A unique identifier of the playback process. Is an object and looks similar to the hashed string. 

created
date

Returns the creation date of the playback process

Response: Creating a new player
JSON
{
"id": "622c93b366b14700326ff543",
"created": "2022-03-12T12:36:03.890Z"
}
Updating the player
Expand
POST
/api/vod/update

Use this method to change the player.

This method can take the same parameters as /api/vod/create method

 

Query parameters
id
ObjectId | required

id - identifier of the playback process to be changed.

Updating the player
cURL
curl -X 'POST' \
'http://1.2.3.4/api/vod/update' \
-H 'accept: application/json' \
-H 'x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyMGJlYjA2MTM3YmIzMDAyYzhmNjAwYSIsImlhdCI6MTY0Njc0Njk4MiwiZXhwIjoxNjQ5MzM4OTgyfQ.qRphsD6OD8KYnRL5fUX8XEckp1XNCmZAYldWWnZbAxE' \
-H 'Content-Type: application/json' \
-d '{
"id": "622c93b366b14700326ff543",
"vod_name": "Awesome RTSP player on 10002 port",
"input": {
"input_type": "INPUT_TYPE_RTSP_URL",
"input_stream_url": "rtsp://1.2.3.4/live.sdp"
},
"vod_port": 10002,
"initial_live_manifest_size": 4,
"live_sync_duration_count": 4,
"hls_fragment_size": 3,
"hls_fragment_length": 60,
"dash_fragment_size": 3,
"dash_fragment_length": 60,
"active": true
}'
Response
id
ObjectId

A unique identifier of the process

updated
date

Returns the date the process was last modified

success
boolean

Success result. Possible value: true or false.

Response: Updating the player
JSON
{
"success": true
}
Getting a list of the VoD/OTT players
Expand
POST
/api/vod/getAll

Use this method to get a list of the VoD/OTT players.

Query parameters
This method has no parameters
Getting a list of the VoD/OTT players
cURL
curl -X 'POST' \
'http://1.2.3.4/api/vod/getAll' \
-H 'accept: application/json' \
-H 'x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyMGJlYjA2MTM3YmIzMDAyYzhmNjAwYSIsImlhdCI6MTY0Njc0Njk4MiwiZXhwIjoxNjQ5MzM4OTgyfQ.qRphsD6OD8KYnRL5fUX8XEckp1XNCmZAYldWWnZbAxE' \
-d ''
Response
list of the playback processes
array

Returns an array of the playback processes

Response: Getting a list of the VoD/OTT players
JSON
[
{
"id": "622c93b366b14700326ff543",
"vod_name": "Awesome RTSP player on 10002 port",
"vod_port": 10002,
"initial_live_manifest_size": 4,
"live_sync_duration_count": 4,
"hls_fragment_size": 3,
"hls_fragment_length": 60,
"dash_fragment_size": 3,
"dash_fragment_length": 60,
"active": true,
"user_id": "620beb06137bb3002c8f600a",
"created": "2022-03-12T12:36:03.890Z",
"modified": "2022-03-12T13:18:50.212Z"
}
]
Getting the player info by ID
Expand
POST
/api/vod/getById

Use this method to get information about the player

Query parameters
id
ObjectId | required

id - identifier of the playback process

Getting the player info by ID
cURL
curl -X 'POST' \
'http://1.2.3.4/api/vod/getById' \
-H 'accept: application/json' \
-H 'x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyMGJlYjA2MTM3YmIzMDAyYzhmNjAwYSIsImlhdCI6MTY0Njc0Njk4MiwiZXhwIjoxNjQ5MzM4OTgyfQ.qRphsD6OD8KYnRL5fUX8XEckp1XNCmZAYldWWnZbAxE' \
-H 'Content-Type: application/json' \
-d '{
"id": "622c93b366b14700326ff543"
}'
Response
Object of process
object

Returns an object of the playback process

Response: Getting the player info by ID
JSON
{
"id": "62275f1bccaa650032da2b53",
"restream_name": "Awesome restream. Updated",
"restream_type": "RESTREAM_TYPE_SRT_TO_RTMP",
"active": true,
"created": "2022-03-08T13:50:19.650Z",
"modified": "2022-03-08T15:14:25.355Z"
}
Starting the playback
Expand
POST
/api/vod/start

Use this method to start the playback

Query parameters
This method has no parameters
Starting the playback
cURL
curl -X 'POST' \
'http://1.2.3.4/api/servers/start' \
-H 'accept: application/json' \
-H 'x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyMGJlYjA2MTM3YmIzMDAyYzhmNjAwYSIsImlhdCI6MTY0Njc0Njk4MiwiZXhwIjoxNjQ5MzM4OTgyfQ.qRphsD6OD8KYnRL5fUX8XEckp1XNCmZAYldWWnZbAxE' \
-H 'Content-Type: application/json' \
-d '{
"id": "622c93b366b14700326ff543"
}'
Response
success
boolean

Success result. Possible value: true or false.

Response: Starting the playback
JSON
{
"success": true
}
Stopping the playback
Expand
POST
/api/vod/stop

Use this method to stop the playback

Query parameters
This method has no parameters
Stopping the playback
cURL
curl -X 'POST' \
'http://1.2.3.4/api/servers/stop' \
-H 'accept: application/json' \
-H 'x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyMGJlYjA2MTM3YmIzMDAyYzhmNjAwYSIsImlhdCI6MTY0Njc0Njk4MiwiZXhwIjoxNjQ5MzM4OTgyfQ.qRphsD6OD8KYnRL5fUX8XEckp1XNCmZAYldWWnZbAxE' \
-H 'Content-Type: application/json' \
-d '{
"id": "622c93b366b14700326ff543"
}'
Response
success
boolean

Success result. Possible value: true or false.

Response: Stopping the playback
JSON
{
"success": true
}
Getting the playback statistics
Expand
POST
/api/vod/getStat

Use this method to get the statistics of the playback processes

Query parameters
This method has no parameters
Getting the playback statistics
cURL
curl -X 'POST' \
'http://1.2.3.4/api/vod/getStat' \
-H 'accept: application/json' \
-H 'x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyMGJlYjA2MTM3YmIzMDAyYzhmNjAwYSIsImlhdCI6MTY0Njc0Njk4MiwiZXhwIjoxNjQ5MzM4OTgyfQ.qRphsD6OD8KYnRL5fUX8XEckp1XNCmZAYldWWnZbAxE' \
-H 'Content-Type: application/json' \
-d ''
Response
bitrate
string

Current bitrate (kilobits)

Response: Getting the playback statistics
JSON
[
{
id: ObjectId,
bitrate: 6500
}
]
Removing the playback process
Expand
DELETE
/api/vod/remove

Use this method to remove the player.

Query parameters
This method has no parameters
Removing the playback process
cURL
curl -X 'DELETE' \
'http://1.2.3.4/api/vod/remove' \
-H 'accept: application/json' \
-H 'x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyMGJlYjA2MTM3YmIzMDAyYzhmNjAwYSIsImlhdCI6MTY0Njc0Njk4MiwiZXhwIjoxNjQ5MzM4OTgyfQ.qRphsD6OD8KYnRL5fUX8XEckp1XNCmZAYldWWnZbAxE' \
-H 'Content-Type: application/json' \
-d '{
"id": "62275f1bccaa650032da2b53"
}'
Response
success
boolean

Success result. Possible value: true or false.

Response: Removing the playback process
JSON
{
"success": true
}