Introducing per title encoding

Chunkify uses per title encoding to predict quality and bitrate settings for each chunk of your video.

Optimize each chunk for its content

A video can move from a static shot to fast action in a few seconds. Those sections have different encoding needs.

You choose the output codec and resolution. For MP4 and WebM, Chunkify analyzes each chunk's visual complexity and predicts its CRF, the quality setting used by the encoder, along with bitrate bounds. HLS uses a predicted average video bitrate.

We trained our prediction models on 100,000 videos spanning 14 content categories. Each chunk is analyzed independently, so the predictions adapt as the content changes within a video. A simple section can use less bitrate, while a more detailed or fast-moving section can receive more.

Output Supported codecs
MP4 H.264, H.265, AV1
WebM VP9
HLS H.264, H.265, AV1

Enable per title encoding

In the app, Per-title optimization is enabled by default for supported video formats. Turn it off under Video quality when you need manual CRF or bitrate settings.

Video quality settings with Per-title optimization enabled

With the TypeScript SDK, set format.per_title to true. This creates an H.264 MP4 at 1080p:

import Chunkify from '@chunkify/chunkify';

const client = new Chunkify({
  projectAccessToken: process.env.CHUNKIFY_TOKEN,
});

const job = await client.jobs.create({
  source_id: 'src_example',
  format: {
    id: 'mp4_h264',
    height: 1080,
    per_title: true,
  },
});

API requests keep per-title disabled when the field is omitted or false, so existing manual configurations continue to work. Job responses report whether it was enabled in format.per_title.

When per-title is enabled, omit crf, video_bitrate, minrate, maxrate, and bufsize. Chunkify selects those video settings; you can still set audio_bitrate.

Choose your HLS resolutions

Using the same client, create an HLS rendition with your chosen codec and resolution. Chunkify predicts the video bitrate:

const hlsJob = await client.jobs.create({
  source_id: 'src_example',
  format: {
    id: 'hls_h264',
    height: 720,
    audio_bitrate: 128000,
    per_title: true,
  },
});

This creates one 720p rendition. To build a multivariant HLS stream, create a job for each resolution and group them with the same hls_manifest_id. Per-title selects the video bitrate for each rendition; you choose the resolution ladder.

Processing time and billing

Analyzing each chunk adds processing time, which counts toward billable compute. The overhead varies with the source and output settings. Keep optimization off when you need fixed rate-control settings or want to avoid the additional analysis.

Read the per-title encoding guide for more on how optimization works and how to configure it.