Per-Title Encoding Overview

Comparing Standard vs Per-Title Encoding Bitrate Ladders

A regular encoding simply follows the rules you define in its codec-, stream-, and muxing configurations. A Per-Title Encoding in comparison not only uses the given configuration but evaluates the asset itself. Based on that evaluation data, the Per-Title algorithm adjusts the parameters width, height, and bitrate. The algorithm optimizes the bitrate ladder to increase quality while reducing the required bandwidth to deliver it. The below graphic compares the so-called Convex Hull (basically an envelope of the regions where certain resolution/bitrate combinations work best) of a standard (non-dynamic) and the Per-Title bitrate ladder.

Fig.1 - Comparison between Per-Title and Standard Profile in terms of Quality and Bitrate

As you can see, the Per-Title Profile is able to achieve a much better quality by using lower bitrates in the human perceptual range (roughly between 35dB and 45dB). Furthermore, it removes the resolution/bitrate tuples above 45dB, which do not lead to a visual quality improvement anymore.

📘

Try it yourself!

If you don't have an Bitmovin Account yet, simply sign up for a trial and use our Per-Title Benchmark Tool for free as part of the trial of your account. The tool will compare an encoding processed with your static ladder against the one derived automatically by the Per-Title algorithm.

Create a Per-Title Encoding

The most simple use-case is when the Per-Title algorithm decides to achieve the best possible outcome with regards to bandwidth savings and quality improvements.

Instead of adding multiple Streams to an Encoding resource, you add just one Stream with mode set to PER_TITLE_TEMPLATE and using a plain Video Codec Configuration. This Stream, its Codec Configuration, as well as all Muxings that are using it, will be taken as a template by the Per-Title algorithm to create a "Per-Title profile". The Per-Title algorithm will then add additional Streams to this "Per-Title profile" based on the PER_TITLE_TEMPLATE Stream. These additional Streams will be of the mode PER_TITLE_RESULT.

metadata:
  type: VOD
  name: Simple Per-Title example

# use a plain video codec configuration
configurations:
  video:
    h264:
      per-title:
        properties:
          name: Basic Per-Title h264 config
          profile: MAIN

encodings:
  main-encoding:
    properties:
      name: Simple Per-Title example

    # define a PER_TITLE_TEMPLATE Stream used to create a "Per-Title profile"
    streams:
      per-title:
        properties:
          name: Per-Title template stream
          inputStreams:
            - inputId: "{{your input id}}"
              inputPath: "{{your input path}}"
          codecConfigId: $/configurations/video/h264/per-title
          mode: PER_TITLE_TEMPLATE

    # use the PER_TITLE_TEMPLATE Stream for a muxing
    muxings:
      fmp4:
        per-title:
          properties:
            name: Per-Title muxing
            segmentLength: 4
            streamConditionsMode: DROP_MUXING
            streams:
              - streamId: $/encodings/main-encoding/streams/per-title
            outputs:
              - outputId: "{{outputId}}"
                # outputPath can contain these placeholders:
                # {uuid}, {bitrate}, {width}, {height}
                outputPath: "per-title/{width}_{bitrate}_{uuid}/"
                acl:
                  - permission: PRIVATE
    
    # make sure to enable Per-Title and autoRepresentations for your codec
    start:
      properties:
        perTitle:
          h264Configuration:
            autoRepresentations: {}
        

We also offer SDK examples using Per-Title Encoding.

Per-Title Configuration

The fully automated, default Per-Title algorithm works well for most use cases. However, you may need to customize it in certain situations.

Common Customization Scenarios

You should consider customizing the Per-Title algorithm when you need to:

  • Control the bitrate selection range
  • Adjust the step size between each representation
  • Meet specific technical requirements that the default settings don't address

How to Customize

You can customize the per title algorithm configuration for each codec you're using. This gives you fine-grained control over how the algorithm behaves for your specific needs.

Frequently Asked Questions for Per-Title

Our template based approach enables great flexibility and helps you cover your use-case best, e.g.: satisfy DRM requirements, target dedicated playout platforms, and many more. Besides the required minimal and maximal resolution (you don’t really need/want a 4k resolution if you target an audience mainly using mobiles) other boundaries in context of bitrate and frame-rate, as well as encoding parameters can be specified as well.

Specifying Required Resolutions for Per-Title Encoding

Add PER_TITLE_TEMPLATE Streams for every possible resolution that you want to support. The codec configuration needs to contain at least the height, or the width in that case. If only one of the both resolutions is specified the aspect ratio will be kept.

Add one or more muxings to the PER_TITLE_TEMPLATE Stream, e.g., MP4 muxing if you want to have single progressive MP4 files as output, or segmented fMP4 muxing for DASH/HLS. Also define an output path with the supported placeholders to make it unique: {uuid}, {bitrate}, {width}, {height}. We always encourage to make {uuid} part of the output path to ensure it will be unique: e.g., /video/{bitrate}_{uuid}.

In the start call of the encoding you can find a Per-Title configuration object and inside this object a configuration per codec, e.g., h264Configuration. You do not need to configure anything specific here if you want the default values to apply. That’s it! Start your encoding in this configuration and the Per-Title algorithm will generate an optimal bitrate ladder using the resolutions you have defined for your asset. Please note that the algorithm might decide to not use a specific resolution if it does not make sense for a specific asset.

Supported Output Formats

Per-Title encodings work with GCS, S3, Generic S3, Akamai NetStorage or Azure Blob output.

You can check our release notes to see the latest updates.

Using Per-Title Encodings with DRM Solutions

The DRM use-case works in exact the same way as with a normal encoding.

You just need to add the DRM configuration to the Muxing of the PER_TITLE_TEMPLATE Streams in the same way as you would do it for a normal encoding configuration. One thing to watch out for is, when using different encryption keys for SD, HD and UHD content. There are two things to consider:

  1. If you use the autoRepresentations feature, make sure to have one PER_TITLE_TEMPLATE Stream with a configured resolution close to each category where you want to use a different encryption key: e.g., for SD use a width of 640.
  2. Make sure to add the DRM configuration with the encryption key you want to use for that category. If you are not using autoRepresentations, just configure the DRM configuration on every PER_TITLE_TEMPLATE Stream with the encryption key you want to use for that representation.

Using Per-Title Encoding with Server-Side Ad Insertion (SSAI)

SSAI providers are usually encoding the ads to a predefined set of resolutions and bitrates which is quite static. Changes in resolution are problematic, changes in bitrate not so much. That is why you can just configure the Per-Title encoding to restrict the possible resolutions to a set that is provided by the SSAI provider. The configuration works in the same way as configuring required resolutions for your Per-Title encoding.