> ## Documentation Index
> Fetch the complete documentation index at: https://bunnynet-cb9733c2-stream-player-framework-guides.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Bunny Player

> The video player that ships with every Bunny Stream library: what it supports, how to embed it, and how to control it from your own code.

Bunny Player is the video player included with every Bunny Stream library. It runs at `player.mediadelivery.net`, plays your library's HLS output with adaptive bitrate, and needs no player code on your side. Embed it with an iframe, style it from the dashboard, and control it from your page with a small JavaScript API.

## Embed a video

Every processed video has an embed URL built from the library ID and video GUID:

```text theme={null}
https://player.mediadelivery.net/embed/{video_library_id}/{video_id}
```

```html theme={null}
<iframe
  src="https://player.mediadelivery.net/embed/{video_library_id}/{video_id}"
  title="Video player"
  loading="lazy"
  style="display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; border: 0;"
  allow="autoplay; encrypted-media; picture-in-picture; fullscreen"
  allowfullscreen>
</iframe>
```

[Embedding videos](/stream/embedding) covers sizing, per-embed parameters such as `autoplay` and `captions`, the direct play URL for sharing a link, and the security settings that can block an embed.

## What the player does

* Adaptive HLS playback with a quality menu, and optional native HLS in Safari.
* Captions, including auto-generated transcription tracks, and an audio track menu for videos with several languages.
* Chapters and moments on the progress bar, with thumbnail previews on hover.
* Playback speed control, a watch-time heatmap, and a resume-where-you-left-off option, each configurable per library.
* Picture-in-picture, fullscreen, Chromecast, and AirPlay.
* [Keyboard shortcuts](/stream/embedding#player-keyboard-shortcuts) for playback, seeking, volume, captions, and speed.
* An interface translated into 27 languages besides English, selected with the `lang` parameter.
* [MediaCage DRM](/stream/drm) and [VAST ads](/stream/vast).

Each playback session feeds the [statistics](/stream/statistics) in your dashboard.

## Customise the look and defaults

[Player settings](/stream/player-settings) in the dashboard set the colours, logo, controls, and default behaviour for every embed in a library. Query parameters on the embed URL override those defaults for a single embed.

## Control playback from your page

The player speaks the [player.js](https://github.com/embedly/player.js) protocol, so your page can play, pause, seek, mute, and listen for events such as `timeupdate` and `ended`. [Playback control API](/stream/playback-api) lists every method and event, and the framework guides show a working component for each stack:

<CardGroup cols={2}>
  <Card title="React" href="/stream/player/react" />

  <Card title="Next.js" href="/stream/player/nextjs" />

  <Card title="Vue and Nuxt" href="/stream/player/vue" />

  <Card title="Svelte and SvelteKit" href="/stream/player/svelte" />
</CardGroup>

## Native apps

For iOS and Android apps, the [iOS SDK](/stream/ios-sdk) and [Android SDK](/stream/android-sdk) play the same HLS output through the platform's native video stack. To play your library through Bitmovin, Shaka, or another web player, see [Third-party players](/stream/players).

## Legacy player

Libraries created before Bunny Player launched may still run the previous Plyr-based player at `iframe.mediadelivery.net`. Embed URLs on that host keep working while the legacy player is enabled for the library.

<Note>
  The legacy player is deprecated and will be removed in early 2027. Move your embeds to `player.mediadelivery.net` before then. If you customised it with custom head HTML, the [migration guide](/stream/custom-head-html-migration-guide) maps the old selectors to the new ones.
</Note>

To switch a library between players in the dashboard, open **Stream**, select the library, open **Player Settings**, and toggle **Enable legacy player**.

<Frame>
  <img alt="Enable legacy player toggle in Player Settings" src="https://mintcdn.com/bunnynet-cb9733c2-stream-player-framework-guides/YAdel_7inkXG04nL/images/Screenshot2026-03-12at10.52.17.png?fit=max&auto=format&n=YAdel_7inkXG04nL&q=85&s=2871f518fca9ba15c3bc4669cf2da468" className="dark:hidden" width="2718" height="416" data-path="images/Screenshot2026-03-12at10.52.17.png" />

  <img alt="Enable legacy player toggle in Player Settings" src="https://mintcdn.com/bunnynet-cb9733c2-stream-player-framework-guides/YAdel_7inkXG04nL/images/Screenshot2026-03-12at10.52.17-1.png?fit=max&auto=format&n=YAdel_7inkXG04nL&q=85&s=f2f24b22f60f413efcf234fedef3b59a" className="hidden dark:block" width="2718" height="416" data-path="images/Screenshot2026-03-12at10.52.17-1.png" />
</Frame>

The same switch is `PlayerVersion` on the [Update Video Library](/api-reference/core/stream-video-library/update-video-library) endpoint, where `2` is Bunny Player and `1` is the legacy player:

```bash theme={null}
curl https://api.bunny.net/videolibrary/<library_id> \
  -X POST \
  -H 'authorization: <token>' \
  -H 'content-type: application/json' \
  -d '{"PlayerVersion": 2}'
```

Changing the player does not rewrite embed codes you have already published. Update those URLs to `player.mediadelivery.net/embed/` yourself.
