...
Overview
Since build 5.2.841 it it is possible to iject inject one stream published on server into another. This feature can be used, for example, to add advertising material into a stream. The original stream content will be fully replaced by injected stream one until injected stream is stopped or injection is terminated.
...
5. Cyclic injection is not supported. It is not possible to inject stream1 into stream2 and then stream2 into stream1 without terminating the previous injection.
Injection implementation in builds before 5.2.1618
Injection management using REST API
REST query must be HTTP/HTTPS POST request as follows:
...
- test.flashphoner.com - WCS server address
- 8081 - standard REST / HTTP port of WCS server
- 8444 - standard HTTPS port
- rest-api - mandatory URL part
- /stream/inject/startup - REST method used
REST queries and responses
REST query | REST query body example | REST response example | Response states | Description | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
/stream/inject/startup |
| 200 - OK 400 - Bad request 404 - Not found 409 - Conflict 500 - Internal error | Inject stream2 into stream1 | ||||||||
/stream/inject/find_all |
| 200 - OK 404 - Not found | Find all injections on the server | ||||||||
/stream/inject/terminate |
| 200 - OK 400 - Bad request 404 - Not found 500 - Internal error | Stop injection into stream1 |
Parameters
Name | Description | Example |
---|---|---|
localStreamName | Stream name to inject to | stream1 |
remoteStreamName | Stream name to be injected | stream2 |
Injecting a VOD stream from file
Since build 5.2.1535 VOD stream directly from a file may be injected while sending the REST query /stream/inject/startup:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"localStreamName":"host",
"remoteStreamName":"vod-live://advertising.mp4"
} |
In this case, injected file will play without a delay from the first key frame. The file can be injected to another stream, in this case the file also will be played from the beginning in that stream.
This feature is useful, for example, to inject advertising video into a stream being viewed.
Configuration
Since build 5.2.1235 the parameter is added to set a time interval to wait for a keyframe in injected stream
Code Block | ||
---|---|---|
| ||
inject_wait_keyframe_ms=1000 |
By default, the interval is 1000 milliseconds. If no keyframes arrived in injected stream during this time, server will generate a black picture (by default) or apicture from a file set by custom_watermark_filename
parameter. This behaviour may be switched off by the following parameter
Code Block | ||
---|---|---|
| ||
inject_wait_keyframe_ms=-1 |
In this case, the stream to be injected to will be played until keyframe arrives in the injected stream.
Injection implementation in build 5.2.1618 and newer
Configuration
Since build 5.2.1618 a new injector implementation is added allowing to choose what exactly to inject: audio, video or both. The feature may be enabled by the following parameter
Code Block | ||
---|---|---|
| ||
use_new_injector=true |
REST API
REST query must be HTTP/HTTPS POST request as follows:
HTTP: http://test.flashphoner.com:8081/rest-api/stream/inject2/startup
- HTTPS: https://test.flashphoner.com:8444/rest-api/stream/inject2/startup
Where:
- test.flashphoner.com - WCS server address
- 8081 - standard REST / HTTP port of WCS server
- 8444 - standard HTTPS port
- rest-api - mandatory URL part
- /stream/inject2/startup - REST method used
REST queries and responses
REST query | Request body | Response body | Response state | Description | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
/stream/inject2/startup |
| 200 - OK 400 - Bad request 404 - Not found 409 - Conflict 500 - Internal error | Inject test2 stream into test stream | ||||||||
/stream/inject2/find_all |
| 200 - OK 404 - Not found | Find all injections on the server | ||||||||
/stream/inject2/terminate |
| 200 - OK 400 - Bad request 404 - Not found 500 - Internal error | Stop injection into test stream |
Parameters
Parameter | Description | Example |
---|---|---|
localStreamName | Stream name to inject to | test |
remoteStreamName | Stream name to be injected | test2 |
video | Replace video when injecting | true |
audio | Replace audio when injecting | true |
muteIfAbsent | Replace a track which is absent in a source stream to black picture or silence | true |
videoInjectorInfo | Video information from injected stream | { "targetStreamName": "test2", "rootStreamName": "test2", "startTime": 1683344295099 } |
audioInjectorInfo | Audio information from injected stream | { "targetStreamName": "test2", "rootStreamName": "test2", "startTime": 1683344295056 } |
Injecting a VOD stream from file
Since build 5.2.1719 VOD stream directly from a file may be injected while sending the REST query /stream/inject2/startup:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"localStreamName":"host",
"remoteStreamName":"vod-live://advertising.mp4",
"video":true,
"audio":true
} |
In this case, injected file will play without a delay from the first key frame. The file can be injected to another stream, in this case the file also will be played from the beginning in that stream.
This feature is useful, for example, to inject advertising video into a stream being viewed.
Quick testing
1. For test we use
...
7. Original test stream content is playing again
Known issues
1. Video and audio may be out of sync after stopping injection of one RTMP stream into another
Symptoms: When one RTMP stream is injected into another, the original RTMP stream may play with a strong audio/video unsync after injected stream stops
Solution: enable RTMP incoming streams bufferization
Code Block | ||
---|---|---|
| ||
rtmp_in_buffer_enabled=true |