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"