View Source Membrane.ABRTranscoder (Membrane ABR Transcoder plugin v0.1.0)

Adaptive bit rate transcoder.

ABR Ladder

The element works as an ABR ladder, meaning that given a source stream it scales it to lower resolutions (with potentially halved framerate) which is desired by ABR protocols such as HLS to serve lower resolution streams to clients with worse network conditions.

A single ABR ladder works in the following way:

  • decode the source stream
  • perform multiple scaling operations
  • optionally reduce the framerate
  • encode each scaled stream separately

Hardware acceleration

Decoding/encoding/scaling operations combined are very computational demanding and it is hard to perform them in real-time (with a speed equal or higher to the pace of incoming source stream).

Even if we could achieve real-time performance with a regular CPU the server would not be able to handle many of such workflows.

To keep a decent performance (streams per server) we need to use hardware that is better suited than a regular CPU which leaves us with either GPUs or other specialized accelerated hardware (e.g. Xilinx U30 cards).

Element options

Passed via struct Membrane.ABRTranscoder.t/0

  • backend

    module() | struct()

    Required
    Module or struct representing a transcoder backend and its configuration that should be used for initialization.

    The available backends are Membrane.ABRTranscoder.Backends.Nvidia and Membrane.ABRTranscoder.Backends.U30.

  • min_inter_frame_delay

    Membrane.Time.t()

    Default value: 250 ms
    If delay between input frames is bigger than this value, the transcoder won't reduce the framerate on the outputs with framerate: :half.

  • telemetry_callbacks

    %{
      on_successful_init: (-> term()),
      on_frame_process_start: (-> term()),
      on_frame_process_end: (-> term())
    }

    Default value: %{}
    Callbacks called on particular transcoder events.

Pads

:input

Accepted formats:

%H264{alignment: :au, stream_structure: :annexb}
Direction::input
Availability::always
Flow control::auto

:output

Accepted formats:

%H264{alignment: :au, stream_structure: :annexb}
Direction::output
Availability::on_request
Flow control::auto

Pad options:

  • width

    pos_integer() | nil

    Default value: nil
    Width of the output video. Preserves the input width by default.

  • height

    pos_integer() | nil

    Default value: nil
    Height of the output video. Preserves the input height by default.

  • framerate

    :full | :half

    Default value: :full
    Output framerate - full preserves the input framerate, half reduces it twice.

  • bitrate

    pos_integer() | nil

    Default value: nil
    When set, the encoder tries to output the stream with specified bitrate.

Summary

Types

Options for pad :output

t()

Struct containing options for Membrane.ABRTranscoder

Functions

Returns description of options available for this module

Types

@type output_pad_opts() :: [
  width: pos_integer() | nil,
  height: pos_integer() | nil,
  framerate: :full | :half,
  bitrate: pos_integer() | nil
]

Options for pad :output

@type t() :: %Membrane.ABRTranscoder{
  backend: module() | struct(),
  min_inter_frame_delay: Membrane.Time.t(),
  telemetry_callbacks: %{
    on_successful_init: (-> term()),
    on_frame_process_start: (-> term()),
    on_frame_process_end: (-> term())
  }
}

Struct containing options for Membrane.ABRTranscoder

Functions

@spec options() :: keyword()

Returns description of options available for this module