# Basic Usage

## What does the program do?

The program takes one or more input files and, by default, writes them to a folder called `normalized`, using an `.mkv` container.

!!! tip "Need a different output container?"

    The reason for choosing the MKV container is that it can handle almost any codec combination without any additional configuration.

    You can choose another output file with `-o output.m4a` and the program will automatically pick a suitable codec for that container.

All audio streams will be normalized so that they have the same (perceived) volume according to the [EBU R128](https://tech.ebu.ch/docs/r/r128.pdf) standard. This is done by analyzing the audio streams and applying a filter to bring them to a target level. This ensures that multiple files normalized with this filter will have the same perceived loudness.

Under the hood, the `ffmpeg-normalize` program uses [ffmpeg's `loudnorm` filter](https://ffmpeg.org/ffmpeg-filters.html#loudnorm) to do this; the filter was [originally written by Kyle Swanson](https://k.ylo.ph/2016/04/04/loudnorm.html).

## How do I specify the input?

Just give the program one or more input files as arguments. It works with most media files, including video files:

```bash
ffmpeg-normalize input [input ...][-h][-o OUTPUT [OUTPUT ...]] [options]
```

A very simple normalization command looks like this:

```bash
ffmpeg-normalize input.mp3
```

This will create a file called `normalized/input.mkv` in the current directory, with EBU R128 normalization (target: -23 LUFS) using PCM audio.

### Customizing normalization and output format

You can customize the normalization and output format with various options. For example:

```bash
ffmpeg-normalize input.mp3 -c:a aac -b:a 192k
```

This uses the AAC codec at 192 kbps bitrate instead of PCM to keep file size manageable. It will still write to an MKV file.

To process multiple files, just list them all as input using wildcards (Linux):

```bash
ffmpeg-normalize *.mp3 -c:a libmp3lame -b:a 320k -ext mp3
```

This normalizes all MP3 files in the current directory, outputs as MP3 at 320 kbps.

## What codec is chosen?

ffmpeg-normalize picks the audio codec for you, based on the output container:

- For containers that can store uncompressed audio (such as WAV, MKV, or MOV), it uses **PCM** audio, matching the input bit depth. This is lossless, but produces large files.
- For containers that cannot store PCM (MP3, MP4/M4A, FLAC, Ogg, Opus, WebM), it uses the **same default codec that ffmpeg itself would pick for that container**, so you do not have to specify one. For example:

For more info, see [How the output audio codec is chosen](file-input-output.md#how-the-output-audio-codec-is-chosen).

## How do I specify the output file name or extension?

You don't have to specify an output file name (the default is `normalized/<input>.mkv`), but if you want to override it, you can specify one output file name for each input file with the `-o` option. In this case, the container format (e.g. `.wav`) will be inferred from the file name extension that you've given.

Example:

```bash
ffmpeg-normalize 1.wav 2.wav -o 1-normalized.wav 2-normalized.wav
```

Using the `-ext` option, you can supply a different output extension common to all output files, e.g. `-ext m4a`. Example:

```bash
ffmpeg-normalize input.mp3 -c:a aac -ext m4a
```

This will create a file called `normalized/input.m4a`.

!!! warning

    You need to make sure that the container supports the codecs used for the output. For example, you cannot place AAC audio in a WAV container.

## What will get normalized?

By default, all streams from the input file will be written to the output file. For example, if your input is a video with two language tracks and a subtitle track, both audio tracks will be normalized independently. Any video and subtitle tracks will be copied over to the output file.

You additionally have several options for controlling which audio streams get normalized. By default, all audio streams are normalized:

```bash
ffmpeg-normalize input.mkv
```

Use `-as/--audio-streams` to select specific streams by their index (comma-separated):

```bash
# Normalize only stream 1
ffmpeg-normalize input.mkv -as 1

# Normalize streams 1 and 2
ffmpeg-normalize input.mkv -as 1,2
```

!!! tip

    You can use `ffmpeg -i input.mkv` to see all streams and their indices before normalizing.

Use `--audio-default-only` to normalize only streams marked with the "default" disposition (useful for files with multiple language tracks where you only want to normalize the main track):

```bash
ffmpeg-normalize input.mkv --audio-default-only
```

By default, if you select specific streams, only those streams will be in the output. Use `--keep-other-audio` to copy all other audio streams unchanged:

```bash
# Normalize stream 1, keep all other audio streams as-is
ffmpeg-normalize input.mkv -as 1 --keep-other-audio
```

## More information

For the complete list of options, run `ffmpeg-normalize -h` or read the [detailed options page](cli-options.md).
You can also find more examples in the following sections of this documentation.
