diff --git a/src/content/changelog/stream/2025-03-06-media-transformations.mdx b/src/content/changelog/stream/2025-03-06-media-transformations.mdx new file mode 100644 index 000000000000000..8eb85b5f4a38d59 --- /dev/null +++ b/src/content/changelog/stream/2025-03-06-media-transformations.mdx @@ -0,0 +1,49 @@ +--- +title: Introducing Media Transformations from Cloudflare Stream +description: > + Dynamically optimize, clip, and resize video from any origin, no storage + migration needed. +date: 2025-03-06T12:00:00Z +--- + +Today, we are thrilled to announce Media Transformations, a new service that +brings the magic of [Image Transformations](/images/transform-images/) to +_short-form video files,_ wherever they are stored! + +For customers with a huge volume of short video — generative AI output, +e-commerce product videos, social media clips, or short marketing content — +uploading those assets to Stream is not always practical. Sometimes, the +greatest friction to getting started was the thought of all that migrating. +Customers want a simpler solution that retains their current storage strategy to +deliver small, optimized MP4 files. Now you can do that with Media +Transformations. + +To transform a video or image, +[enable transformations](/stream/transform-videos/#getting-started) for your +zone, then make a simple request with a specially formatted URL. The result is +an MP4 that can be used in an HTML video element without a player library. +If your zone already has Image Transformations enabled, then it is ready to +optimize videos with Media Transformations, too. + +``` text title="URL format" +https://example.com/cdn-cgi/media// +``` + +For example, we have a short video of the mobile in Austin's office. The +original is nearly 30 megabytes and wider than necessary for this layout. +Consider a simple width adjustment: + + + +``` text title="Example URL" +https://example.com/cdn-cgi/media/width=640/ +https://developers.cloudflare.com/cdn-cgi/media/width=640/https://pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev/aus-mobile.mp4 +``` + +The result is less than 3 megabytes, properly sized, and delivered dynamically +so that customers do not have to manage the creation and storage of these +transformed assets. + +For more information, learn about [Transforming Videos](/stream/transform-videos/). diff --git a/src/content/docs/stream/transform-videos/index.mdx b/src/content/docs/stream/transform-videos/index.mdx new file mode 100644 index 000000000000000..a0fdcab6412cdf7 --- /dev/null +++ b/src/content/docs/stream/transform-videos/index.mdx @@ -0,0 +1,131 @@ +--- +pcx_content_type: concept +title: Transform videos +sidebar: + order: 5 + +--- + +Media Transformations let you optimize and manipulate videos stored _outside_ of the Cloudflare Stream. Transformed videos and images are served from one of your zones on Cloudflare. + +To transform a video or image, you must [enable transformations](/stream/transform-videos/#getting-started) for your zone. If your zone already has Image Transformations enabled, you can also optimize videos with Media Transformations. + +## Getting started + +You can dynamically optimize and generate still images from videos that are stored _outside_ of Cloudflare Stream with Media Transformations. + +Cloudflare will automatically cache every transformed video or image on our global network so that you store only the original image at your origin. + +To enable transformations on your zone: + +1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/login) and select your account. +2. Go to **Stream** > **Transformations**. +3. Locate the specific zone where you want to enable transformations. +4. Select **Enable** for zone. + +## Transform a video by URL + +You can convert and resize videos by requesting them via a specially-formatted URL, without writing any code. The URL format is: + +``` +https://example.com/media// +``` + +- `example.com`: Your website or zone on Cloudflare, with Transformations enabled. +- `/cdn-cgi/media/`: A prefix that identifies a special path handled by Cloudflare's built-in media transformation service. +- ``: A comma-separated list of options. Refer to the available options below. +- ``: An absolute path on the origin server or a full URL (starting with `https://` or `http://`) of the original asset to resize. + +For example, this URL will source an HD video from an R2 bucket, shorten it, crop and resize it as a square, and remove the audio. + +``` +https://example.com/media/mode=video,time=5s,duration=5s,width=500,height=500,fit=crop,audio=false/https://pub-8613b7f94d6146408add8fefb52c52e8.r2.dev/aus-mobile-demo.mp4 +``` + +The result is an MP4 that can be used in an HTML video element without a player library. + +## Options + +### `mode` + +Specifies the kind of output to generate. + +- `video`: Outputs an H.264/AAC optimized MP4 file. +- `frame`: Outputs a still image. +- `spritesheet`: Outputs a JPEG with multiple frames. + +### `time` + +Specifies when to start extracting the output in the input file. Depends on `mode`: + +- When `mode` is `spritesheet` or `video`, specifies the timestamp where the output will start. +- When `mode` is `frame`, specifies the timestamp from which to extract the still image. +- Formats as a time string, for example: 5s, 2m +- Acceptable range: 0 – 30s +- Default: 0 + +### `duration` + +The duration of the output video or spritesheet. Depends on `mode`: + +- When `mode` is `video`, specifies the duration of the output. +- When `mode` is `spritesheet`, specifies the time range from which to select frames. + +### `fit` + +In combination with `width` and `height`, specifies how to resize and crop the output. If the output is resized, it will always resize proportionally so content is not stretched. + +- `contain`: Respecting aspect ratio, scales a video up or down to be entirely contained within output dimensions. +- `scale-down`: Same as contain, but downscales to fit only. Do not upscale. +- `cover`: Respecting aspect ratio, scales a video up or down to entirely cover the output dimensions, with a center-weighted crop of the remainder. + +### `height` + +Specifies maximum height of the output in pixels. Exact behavior depends on `fit`. + +- Acceptable range: 10-2000 pixels + +### `width` + +Specifies the maximum width of the image in pixels. Exact behavior depends on `fit`. + +- Acceptable range: 10-2000 pixels + +### `audio` + +When `mode` is `video`, specifies whether or not to include the source audio in the output. + +- `true`: Includes source audio. +- `false`: Output will be silent. +- Default: `true` + +### `format` + +If `mode` is `frame`, specifies the image output format. + +- Acceptable options: `jpg`, `png` + +## Source video requirements + +Input video must be less than 40MB. Contact Stream if the input limitation is unacceptable. + +Input video should be an MP4 with H.264 encoded video and AAC or MP3 encoded audio. Other formats may work but are untested. + +## Limitations + +Media Transformations are currently in beta. During this period: + +- Transformations are available for all enabled zones free-of-charge. +- Restricting allowed origins for transformations are coming soon. +- Outputs from Media Transformations will be cached, but if they must be regenerated, the origin fetch is not cached and may result in subsequent requests to the origin asset. + +## Pricing + +Media Transformations will be free for all customers while in beta. + +After that, Media Transforamtions and Image Transformations will use the same subscriptions and usage metrics. + +- Generating a still frame (single image) from a video counts as 1 transformation. +- Generating an optimized video counts as 1 transformation _per second of the output_ video. +- Each unique transformation is only billed once per month. +- All Media and Image Transformations cost $0.50 per 1,000 monthly unique transformation operations, with a free monthly allocation of 5,000.