# 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](src/lameEncoder.cpp#L38) **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"