> ## Documentation Index
> This page is part of the Image and Video APIs product. Fetch the complete documentation index for Image and Video APIs at: https://cloudinary.com/documentation/llms-image-and-video-apis.txt?referrer=docpage and then use it to discover all relevant pages before exploring further.
> If your task extends beyond this product, fetch the top-level index covering all Cloudinary products and topics at: https://cloudinary.com/documentation/llms.txt?referrer=docpage

# Audio transformations


You can stream audio from any audio or video file in your product environment, adjust audio settings, or generate audio waveform images from any audio or video file. 

> **INFO**: **Audio files use the `video` asset type**, not `raw`. This is because audio files are essentially video files without a visual element, and they support many of the same transformations. When uploading or referencing audio files via the API, use `resource_type: "video"`.


## Audio transformation and streaming

You can upload any audio file to your product environment, convert the audio file format, extract audio from videos and transform them on delivery. Audio files are uploaded to Cloudinary as a `video` asset type (`resource_type: "video"` in the API). For details, see [Uploading videos](upload_parameters#uploading_videos). 

Video files can be converted to audio files by setting the file format (or extension) to one of the [supported audio formats](#supported_audio_formats). For example, to convert the MP4 video file named `dog` to an MP3 audio file:
![dog.mp4 converted to dog.mp3](https://res.cloudinary.com/demo/video/upload/dog.mp3)

```nodejs
cloudinary.url("dog.mp3", {resource_type: "video"})
```

```react
new CloudinaryVideo("dog.mp3");
```

```vue
new CloudinaryVideo("dog.mp3");
```

```angular
new CloudinaryVideo("dog.mp3");
```

```js
new CloudinaryVideo("dog.mp3");
```

```python
cloudinary.utils.cloudinary_url("dog.mp3", resource_type="video")
```

```php
(new VideoTag('dog.mp3'));
```

```java
cloudinary.url().transformation(new Transformation().resourceType("video").generate("dog.mp3")
```

```ruby
cloudinary_url("dog.mp3", resource_type: "video")
```

```csharp
cloudinary.Api.UrlVideoUp.BuildUrl("dog.mp3")
```

```dart
cloudinary.video('dog.mp3').transformation(Transformation());
```

```swift
cloudinary.createUrl().setResourceType("video").generate("dog.mp3")
```

```android
MediaManager.get().url().transformation(new Transformation().resourceType("video").generate("dog.mp3");
```

```flutter
cloudinary.video('dog.mp3').transformation(Transformation());
```

```kotlin
cloudinary.video {
	publicId("dog.mp3") 
}.generate()
```

```jquery
$.cloudinary.url("dog.mp3", {resource_type: "video"})
```

```react_native
new CloudinaryVideo("dog.mp3");
```

Relevant video transformations apply for audio as well (e.g., [bitrate](video_optimization#bitrate_control) and [trimming](video_trimming#trimming_videos)), but dimensional or visual related transformations are ignored.

For example, you can trim an audio file to 3 seconds, starting from second 2.0, use the mp3 codec, and set a maximum bitrate of 44 kbps:

![Music played with maximum 500 kbps bitrate](https://res.cloudinary.com/demo/video/upload/du_3.0,so_2.0/ac_mp3,br_44k/docs/firefly-tune.mp3 "muted:false")

```nodejs
cloudinary.url("docs/firefly-tune.mp3", {resource_type: "video", transformation: [
  {duration: "3.0", start_offset: "2.0"},
  {audio_codec: "mp3", bit_rate: "44k"}
  ]})
```

```react
import { trim } from "@cloudinary/url-gen/actions/videoEdit";
import { audioCodec, bitRate } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/firefly-tune.mp3")
  .videoEdit(trim().startOffset("2.0").duration("3.0"))
  .transcode(audioCodec("mp3"))
  .transcode(bitRate("44k"));
```

```vue
import { trim } from "@cloudinary/url-gen/actions/videoEdit";
import { audioCodec, bitRate } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/firefly-tune.mp3")
  .videoEdit(trim().startOffset("2.0").duration("3.0"))
  .transcode(audioCodec("mp3"))
  .transcode(bitRate("44k"));
```

```angular
import { trim } from "@cloudinary/url-gen/actions/videoEdit";
import { audioCodec, bitRate } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/firefly-tune.mp3")
  .videoEdit(trim().startOffset("2.0").duration("3.0"))
  .transcode(audioCodec("mp3"))
  .transcode(bitRate("44k"));
```

```js
import { trim } from "@cloudinary/url-gen/actions/videoEdit";
import { audioCodec, bitRate } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/firefly-tune.mp3")
  .videoEdit(trim().startOffset("2.0").duration("3.0"))
  .transcode(audioCodec("mp3"))
  .transcode(bitRate("44k"));
```

```python
cloudinary.utils.cloudinary_url("docs/firefly-tune.mp3", resource_type="video", transformation=[
  {'duration': "3.0", 'start_offset': "2.0"},
  {'audio_codec': "mp3", 'bit_rate': "44k"}
  ])
```

```php
use Cloudinary\Transformation\VideoEdit;
use Cloudinary\Transformation\Transcode;
use Cloudinary\Transformation\AudioCodec;

(new VideoTag('docs/firefly-tune.mp3'))
	->videoEdit(VideoEdit::trim()->startOffset(2.0)
->duration(3.0))
	->transcode(Transcode::audioCodec(
	AudioCodec::mp3()))
	->transcode(Transcode::bitRate("44k"));
```

```java
cloudinary.url().transformation(new Transformation()
  .duration("3.0").startOffset("2.0").chain()
  .audioCodec("mp3").bitRate("44k")).resourceType("video").generate("docs/firefly-tune.mp3")
```

```ruby
cloudinary_url("docs/firefly-tune.mp3", resource_type: "video", transformation: [
  {duration: "3.0", start_offset: "2.0"},
  {audio_codec: "mp3", bit_rate: "44k"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Duration("3.0").StartOffset("2.0").Chain()
  .AudioCodec("mp3").BitRate("44k")).BuildUrl("docs/firefly-tune.mp3")
```

```dart
cloudinary.video('docs/firefly-tune.mp3').transformation(Transformation()
	.videoEdit(VideoEdit.trim().startOffset('2.0')
.duration('3.0'))
	.transcode(Transcode.audioCodec(
	AudioCodec.mp3()))
	.transcode(Transcode.bitRate("44k")));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setDuration("3.0").setStartOffset("2.0").chain()
  .setAudioCodec("mp3").setBitRate("44k")).generate("docs/firefly-tune.mp3")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .duration("3.0").startOffset("2.0").chain()
  .audioCodec("mp3").bitRate("44k")).resourceType("video").generate("docs/firefly-tune.mp3");
```

```flutter
cloudinary.video('docs/firefly-tune.mp3').transformation(Transformation()
	.videoEdit(VideoEdit.trim().startOffset('2.0')
.duration('3.0'))
	.transcode(Transcode.audioCodec(
	AudioCodec.mp3()))
	.transcode(Transcode.bitRate("44k")));
```

```kotlin
cloudinary.video {
	publicId("docs/firefly-tune.mp3")
	 videoEdit(VideoEdit.trim() { startOffset(2.0F)
 duration(3.0F) })
	 transcode(Transcode.audioCodec(
	AudioCodec.mp3()))
	 transcode(Transcode.bitRate("44k")) 
}.generate()
```

```jquery
$.cloudinary.url("docs/firefly-tune.mp3", {resource_type: "video", transformation: [
  {duration: "3.0", start_offset: "2.0"},
  {audio_codec: "mp3", bit_rate: "44k"}
  ]})
```

```react_native
import { trim } from "@cloudinary/url-gen/actions/videoEdit";
import { audioCodec, bitRate } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/firefly-tune.mp3")
  .videoEdit(trim().startOffset("2.0").duration("3.0"))
  .transcode(audioCodec("mp3"))
  .transcode(bitRate("44k"));
```

### Supported audio formats
The table below summarizes the supported audio formats.

Format | Extensions | Supported for Upload | Supported for Delivery
--- | --- | --- | --- 
AAC (Advanced Audio Coding) | aac | Yes | Yes
AIFF (Audio Interchange File Format) | aiff | Yes | Yes
AMR (Adaptive Multi-Rate) | amr | Yes | 
FLAC (Free Lossless Audio Codec) | flac | Yes | 
M4A| m4a | Yes | Yes
MP3 (MPEG-3) | mp3 | Yes | Yes
OGG | ogg | Yes | Yes
OPUS | opus | Yes |
WAV (Waveform Audio File Format)| wav | Yes | Yes
**See also**: [Supported video formats](video_transcoding#supported_video_formats)

## Audio settings

Audio settings are used for adjusting the audio properties of an audio or video file. You can:

* Control the [audio sampling frequency](#audio_frequency_control)
* Select the [audio codec](#audio_codec_settings) (or remove the audio)
* Adjust the [audio volume](#adjust_the_audio_volume)

### Audio frequency control
Use the `audio_frequency` parameter (`af` in URLs) to cap the audio sampling frequency at the specified value. If the source audio uses a higher frequency, Cloudinary downsamples it to the specified value. If the source frequency is already at or below the specified value, Cloudinary retains the original frequency and doesn't raise it. To keep the original frequency explicitly &mdash; for example when [setting the video codec automatically](video_manipulation_and_delivery#video_codec_settings) &mdash; use `af_iaf`. See [af (audio\_frequency)](transformation_reference#af_audio_frequency) in the _Transformation URL API Reference_ for the possible values.
  
For example, capping the audio frequency at 22050 Hz in the mp4 video with public ID `parrot`:

![Parrot video with audio frequency capped at 22050 Hz](https://res.cloudinary.com/demo/video/upload/af_22050/docs/parrot.mp4 "thumb: h_350, muted:false")

```nodejs
cloudinary.video("docs/parrot", {audio_frequency: "22050"})
```

```react
new CloudinaryVideo("docs/parrot.mp4").addTransformation("af_22050");
```

```vue
new CloudinaryVideo("docs/parrot.mp4").addTransformation("af_22050");
```

```angular
new CloudinaryVideo("docs/parrot.mp4").addTransformation("af_22050");
```

```js
new CloudinaryVideo("docs/parrot.mp4").addTransformation("af_22050");
```

```python
CloudinaryVideo("docs/parrot").video(audio_frequency="22050")
```

```php
use Cloudinary\Transformation\Transcode;

(new VideoTag('docs/parrot.mp4'))
	->transcode(Transcode::audioFrequency(22050));
```

```java
cloudinary.url().transformation(new Transformation().audioFrequency("22050")).videoTag("docs/parrot");
```

```ruby
cl_video_tag("docs/parrot", audio_frequency: "22050")
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation().AudioFrequency("22050")).BuildVideoTag("docs/parrot")
```

```dart
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.addTransformation("af_22050"));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation().setAudioFrequency("22050")).generate("docs/parrot.mp4")
```

```android
MediaManager.get().url().transformation(new Transformation().audioFrequency("22050")).resourceType("video").generate("docs/parrot.mp4");
```

```flutter
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.addTransformation("af_22050"));
```

```kotlin
cloudinary.video {
	publicId("docs/parrot.mp4")
	 transcode(Transcode.audioFrequency(22050)) 
}.generate()
```

```jquery
$.cloudinary.video("docs/parrot", {audio_frequency: "22050"})
```

```react_native
new CloudinaryVideo("docs/parrot.mp4").addTransformation("af_22050");
```

### Audio codec settings
Use the `audio_codec` parameter (`ac` in URLs) to set the audio codec or remove the audio channel completely as follows:

* `none` removes the audio channel
* `aac` (mp4 only)
* `vorbis` (ogv or webm only)
* `mp3` (mp4 only)
* `opus` (webm only)
* `pcm24` sets the audio codec to PCM signed 24-bit little-endian
  
For example, removing the audio channel from the uploaded mp4 video with public ID: `docs/parrot`:

![Parrot video with no audio](https://res.cloudinary.com/demo/video/upload/ac_none/docs/parrot.mp4 "thumb: h_350, muted:false")

```nodejs
cloudinary.video("docs/parrot", {audio_codec: "none"})
```

```react
import { audioCodec } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/parrot.mp4").transcode(audioCodec("none"));
```

```vue
import { audioCodec } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/parrot.mp4").transcode(audioCodec("none"));
```

```angular
import { audioCodec } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/parrot.mp4").transcode(audioCodec("none"));
```

```js
import { audioCodec } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/parrot.mp4").transcode(audioCodec("none"));
```

```python
CloudinaryVideo("docs/parrot").video(audio_codec="none")
```

```php
use Cloudinary\Transformation\Transcode;
use Cloudinary\Transformation\AudioCodec;

(new VideoTag('docs/parrot.mp4'))
	->transcode(Transcode::audioCodec(
	AudioCodec::none()));
```

```java
cloudinary.url().transformation(new Transformation().audioCodec("none")).videoTag("docs/parrot");
```

```ruby
cl_video_tag("docs/parrot", audio_codec: "none")
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation().AudioCodec("none")).BuildVideoTag("docs/parrot")
```

```dart
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.transcode(Transcode.audioCodec(
	AudioCodec.none())));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation().setAudioCodec("none")).generate("docs/parrot.mp4")
```

```android
MediaManager.get().url().transformation(new Transformation().audioCodec("none")).resourceType("video").generate("docs/parrot.mp4");
```

```flutter
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.transcode(Transcode.audioCodec(
	AudioCodec.none())));
```

```kotlin
cloudinary.video {
	publicId("docs/parrot.mp4")
	 transcode(Transcode.audioCodec(
	AudioCodec.none())) 
}.generate()
```

```jquery
$.cloudinary.video("docs/parrot", {audio_codec: "none"})
```

```react_native
import { audioCodec } from "@cloudinary/url-gen/actions/transcode";

new CloudinaryVideo("docs/parrot.mp4").transcode(audioCodec("none"));
```

### Adjust the audio volume

Control the audio volume of an audio or video file with the `volume` effect parameter (`e_volume` in URLs). You can adjust the volume as a percentage of the current volume, by specifying an increase or decrease in decibels, or just set the volume to `mute`.

For example, decreasing the volume in this parrot video by 50%:

![Parrot video with volume set to -50](https://res.cloudinary.com/demo/video/upload/e_volume:-50/docs/parrot.mp4 "thumb: h_350, muted:false")

```nodejs
cloudinary.video("docs/parrot", {effect: "volume:-50"})
```

```react
import { volume } from "@cloudinary/url-gen/actions/videoEdit";

new CloudinaryVideo("docs/parrot.mp4").videoEdit(volume(-50));
```

```vue
import { volume } from "@cloudinary/url-gen/actions/videoEdit";

new CloudinaryVideo("docs/parrot.mp4").videoEdit(volume(-50));
```

```angular
import { volume } from "@cloudinary/url-gen/actions/videoEdit";

new CloudinaryVideo("docs/parrot.mp4").videoEdit(volume(-50));
```

```js
import { volume } from "@cloudinary/url-gen/actions/videoEdit";

new CloudinaryVideo("docs/parrot.mp4").videoEdit(volume(-50));
```

```python
CloudinaryVideo("docs/parrot").video(effect="volume:-50")
```

```php
use Cloudinary\Transformation\VideoEdit;

(new VideoTag('docs/parrot.mp4'))
	->videoEdit(VideoEdit::volume(-50));
```

```java
cloudinary.url().transformation(new Transformation().effect("volume:-50")).videoTag("docs/parrot");
```

```ruby
cl_video_tag("docs/parrot", effect: "volume:-50")
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation().Effect("volume:-50")).BuildVideoTag("docs/parrot")
```

```dart
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.videoEdit(VideoEdit.volume(-50)));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation().setEffect("volume:-50")).generate("docs/parrot.mp4")
```

```android
MediaManager.get().url().transformation(new Transformation().effect("volume:-50")).resourceType("video").generate("docs/parrot.mp4");
```

```flutter
cloudinary.video('docs/parrot.mp4').transformation(Transformation()
	.videoEdit(VideoEdit.volume(-50)));
```

```kotlin
cloudinary.video {
	publicId("docs/parrot.mp4")
	 videoEdit(VideoEdit.volume(-50)) 
}.generate()
```

```jquery
$.cloudinary.video("docs/parrot", {effect: "volume:-50"})
```

```react_native
import { volume } from "@cloudinary/url-gen/actions/videoEdit";

new CloudinaryVideo("docs/parrot.mp4").videoEdit(volume(-50));
```

For all `volume` effect options, see the [e\_volume](transformation_reference#e_volume) parameter in the _Transformation URL API Reference_.

## Mixing audio tracks

You can mix together two or more audio tracks by layering them on top of each other using the `audio` overlay.

For example, here are two tracks of piano accompaniment from the fourth movement of Franck's Violin Sonata:

* Lower piano accompaniment ![Lower piano accompaniment](https://res.cloudinary.com/demo/video/upload/docs/franck/audio/piano_low "with_image:false")

```nodejs
cloudinary.image("docs/franck/audio/piano_low", {resource_type: "video"})
```

```react
new CloudinaryVideo("docs/franck/audio/piano_low");
```

```vue
new CloudinaryVideo("docs/franck/audio/piano_low");
```

```angular
new CloudinaryVideo("docs/franck/audio/piano_low");
```

```js
new CloudinaryVideo("docs/franck/audio/piano_low");
```

```python
CloudinaryVideo("docs/franck/audio/piano_low").image()
```

```php
(new VideoTag('docs/franck/audio/piano_low'));
```

```java
cloudinary.url().transformation(new Transformation().resourceType("video").imageTag("docs/franck/audio/piano_low");
```

```ruby
cl_image_tag("docs/franck/audio/piano_low", resource_type: "video")
```

```csharp
cloudinary.Api.UrlVideoUp.BuildImageTag("docs/franck/audio/piano_low")
```

```dart
cloudinary.video('docs/franck/audio/piano_low').transformation(Transformation());
```

```swift
cloudinary.createUrl().setResourceType("video").generate("docs/franck/audio/piano_low")
```

```android
MediaManager.get().url().transformation(new Transformation().resourceType("video").generate("docs/franck/audio/piano_low");
```

```flutter
cloudinary.video('docs/franck/audio/piano_low').transformation(Transformation());
```

```kotlin
cloudinary.video {
	publicId("docs/franck/audio/piano_low") 
}.generate()
```

```jquery
$.cloudinary.image("docs/franck/audio/piano_low", {resource_type: "video"})
```

```react_native
new CloudinaryVideo("docs/franck/audio/piano_low");
```

* Higher piano accompaniment ![Lower piano accompaniment](https://res.cloudinary.com/demo/video/upload/docs/franck/audio/piano_high "with_image:false")

```nodejs
cloudinary.image("docs/franck/audio/piano_high", {resource_type: "video"})
```

```react
new CloudinaryVideo("docs/franck/audio/piano_high");
```

```vue
new CloudinaryVideo("docs/franck/audio/piano_high");
```

```angular
new CloudinaryVideo("docs/franck/audio/piano_high");
```

```js
new CloudinaryVideo("docs/franck/audio/piano_high");
```

```python
CloudinaryVideo("docs/franck/audio/piano_high").image()
```

```php
(new VideoTag('docs/franck/audio/piano_high'));
```

```java
cloudinary.url().transformation(new Transformation().resourceType("video").imageTag("docs/franck/audio/piano_high");
```

```ruby
cl_image_tag("docs/franck/audio/piano_high", resource_type: "video")
```

```csharp
cloudinary.Api.UrlVideoUp.BuildImageTag("docs/franck/audio/piano_high")
```

```dart
cloudinary.video('docs/franck/audio/piano_high').transformation(Transformation());
```

```swift
cloudinary.createUrl().setResourceType("video").generate("docs/franck/audio/piano_high")
```

```android
MediaManager.get().url().transformation(new Transformation().resourceType("video").generate("docs/franck/audio/piano_high");
```

```flutter
cloudinary.video('docs/franck/audio/piano_high').transformation(Transformation());
```

```kotlin
cloudinary.video {
	publicId("docs/franck/audio/piano_high") 
}.generate()
```

```jquery
$.cloudinary.image("docs/franck/audio/piano_high", {resource_type: "video"})
```

```react_native
new CloudinaryVideo("docs/franck/audio/piano_high");
```

You can mix them together by specifying the first track (`docs/franck/audio/piano_low`) as the base track and overlaying the second track (`l_audio:docs:franck:audio:piano_high`):

![Full piano accompaniment](https://res.cloudinary.com/demo/video/upload/l_audio:docs:franck:audio:piano_high/fl_layer_apply/docs/franck/audio/piano_low "with_image:false")

```nodejs
cloudinary.image("docs/franck/audio/piano_low", {resource_type: "video", transformation: [
  {overlay: "audio:docs:franck:audio:piano_high"},
  {flags: "layer_apply"}
  ]})
```

```react
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";

new CloudinaryImage("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .setAssetType("video");
```

```vue
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";

new CloudinaryImage("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .setAssetType("video");
```

```angular
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";

new CloudinaryImage("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .setAssetType("video");
```

```js
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";

new CloudinaryImage("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .setAssetType("video");
```

```python
CloudinaryVideo("docs/franck/audio/piano_low").image(transformation=[
  {'overlay': "audio:docs:franck:audio:piano_high"},
  {'flags': "layer_apply"}
  ])
```

```php
use Cloudinary\Transformation\Overlay;
use Cloudinary\Transformation\Source;

(new ImageTag('docs/franck/audio/piano_low'))
	->overlay(Overlay::source(
	Source::audio("docs/franck:audio:piano_high")))
	->assetType("video");
```

```java
cloudinary.url().transformation(new Transformation()
  .overlay(new Layer().publicId("audio:docs:franck:audio:piano_high")).chain()
  .flags("layer_apply")).resourceType("video").imageTag("docs/franck/audio/piano_low");
```

```ruby
cl_image_tag("docs/franck/audio/piano_low", resource_type: "video", transformation: [
  {overlay: "audio:docs:franck:audio:piano_high"},
  {flags: "layer_apply"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Overlay(new Layer().PublicId("audio:docs:franck:audio:piano_high")).Chain()
  .Flags("layer_apply")).BuildImageTag("docs/franck/audio/piano_low")
```

```dart
cloudinary.image('docs/franck/audio/piano_low').transformation(Transformation()
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:piano_high")))
	.setAssetType("video"));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setOverlay("audio:docs:franck:audio:piano_high").chain()
  .setFlags("layer_apply")).generate("docs/franck/audio/piano_low")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .overlay(new Layer().publicId("audio:docs:franck:audio:piano_high")).chain()
  .flags("layer_apply")).resourceType("video").generate("docs/franck/audio/piano_low");
```

```flutter
cloudinary.image('docs/franck/audio/piano_low').transformation(Transformation()
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:piano_high")))
	.setAssetType("video"));
```

```kotlin
cloudinary.image {
	publicId("docs/franck/audio/piano_low")
	 overlay(Overlay.source(
	Source.audio("docs/franck:audio:piano_high")))
	 assetType("video") 
}.generate()
```

```jquery
$.cloudinary.image("docs/franck/audio/piano_low", {resource_type: "video", transformation: [
  {overlay: new cloudinary.Layer().publicId("audio:docs:franck:audio:piano_high")},
  {flags: "layer_apply"}
  ]})
```

```react_native
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";

new CloudinaryImage("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .setAssetType("video");
```

You can then add the violin melody, which starts two seconds into the accompaniment, using another `audio` overlay with start offset of 2.0 (`fl_layer_apply,so_2.0`):

![Piano with violin](https://res.cloudinary.com/demo/video/upload/l_audio:docs:franck:audio:piano_high/fl_layer_apply/l_audio:docs:franck:audio:violin_start0/fl_layer_apply,so_2.0/docs/franck/audio/piano_low "with_image:false")

```nodejs
cloudinary.image("docs/franck/audio/piano_low", {resource_type: "video", transformation: [
  {overlay: "audio:docs:franck:audio:piano_high"},
  {flags: "layer_apply"},
  {overlay: "audio:docs:franck:audio:violin_start0"},
  {start_offset: "2.0", flags: "layer_apply"}
  ]})
```

```react
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(audio("docs/franck:audio:violin_start0")).timeline(
      position().startOffset("2.0")
    )
  );
```

```vue
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(audio("docs/franck:audio:violin_start0")).timeline(
      position().startOffset("2.0")
    )
  );
```

```angular
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(audio("docs/franck:audio:violin_start0")).timeline(
      position().startOffset("2.0")
    )
  );
```

```js
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(audio("docs/franck:audio:violin_start0")).timeline(
      position().startOffset("2.0")
    )
  );
```

```python
CloudinaryVideo("docs/franck/audio/piano_low").image(transformation=[
  {'overlay': "audio:docs:franck:audio:piano_high"},
  {'flags': "layer_apply"},
  {'overlay': "audio:docs:franck:audio:violin_start0"},
  {'start_offset': "2.0", 'flags': "layer_apply"}
  ])
```

```php
use Cloudinary\Transformation\Overlay;
use Cloudinary\Transformation\Source;
use Cloudinary\Transformation\Timeline;

(new VideoTag('docs/franck/audio/piano_low'))
	->overlay(Overlay::source(
	Source::audio("docs/franck:audio:piano_high")))
	->overlay(Overlay::source(
	Source::audio("docs/franck:audio:violin_start0"))
	->timeline(
	Timeline::position()->startOffset(2.0))
	);
```

```java
cloudinary.url().transformation(new Transformation()
  .overlay(new Layer().publicId("audio:docs:franck:audio:piano_high")).chain()
  .flags("layer_apply").chain()
  .overlay(new Layer().publicId("audio:docs:franck:audio:violin_start0")).chain()
  .startOffset("2.0").flags("layer_apply")).resourceType("video").imageTag("docs/franck/audio/piano_low");
```

```ruby
cl_image_tag("docs/franck/audio/piano_low", resource_type: "video", transformation: [
  {overlay: "audio:docs:franck:audio:piano_high"},
  {flags: "layer_apply"},
  {overlay: "audio:docs:franck:audio:violin_start0"},
  {start_offset: "2.0", flags: "layer_apply"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Overlay(new Layer().PublicId("audio:docs:franck:audio:piano_high")).Chain()
  .Flags("layer_apply").Chain()
  .Overlay(new Layer().PublicId("audio:docs:franck:audio:violin_start0")).Chain()
  .StartOffset("2.0").Flags("layer_apply")).BuildImageTag("docs/franck/audio/piano_low")
```

```dart
cloudinary.video('docs/franck/audio/piano_low').transformation(Transformation()
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:piano_high")))
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:violin_start0"))
	.timeline(
	Timeline.position().startOffset('2.0'))
	));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setOverlay("audio:docs:franck:audio:piano_high").chain()
  .setFlags("layer_apply").chain()
  .setOverlay("audio:docs:franck:audio:violin_start0").chain()
  .setStartOffset("2.0").setFlags("layer_apply")).generate("docs/franck/audio/piano_low")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .overlay(new Layer().publicId("audio:docs:franck:audio:piano_high")).chain()
  .flags("layer_apply").chain()
  .overlay(new Layer().publicId("audio:docs:franck:audio:violin_start0")).chain()
  .startOffset("2.0").flags("layer_apply")).resourceType("video").generate("docs/franck/audio/piano_low");
```

```flutter
cloudinary.video('docs/franck/audio/piano_low').transformation(Transformation()
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:piano_high")))
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:violin_start0"))
	.timeline(
	Timeline.position().startOffset('2.0'))
	));
```

```kotlin
cloudinary.video {
	publicId("docs/franck/audio/piano_low")
	 overlay(Overlay.source(
	Source.audio("docs/franck:audio:piano_high")))
	 overlay(Overlay.source(
	Source.audio("docs/franck:audio:violin_start0")) {
	 timeline(
	Timeline.position() { startOffset(2.0F) })
	 }) 
}.generate()
```

```jquery
$.cloudinary.image("docs/franck/audio/piano_low", {resource_type: "video", transformation: [
  {overlay: new cloudinary.Layer().publicId("audio:docs:franck:audio:piano_high")},
  {flags: "layer_apply"},
  {overlay: new cloudinary.Layer().publicId("audio:docs:franck:audio:violin_start0")},
  {start_offset: "2.0", flags: "layer_apply"}
  ]})
```

```react_native
import { source } from "@cloudinary/url-gen/actions/overlay";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(audio("docs/franck:audio:violin_start0")).timeline(
      position().startOffset("2.0")
    )
  );
```

Then, you can combine other transformations, such as raising the volume of the violin line (`e_volume:200`):

![Piano with louder violin](https://res.cloudinary.com/demo/video/upload/l_audio:docs:franck:audio:piano_high/fl_layer_apply/l_audio:docs:franck:audio:violin_start0/e_volume:200/fl_layer_apply,so_2.0/docs/franck/audio/piano_low "with_image:false")

```nodejs
cloudinary.image("docs/franck/audio/piano_low", {resource_type: "video", transformation: [
  {overlay: "audio:docs:franck:audio:piano_high"},
  {flags: "layer_apply"},
  {overlay: "audio:docs:franck:audio:violin_start0"},
  {effect: "volume:200"},
  {start_offset: "2.0", flags: "layer_apply"}
  ]})
```

```react
import { source } from "@cloudinary/url-gen/actions/overlay";
import { volume } from "@cloudinary/url-gen/actions/videoEdit";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(
      audio("docs/franck:audio:violin_start0").transformation(
        new Transformation().videoEdit(volume(200))
      )
    ).timeline(position().startOffset("2.0"))
  );
```

```vue
import { source } from "@cloudinary/url-gen/actions/overlay";
import { volume } from "@cloudinary/url-gen/actions/videoEdit";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(
      audio("docs/franck:audio:violin_start0").transformation(
        new Transformation().videoEdit(volume(200))
      )
    ).timeline(position().startOffset("2.0"))
  );
```

```angular
import { source } from "@cloudinary/url-gen/actions/overlay";
import { volume } from "@cloudinary/url-gen/actions/videoEdit";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(
      audio("docs/franck:audio:violin_start0").transformation(
        new Transformation().videoEdit(volume(200))
      )
    ).timeline(position().startOffset("2.0"))
  );
```

```js
import { source } from "@cloudinary/url-gen/actions/overlay";
import { volume } from "@cloudinary/url-gen/actions/videoEdit";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(
      audio("docs/franck:audio:violin_start0").transformation(
        new Transformation().videoEdit(volume(200))
      )
    ).timeline(position().startOffset("2.0"))
  );
```

```python
CloudinaryVideo("docs/franck/audio/piano_low").image(transformation=[
  {'overlay': "audio:docs:franck:audio:piano_high"},
  {'flags': "layer_apply"},
  {'overlay': "audio:docs:franck:audio:violin_start0"},
  {'effect': "volume:200"},
  {'start_offset': "2.0", 'flags': "layer_apply"}
  ])
```

```php
use Cloudinary\Transformation\Overlay;
use Cloudinary\Transformation\VideoEdit;
use Cloudinary\Transformation\Source;
use Cloudinary\Transformation\Timeline;

(new VideoTag('docs/franck/audio/piano_low'))
	->overlay(Overlay::source(
	Source::audio("docs/franck:audio:piano_high")))
	->overlay(Overlay::source(
	Source::audio("docs/franck:audio:violin_start0")
	->transformation((new Transformation())
	->videoEdit(VideoEdit::volume(200)))
	)
	->timeline(
	Timeline::position()->startOffset(2.0))
	);
```

```java
cloudinary.url().transformation(new Transformation()
  .overlay(new Layer().publicId("audio:docs:franck:audio:piano_high")).chain()
  .flags("layer_apply").chain()
  .overlay(new Layer().publicId("audio:docs:franck:audio:violin_start0")).chain()
  .effect("volume:200").chain()
  .startOffset("2.0").flags("layer_apply")).resourceType("video").imageTag("docs/franck/audio/piano_low");
```

```ruby
cl_image_tag("docs/franck/audio/piano_low", resource_type: "video", transformation: [
  {overlay: "audio:docs:franck:audio:piano_high"},
  {flags: "layer_apply"},
  {overlay: "audio:docs:franck:audio:violin_start0"},
  {effect: "volume:200"},
  {start_offset: "2.0", flags: "layer_apply"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Overlay(new Layer().PublicId("audio:docs:franck:audio:piano_high")).Chain()
  .Flags("layer_apply").Chain()
  .Overlay(new Layer().PublicId("audio:docs:franck:audio:violin_start0")).Chain()
  .Effect("volume:200").Chain()
  .StartOffset("2.0").Flags("layer_apply")).BuildImageTag("docs/franck/audio/piano_low")
```

```dart
cloudinary.video('docs/franck/audio/piano_low').transformation(Transformation()
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:piano_high")))
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:violin_start0")
	.transformation(new Transformation()
	.videoEdit(VideoEdit.volume(200)))
	)
	.timeline(
	Timeline.position().startOffset('2.0'))
	));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setOverlay("audio:docs:franck:audio:piano_high").chain()
  .setFlags("layer_apply").chain()
  .setOverlay("audio:docs:franck:audio:violin_start0").chain()
  .setEffect("volume:200").chain()
  .setStartOffset("2.0").setFlags("layer_apply")).generate("docs/franck/audio/piano_low")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .overlay(new Layer().publicId("audio:docs:franck:audio:piano_high")).chain()
  .flags("layer_apply").chain()
  .overlay(new Layer().publicId("audio:docs:franck:audio:violin_start0")).chain()
  .effect("volume:200").chain()
  .startOffset("2.0").flags("layer_apply")).resourceType("video").generate("docs/franck/audio/piano_low");
```

```flutter
cloudinary.video('docs/franck/audio/piano_low').transformation(Transformation()
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:piano_high")))
	.overlay(Overlay.source(
	Source.audio("docs/franck:audio:violin_start0")
	.transformation(new Transformation()
	.videoEdit(VideoEdit.volume(200)))
	)
	.timeline(
	Timeline.position().startOffset('2.0'))
	));
```

```kotlin
cloudinary.video {
	publicId("docs/franck/audio/piano_low")
	 overlay(Overlay.source(
	Source.audio("docs/franck:audio:piano_high")))
	 overlay(Overlay.source(
	Source.audio("docs/franck:audio:violin_start0") {
	 transformation(Transformation {
	 videoEdit(VideoEdit.volume(200)) })
	 }) {
	 timeline(
	Timeline.position() { startOffset(2.0F) })
	 }) 
}.generate()
```

```jquery
$.cloudinary.image("docs/franck/audio/piano_low", {resource_type: "video", transformation: [
  {overlay: new cloudinary.Layer().publicId("audio:docs:franck:audio:piano_high")},
  {flags: "layer_apply"},
  {overlay: new cloudinary.Layer().publicId("audio:docs:franck:audio:violin_start0")},
  {effect: "volume:200"},
  {start_offset: "2.0", flags: "layer_apply"}
  ]})
```

```react_native
import { source } from "@cloudinary/url-gen/actions/overlay";
import { volume } from "@cloudinary/url-gen/actions/videoEdit";
import { audio } from "@cloudinary/url-gen/qualifiers/source";
import { position } from "@cloudinary/url-gen/qualifiers/timeline";

new CloudinaryVideo("docs/franck/audio/piano_low")
  .overlay(source(audio("docs/franck:audio:piano_high")))
  .overlay(
    source(
      audio("docs/franck:audio:violin_start0").transformation(
        new Transformation().videoEdit(volume(200))
      )
    ).timeline(position().startOffset("2.0"))
  );
```

> **TIP**: For videos delivered with [automatic streaming profile selection](adaptive_bitrate_streaming#automatic_streaming_profile_selection), you can also define multiple [alternate audio tracks](adaptive_bitrate_streaming#defining_alternate_audio_tracks) that will be included in the resulting manifest. This allows for switching of audio tracks when used with a video player.> **NOTE**: The same [layer transformation syntax](video_layers#layer_transformation_syntax) rules apply, including for [authenticated or private assets](video_layers#authenticated_or_private_layers).
**See also**: [Audio overlays](video_layers#audio_overlays)

## Auto-generated waveform images
  
You can create audio waveform images from audio or video files with fine control over the look & feel of the generated waveform image.

This section is divided into the following subsections:

* [Creating waveform images](#creating_waveform_images)
* [Customizing the waveform image](#customizing_the_waveform_image)

### Creating waveform images

To create a waveform image from an audio or video file uploaded to your Cloudinary product environment, change the file extension (format) of the Cloudinary delivery URL to any image format (e.g., PNG) and enable the `waveform` flag (`fl_waveform` in URLs). By default, the resulting waveform image is delivered with a very high resolution, so you will probably also want to scale down the resulting image.

For example, to generate a PNG waveform image from the audio track of the `dog.mp4` video file uploaded to Cloudinary's demo product environment, scaled to a height of 200 pixels and a width of 500 pixels:
  
![Video waveform image of 500x200](https://res.cloudinary.com/demo/video/upload/c_scale,h_200,w_500/fl_waveform/dog.png)

```nodejs
cloudinary.image("dog.png", {resource_type: "video", transformation: [
  {height: 200, width: 500, crop: "scale"},
  {flags: "waveform"}
  ]})
```

```react
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/fl_waveform")
  .setAssetType("video");
```

```vue
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/fl_waveform")
  .setAssetType("video");
```

```angular
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/fl_waveform")
  .setAssetType("video");
```

```js
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/fl_waveform")
  .setAssetType("video");
```

```python
CloudinaryVideo("dog.png").image(transformation=[
  {'height': 200, 'width': 500, 'crop': "scale"},
  {'flags': "waveform"}
  ])
```

```php
use Cloudinary\Transformation\Resize;
use Cloudinary\Transformation\Flag;

(new ImageTag('dog.png'))
	->resize(Resize::scale()->width(500)
->height(200))
	->addFlag(
	Flag::waveform())
	->assetType("video");
```

```java
cloudinary.url().transformation(new Transformation()
  .height(200).width(500).crop("scale").chain()
  .flags("waveform")).resourceType("video").imageTag("dog.png");
```

```ruby
cl_image_tag("dog.png", resource_type: "video", transformation: [
  {height: 200, width: 500, crop: "scale"},
  {flags: "waveform"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Height(200).Width(500).Crop("scale").Chain()
  .Flags("waveform")).BuildImageTag("dog.png")
```

```dart
cloudinary.image('dog.png').transformation(Transformation()
	.addTransformation("c_scale,h_200,w_500/fl_waveform")
	.setAssetType("video"));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setHeight(200).setWidth(500).setCrop("scale").chain()
  .setFlags("waveform")).generate("dog.png")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .height(200).width(500).crop("scale").chain()
  .flags("waveform")).resourceType("video").generate("dog.png");
```

```flutter
cloudinary.image('dog.png').transformation(Transformation()
	.addTransformation("c_scale,h_200,w_500/fl_waveform")
	.setAssetType("video"));
```

```kotlin
cloudinary.image {
	publicId("dog.png")
	 resize(Resize.scale() { width(500)
 height(200) })
	 addFlag(
	Flag.waveform())
	 assetType("video") 
}.generate()
```

```jquery
$.cloudinary.image("dog.png", {resource_type: "video", transformation: [
  {height: 200, width: 500, crop: "scale"},
  {flags: "waveform"}
  ]})
```

```react_native
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/fl_waveform")
  .setAssetType("video");
```

### Customizing the waveform image
  
You can also control the colors used in the waveform image with the `color` parameter (`co` in URLs) to set the color for the waveform (default `white`) and the `background` parameter (`b` in URLs) to set the background color of the image (default `black`). You can create waveforms with a transparent background by setting the `background` parameter to `transparent` or `none` (`b_transparent` or `b_none` in URLs). 
  
For example, to generate the same PNG waveform image from the audio track of the `dog.mp4` video file in the example above in inverted colors - with the waveform rendered in black on a white background:
  
![Black on white waveform image](https://res.cloudinary.com/demo/video/upload/c_scale,h_200,w_500/b_white,co_black,fl_waveform/dog.png)

```nodejs
cloudinary.image("dog.png", {resource_type: "video", transformation: [
  {height: 200, width: 500, crop: "scale"},
  {background: "white", color: "black", flags: "waveform"}
  ]})
```

```react
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/b_white,co_black,fl_waveform")
  .setAssetType("video");
```

```vue
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/b_white,co_black,fl_waveform")
  .setAssetType("video");
```

```angular
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/b_white,co_black,fl_waveform")
  .setAssetType("video");
```

```js
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/b_white,co_black,fl_waveform")
  .setAssetType("video");
```

```python
CloudinaryVideo("dog.png").image(transformation=[
  {'height': 200, 'width': 500, 'crop': "scale"},
  {'background': "white", 'color': "black", 'flags': "waveform"}
  ])
```

```php
(new ImageTag('dog.png'))
	->addTransformation("c_scale,h_200,w_500/b_white,co_black,fl_waveform")
	->assetType("video");
```

```java
cloudinary.url().transformation(new Transformation()
  .height(200).width(500).crop("scale").chain()
  .background("white").color("black").flags("waveform")).resourceType("video").imageTag("dog.png");
```

```ruby
cl_image_tag("dog.png", resource_type: "video", transformation: [
  {height: 200, width: 500, crop: "scale"},
  {background: "white", color: "black", flags: "waveform"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Height(200).Width(500).Crop("scale").Chain()
  .Background("white").Color("black").Flags("waveform")).BuildImageTag("dog.png")
```

```dart
cloudinary.image('dog.png').transformation(Transformation()
	.addTransformation("c_scale,h_200,w_500/b_white,co_black,fl_waveform")
	.setAssetType("video"));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setHeight(200).setWidth(500).setCrop("scale").chain()
  .setBackground("white").setColor("black").setFlags("waveform")).generate("dog.png")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .height(200).width(500).crop("scale").chain()
  .background("white").color("black").flags("waveform")).resourceType("video").generate("dog.png");
```

```flutter
cloudinary.image('dog.png').transformation(Transformation()
	.addTransformation("c_scale,h_200,w_500/b_white,co_black,fl_waveform")
	.setAssetType("video"));
```

```kotlin
cloudinary.image {
	publicId("dog.png")
	 addTransformation("c_scale,h_200,w_500/b_white,co_black,fl_waveform")
	 assetType("video") 
}.generate()
```

```jquery
$.cloudinary.image("dog.png", {resource_type: "video", transformation: [
  {height: 200, width: 500, crop: "scale"},
  {background: "white", color: "black", flags: "waveform"}
  ]})
```

```react_native
new CloudinaryImage("dog.png")
  .addTransformation("c_scale,h_200,w_500/b_white,co_black,fl_waveform")
  .setAssetType("video");
```

  
If you want to capture the waveform of a specific segment of the audio file, you can select from the following parameters to specify the section of the file to sample for the waveform:

 * `start_offset` (`so` in URLs) specifies the start of the sample.
 * `end_offset` (`eo` in URLs) specifies the end of the sample.
 * `duration` (`du` in URLs) specifies the duration of the sample.
 
For example, to display a PNG waveform image of a sample from the 2 second mark until the 4 second mark of the `dog.mp4` video file uploaded to Cloudinary's demo product environment, scaled to a height of 250 pixels and a width of 400 pixels, with the waveform rendered in blue on a transparent background:
  
![Waveform of a partial video with color customization](https://res.cloudinary.com/demo/video/upload/eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent/dog.png)

```nodejs
cloudinary.image("dog.png", {resource_type: "video", transformation: [
  {end_offset: "4.0", start_offset: "2.0"},
  {height: 250, width: 400, crop: "scale"},
  {color: "blue", background: "transparent", flags: "waveform"}
  ]})
```

```react
new CloudinaryImage("dog.png")
  .addTransformation(
    "eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent"
  )
  .setAssetType("video");
```

```vue
new CloudinaryImage("dog.png")
  .addTransformation(
    "eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent"
  )
  .setAssetType("video");
```

```angular
new CloudinaryImage("dog.png")
  .addTransformation(
    "eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent"
  )
  .setAssetType("video");
```

```js
new CloudinaryImage("dog.png")
  .addTransformation(
    "eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent"
  )
  .setAssetType("video");
```

```python
CloudinaryVideo("dog.png").image(transformation=[
  {'end_offset': "4.0", 'start_offset': "2.0"},
  {'height': 250, 'width': 400, 'crop': "scale"},
  {'color': "blue", 'background': "transparent", 'flags': "waveform"}
  ])
```

```php
(new ImageTag('dog.png'))
	->addTransformation("eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent")
	->assetType("video");
```

```java
cloudinary.url().transformation(new Transformation()
  .endOffset("4.0").startOffset("2.0").chain()
  .height(250).width(400).crop("scale").chain()
  .color("blue").background("transparent").flags("waveform")).resourceType("video").imageTag("dog.png");
```

```ruby
cl_image_tag("dog.png", resource_type: "video", transformation: [
  {end_offset: "4.0", start_offset: "2.0"},
  {height: 250, width: 400, crop: "scale"},
  {color: "blue", background: "transparent", flags: "waveform"}
  ])
```

```csharp
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .EndOffset("4.0").StartOffset("2.0").Chain()
  .Height(250).Width(400).Crop("scale").Chain()
  .Color("blue").Background("transparent").Flags("waveform")).BuildImageTag("dog.png")
```

```dart
cloudinary.image('dog.png').transformation(Transformation()
	.addTransformation("eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent")
	.setAssetType("video"));
```

```swift
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setEndOffset("4.0").setStartOffset("2.0").chain()
  .setHeight(250).setWidth(400).setCrop("scale").chain()
  .setColor("blue").setBackground("transparent").setFlags("waveform")).generate("dog.png")
```

```android
MediaManager.get().url().transformation(new Transformation()
  .endOffset("4.0").startOffset("2.0").chain()
  .height(250).width(400).crop("scale").chain()
  .color("blue").background("transparent").flags("waveform")).resourceType("video").generate("dog.png");
```

```flutter
cloudinary.image('dog.png').transformation(Transformation()
	.addTransformation("eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent")
	.setAssetType("video"));
```

```kotlin
cloudinary.image {
	publicId("dog.png")
	 addTransformation("eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent")
	 assetType("video") 
}.generate()
```

```jquery
$.cloudinary.image("dog.png", {resource_type: "video", transformation: [
  {end_offset: "4.0", start_offset: "2.0"},
  {height: 250, width: 400, crop: "scale"},
  {color: "blue", background: "transparent", flags: "waveform"}
  ]})
```

```react_native
new CloudinaryImage("dog.png")
  .addTransformation(
    "eo_4.0,so_2.0/c_scale,h_250,w_400/fl_waveform,co_blue,b_transparent"
  )
  .setAssetType("video");
```

The generated image waveforms can be further transformed to match any graphic design and any responsive layout, just like any other image uploaded to Cloudinary. 

**See full syntax**: [fl_waveform](transformation_reference#fl_waveform) in the _Transformation Reference_.

> **READING**: Learn about [optimizing audio](audio_optimization).
