About the RTMP IO plugin

The RTMP plugin provides a standard client implementation of the RTMP protocol. It is used to provide RTMP input and output to videostitch softwares with a choice of 3 different encoders: libx264, QSV, NVENC.

The plugin implements a client with pull behavior when it is configured for input, and push behavior when configured for output. In all cases, an RTMP server is needed.

It is tested with the following servers: NGINX, WOWZA, MIST, AKAMAI.

RTMP protocol specification: https://www.adobe.com/content/dam/Adobe/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf

FLV/F4V format specification: http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf

The plugin provides support for pushing RTMP to a compatible server (Nginx, Wowza, Akamai, ...). RTMP pull (when the server request the connection) is not supported

RTMP Input configuration

"reader_config": {
    "name": "rtmp://127.0.0.1:1935/inputs/0_0",
    "type": "rtmp",
	"frame_rate": {
	    "den": 1,
	    "num": 30
	},
	"audio_samplerate" : 48000,
    "audio_channels" : 2,
    "audio_sample_depth" : "s16"
}
name

type : string default : required notes : rtmp://SERVER_IP:PORT/APP/STREAMKEY RTMP authentication is not supported (untested).

frame_rate

notes : required. den & num properties are used to specify input framerate such as framerate = num / den VFR (variable framerate) is not supported (untested).

frame_rate.den

type : int default : ?

frame_rate.num

type : int default : ?

audio_samplerate :

type : int default : - optional notes : 44100 or 48000

audio_channels

type : int default : - optional Notes : 1 (mono) or 2 (stereo)

audio_sample_depth

type : string default : - optional notes : "flt", "s16" or "s32". Specifies the expected audio sample format/depth from the RTMP input. Note that it is converted to "s16" for internal processing if not already in that format.

RTMP Output configuration

{
 	// RTMP protocol settings
 	"type": "rtmp",
	"filename": "rtmp://127.0.0.1:1935/live/output",
    "downsampling_factor": 1,
    "pub_user" : "yourusername",
    "pub_enc_passwd" : "2Njux57MZPgCc6H7S1RcTg==\n",

	// video encoder settings depend on the selected encoder
	"video_codec" : "x264",
	...

	// audio encoder settings
	"audio_codec": "aac",
    ...

}

RTMP output settings

filename

type : string default : required notes : (to be confirmed) the URL pattern for publishing rtmp://SERVER_IP:PORT/APP/STREAMKEY?username=%USER%:password=%PASSWORD%

pub_user

type : string default : optional notes : username for connecting to a secured RTMP server. Generated by VahanaVR when configuring RTMP with user/password.

pub_enc_passwd

type : string default : optional notes : encripted password to connect to a secured RTMP server. Generated & encripted by VahanaVR when configuring RTMP with user/password.

downsampling_factor

type : int default : 1 notes : downsamples the stitcher output by the given factor. eg.: pano size of 3840x1920 with downsampling_factor of 2 will encode a 1920x960 video.

bitrate_min

type : int default : -1 notes : If output bitrate is higher than available network bandwidth and dynamic bitrate control supported by the video encoder the bitrate will be automatically adjusted down to bitrate_min to avoid dropping packets (when output queue is full)

AUDIO Encoding

Note that the f4v format specification which we use as reference for supported values: http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf

In our implementation (using lame) please note that mp3 only supports 44100 Hz sampling rate: lameEncode

AAC codec sampling rate : 48000 Hz sample format : s16 | s32 | flt channel layout : mono | stereo

MP3 codec sampling rate : 44100 Hz sample format : s16 | s32 | flt channel layout : mono | stereo

Sample configuration
{
    "type": "rtmp"
...
    "audio_bitrate": 128,
    "audio_codec": "aac",
    "channel_layout": "stereo",
    "sample_format": "s16",
    "sampling_rate": 44100
...
}
audio_codec

type : string default : ? notes : "aac" or "mp3"

audio_bitrate

type : int default : ? notes :

channel_layout

type : string default : ? notes : "stereo" or "mono"

sampling_rate

type : int default : ? notes : 41000 / 48000

sample_format

type : string default : ? notes : "fltp", "s16" or "s32". According to the f4v format specifications, the

VIDEO Encoding

The only supported video encoding is H264. A choice of 3 encoders is provided :

libx264 encoder

This is the encoder for RTMP output used by VahanaVR by default. It runs on CPU on all plateform and does not involve specific HW dependencies.

Sample configuration
{
	"type" : "rtmp",
	"video_codec" : "x264",
	"tune" : "",
	"profile" : "baseline",
	"level" : "4.2",
	"filename" : "rtmp://localhost:1935/live/stream",
	"bitrate_mode" : "VBR",
	"quality_balance" : 5,
	"b_frames" : 2,
	"bitrate" : 8001,
	"cbr_padding" : false,
	"target_usage" : 4,
	"gop" : -1,
}
bitrate

type : int default : 2000 notes : target bitrate, in ??

bitrate_mode

type : ** default : ** notes :

buffer_size

type : ** default : ** notes :

cbr_padding

type : ** default : ** notes :

preset

type : ** default : ** notes :

tune

type : ** default : ** notes :

profile

type : ** default : ** notes :

level

type : ** default : ** notes :

quality_balance

type : ** default : ** notes :

gop

type : ** default : ** notes :

b_frames

type : ** default : ** notes :

Intel Quicksync encoder

The QSV encoder works on Intel processors, provided that the Intel Quicksync video engine is available. It leverages Intel GPU to provide HW accelerated H264 video encoding.

Sample configuration
{
    "type": "rtmp"
...
    "video_codec": "qsv",
    "bitrate": 4000,
    "target_usage": 5,
    "num_slice": 0,
    "gop": 30,
    "level": "5.1",
    "profile": "baseline",
    "bitrate_mode": "CBR",
...
}
bitrate

type : int default : 4000 notes : target bitrate, in kbps

bitrate_mode

type : string default : CBR notes : bit rate control mode (for compatibility with libx264) cqp, cbr, vbr (upper or lower case).

target_usage

type : int default : 4 notes : trade-off between quality and speed, from 1 (quality) to 7 (fastest)

num_slice

type : int default : 0 notes : Number of slices in each video frame. If num_slice=0 , the encoder may choose any slice partitioning allowed by the codec standard.

profile

type : string default : baseline notes : H264 profile, baseline | main | extended | high | constrained_baseline | constrained_high | progressive_high Specified values will be ignored if the resolution & fps do not fit in the requested profile.

level

type : int default : 3.1 notes : Any of the H264 standard levels. Specified values will be ignored if the resolution & fps do not fit in the requested level.

gop

type : int default : 250 notes : The target GOP size. Unknown range (0~250 ?). It is unknown wether scenecut detection can overide this or wether automatic GOP size is possible (eeg. w/ gop=0 as in libx264 encoder). All I-Frames are IDR-Frames.

memtype

type : string default : d3d11 notes : This parameter is hardcoded. Any value here will be ignored.

NVENC encoder

The NVENC encoder works on Nvidia GPU processors, provided that the Nvidia video engine is available. It leverages Nvidia GPU to provide HW accelerated H264 video encoding.

Sample configuration
{
    "type": "rtmp"
...
    "video_codec": "h264_nvenc",
    "bitrate": 4000,
    "preset" : "slow",
    "profile": "baseline",
    "bitrate_mode": "CBR",
    "gop": 30,
    "vbvMaxBitrate" : 4000,
    "buffer_size" : 600,
...
}
bitrate

type : int default : 5000 notes : target bitrate, in kbps

preset

type : string default : default notes : trade-off between quality and speed : slow/hq, fast/hp, bd, ll, llhp, llhq, lossless, losslesshp, medium/default.

profile

type : string default : baseline notes : H264 profile, baseline | main | high | constrained_high | high444 | stereo Specified values will be ignored if the resolution & fps do not fit in the requested profile.

bitrate_mode

type : string default : cqp notes : bit rate control mode (for compatibility with libx264) cqp, cbr, vbr, vbr_minqp (upper or lower case). It is overriden by rcmode if used

rcmode

type : int default : 0 notes : bit rate control mode 0(CQP), 1(VBR), 2(CBR), 4(VBR_MINQP), 8(2_PASS_QUALITY), 16(2_PASS_FRAMESIZE), 32(2_PASS_VBR)

gop

type : int default : 250 notes : The target GOP size. Unknown range (0~250 ?). It is unknown wether scenecut detection can overide this or wether automatic GOP size is possible (eeg. w/ gop=0 as in libx264 encoder). All I-Frames are IDR-Frames.

vbvMaxBitrate

type : int default : 0 notes : Video Buffering Verifier maximum bitrate, in kbps

buffer_size

type : int default : 0 notes : Video Buffering Verifier maximum buffer size, in kb

qp

type : int default : 28 notes : quantization parameter, QP, that ranges from 0 to 51

b_frames

type : int default : 0 notes : number of B frames between two P frames

video_codec

type : string default : 0 notes : video codec "h264_nvenc", "hevc_nvenc"