# ExoPlayer

ExoPlayer is Media3's default Player implementation for playing local or streamed audio and video, with support for streaming protocols, renderers, buffering, customization, and extension.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Media3 1.11 adds customizable Compose player controls, gestures, and video preloading

DevFeed: [Media3 1.11 adds customizable Compose player controls, gestures, and video preloading](<https://devfeed.tech/articles/media3-1-11-what-s-new-22695.md>)

Original publisher: [Read original article](<http://android-developers.googleblog.com/2026/08/media3-1-11-whats-new.html>)

Author: Android Developers (noreply@blogger.com)

Published: 2026-08-11T16:00:00Z

Content type: release

Language: en

Sources: [Android Developers Blog](<https://devfeed.tech/sources/android-developers-blog-3.md>)

Topics: [media3](<https://devfeed.tech/topics/media3.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Playback](<https://devfeed.tech/topics/playback.md>), [Android](<https://devfeed.tech/topics/android.md>), [ExoPlayer](<https://devfeed.tech/topics/exoplayer.md>), [Ktor](<https://devfeed.tech/topics/ktor.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [audio](<https://devfeed.tech/tags/audio.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [exoplayer](<https://devfeed.tech/tags/exoplayer.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [ktor](<https://devfeed.tech/tags/ktor.md>), [media](<https://devfeed.tech/tags/media.md>), [media3](<https://devfeed.tech/tags/media3.md>), [playback](<https://devfeed.tech/tags/playback.md>), [release](<https://devfeed.tech/tags/release.md>), [releases](<https://devfeed.tech/tags/releases.md>), [video](<https://devfeed.tech/tags/video.md>)

### AI overview

Android Media3 1.11 introduces customizable Jetpack Compose player layouts, gesture-based playback controls, player recycling and preloading for short-form video feeds, improved Cast integration, a Ktor HTTP client extension, and new Ogg and WAV muxing utilities.

### Source excerpt

Posted by Toni Heidenreich, Software Engineer, Android Media3 1.11 is out. Powering the vast majority of top Android media apps, this release brings new features, bug fixes, and improvements across playback, editing, and UI components. We're expanding our Jetpack Compose UI modules with customizable Player slots and easy to use defaults, interactive gestures, state observers, and short-form video preloading using PlayerPool. We also modernized the Media3 Cast integration with SystemUI Output Switcher support, introduced a new Ktor HTTP client network extension, and added new muxing utilities for Ogg and WAV files. Read on for key highlights, and check out the full release notes for a comprehensive list of changes. Playback UI and Compose With Android becoming Compose-first, we are continuing to expand the media3-ui-compose and media3-ui-compose-material3 modules. This update introduces more granular control over your player layout, richer interaction patterns, and deeper integration with Material3. Customizable Player layout The Material 3 Player Composable now supports dedicated content slots for topControls, centerControls, bottomControls, and errorOverlay. You can drop in your own Composables or use the ready-made defaults published in PlayerDefaults: Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, ) The Player Composable also integrates FocusRequester support, enabling seamless D-pad and keyboard navigation on Android TV, foldables, and desktop environments. Example for a Composable Player with customized controls Gestures and playback speed control PlaybackSpeedState now provides a fast-forward/slow-motion API. The demo-compose app showcases this with a long-press gesture to fast-forward playback and seeking with double tap. Combined with the ProgressSlider introduced in 1.10, the Compose player UI now offers ric

## Controlling memory with Google's ExoPlayer

DevFeed: [Controlling memory with Google's ExoPlayer](<https://devfeed.tech/articles/controlling-memory-with-google-s-exoplayer-25145.md>)

Original publisher: [Read original article](<https://ianbird.dev/exoplayer-loadcontrol/>)

Author: Ian Bird

Published: 2021-12-06T14:24:05Z

Content type: tutorial

Language: en

Sources: [Ian Bird](<https://devfeed.tech/sources/ian-bird.md>)

Topics: [ExoPlayer](<https://devfeed.tech/topics/exoplayer.md>), [Playback](<https://devfeed.tech/topics/playback.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [exoplayer](<https://devfeed.tech/tags/exoplayer.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [memory](<https://devfeed.tech/tags/memory.md>), [playback](<https://devfeed.tech/tags/playback.md>)

### AI overview

This tutorial explains how ExoPlayer manages its main playback buffer and how application developers can influence its memory usage. It covers decoder input and output buffers, media-file track interleaving, and the LoadControl and Allocator components.

### Source excerpt

Playback requires memory. Learn how to best control ExoPlayer to make efficient use for your application.

## Debugging Problematic Videos with ExoPlayer's Demo App

DevFeed: [Debugging Problematic Videos with ExoPlayer's Demo App](<https://devfeed.tech/articles/battling-problematic-videos-with-google-s-exoplayer-25144.md>)

Original publisher: [Read original article](<https://ianbird.dev/exoplayer-debugging-files/>)

Author: Ian Bird

Published: 2021-11-04T11:26:34Z

Content type: tutorial

Language: en

Sources: [Ian Bird](<https://devfeed.tech/sources/ian-bird.md>)

Topics: [ExoPlayer](<https://devfeed.tech/topics/exoplayer.md>), [Demo](<https://devfeed.tech/topics/demo.md>), [Android](<https://devfeed.tech/topics/android.md>), [Google](<https://devfeed.tech/topics/google.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [decoding](<https://devfeed.tech/tags/decoding.md>), [demo](<https://devfeed.tech/tags/demo.md>), [exoplayer](<https://devfeed.tech/tags/exoplayer.md>), [json](<https://devfeed.tech/tags/json.md>), [python](<https://devfeed.tech/tags/python.md>), [repository](<https://devfeed.tech/tags/repository.md>), [streaming](<https://devfeed.tech/tags/streaming.md>)

### AI overview

A practical guide to diagnosing video playback problems in ExoPlayer by testing media with its Demo application. It explains how to add test files through the app's JSON configuration and how to stream files from Google Drive or a local Python HTTP server.

### Source excerpt

Unfortunately not all videos are created equally, and neither are Android devices. Learn some useful tips and tricks to sanity check your ExoPlayer integration by running the Demo App directly.

## Video playback in LazyColumn in Jetpack Compose

DevFeed: [Video playback in LazyColumn in Jetpack Compose](<https://devfeed.tech/articles/video-playback-in-lazycolumn-in-jetpack-compose-25900.md>)

Original publisher: [Read original article](<https://proandroiddev.com/video-playback-in-lazycolumn-in-jetpack-compose-df355097f26e?source=rss-56174fa84bcc------2>)

Author: Denys Rudenko

Published: 2021-10-05T23:51:23Z

Content type: tutorial

Language: en

Sources: [Stories by Denis Rudenko on Medium](<https://devfeed.tech/sources/stories-by-denis-rudenko-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [ExoPlayer](<https://devfeed.tech/topics/exoplayer.md>), [Playback](<https://devfeed.tech/topics/playback.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [article](<https://devfeed.tech/tags/article.md>), [compose](<https://devfeed.tech/tags/compose.md>), [exoplayer](<https://devfeed.tech/tags/exoplayer.md>), [image](<https://devfeed.tech/tags/image.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [playback](<https://devfeed.tech/tags/playback.md>), [state](<https://devfeed.tech/tags/state.md>), [video](<https://devfeed.tech/tags/video.md>), [viewmodel](<https://devfeed.tech/tags/viewmodel.md>)

### AI overview

A tutorial on implementing manual and automatic video playback in a Jetpack Compose LazyColumn using ExoPlayer. It covers preserving playback positions, pausing videos when cards are not visible, and responding to the application lifecycle.

### Source excerpt

Article will cover both manual & auto-playback of videos in an efficient way, storing/restoring last played video position, pausing playback if video card is not visible to the user and handling application lifecycle. ExoPlayer will be used for video playback, and these videos as a test data set. Coil will be used for displaying the video thumbnails. Video shows manual play/pause & auto-playback versions side to side. https://medium.com/media/98ab3ea482f78b96bf44de2ce54c7168/hrefStep 1: VideosScreen Let's start implementing all of those features step by step. First we create a composable which will contain the exoPlayer instance, list of videos and playingItemIndex: https://medium.com/media/2440139ad1f185b8d1f1446f844530b9/href Very important part here is using keys for the lazyColumn. In short: we provide a key which enables item state to be consistent across data-set changes isPlaying -- we can always know if video is playing or not. If it's playing -- playingItemIndex will represent the position of the item in the list, if nothing is playing -- null. We need this field to know if we should show play/pause icon, and thumbnail image or playerView. VideoCard -- composable which exposes click event on play/pause icon. Click will be handled inside the viewModel. Notice that we're passing current playback position from exoPlayer as well as the index of clicked item. We'll use it to save & restore the playback position for each video. https://medium.com/media/518600644bbec8f225a0c4b933adccd1/href Whenever the play/pause icon is clicked, we're checking for three scenarios: currentlyPlayingIndex is null -- video is not playing at the moment, so we are assigning the videoIndex to currentlyPlayingIndex. currentlyPlayingIndex is the same as videoIndex clicked -- this means that the same video is already playing, and we want to pause the playback. That's why we assign null to currentlyPlayingIndex. To store the last played video position we're mutating list, and saving the position

## Drop-in Android Video -- Exoplayer2 with Picture in Picture

DevFeed: [Drop-in Android Video -- Exoplayer2 with Picture in Picture](<https://devfeed.tech/articles/drop-in-android-video-exoplayer2-with-picture-in-picture-26010.md>)

Original publisher: [Read original article](<https://medium.com/s23nyc-tech/drop-in-android-video-exoplayer2-with-picture-in-picture-e2d4f8c1eb30?source=rss-2ffcf6104135------2>)

Author: Stacy Devino

Published: 2018-09-13T15:58:58Z

Content type: tutorial

Language: en

Sources: [Stories by Stacy Devino on Medium](<https://devfeed.tech/sources/stories-by-stacy-devino-on-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [ExoPlayer](<https://devfeed.tech/topics/exoplayer.md>), [picture-in-picture](<https://devfeed.tech/topics/picture-in-picture.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Streaming](<https://devfeed.tech/topics/streaming.md>), [Code](<https://devfeed.tech/topics/code.md>), [ui](<https://devfeed.tech/topics/ui.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [code](<https://devfeed.tech/tags/code.md>), [dependencies](<https://devfeed.tech/tags/dependencies.md>), [exoplayer](<https://devfeed.tech/tags/exoplayer.md>), [exoplayer2](<https://devfeed.tech/tags/exoplayer2.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [nike](<https://devfeed.tech/tags/nike.md>), [picture-in-picture](<https://devfeed.tech/tags/picture-in-picture.md>), [streaming](<https://devfeed.tech/tags/streaming.md>), [ui](<https://devfeed.tech/tags/ui.md>), [video](<https://devfeed.tech/tags/video.md>)

### AI overview

This tutorial explains how to add Android video playback with ExoPlayer2, including URL-based playback, Gradle dependencies, UI setup, and Kotlin implementation. It also introduces Android picture-in-picture support and notes that device support can vary.

### Source excerpt

Beautiful, interactive video content done easy. Video has been shown to increase engagement in apps and with content. How else could gif servicing apps be worth tens of millions and Youtube influencers be selling billions of dollars of product? The problem is that video in Android can be difficult. You are given the assumption that the video types you will support are pretty basic : embedded MPEG video, URLs to MP4/AVI files, and HLS Streaming. A naive approach would be to use the embedded video player sent with Intents, but that takes the user out of your app. You think, 🤔 " I'll just use the Android VideoView class with AppCompat ." Then you realize that it is nearly impossible to make the experience consistent across users because of codec support and whatever the phone manufacturer may have customized in the video player. Finally you settle on Exoplayer2 because it is the package everyone, including Google, uses. Upon further inspection, you quickly realize that it requires a lot of code to make it work and the example application on the Github is confusing, far too extensive for what you are doing. Another route you could take is ExoMedia by Brian Wernick, but it trades extensibility, theming, and control for simplicity. Fortunately, you only need the Exoplayer2 libraries to have a fantastic video player experience within your app. SimpleExoplayer "2" the Rescue First you need to make an app which can receive a URL and play it using Exoplayer. For this, you will need SimpleExoplayer and the Playerview from the UI package. Playerview has easy to manipulate styling/theming elements as well as available media controls. SimpleExoPlayer gives you a preconfigured player to work with without having to handle deeper logic yourself. Start by adding the Gradle dependencies to your build.gradle : implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X' implementation 'com.google.android.exoplayer:exoplayer-hls:2.X.X' implementation 'com.google.android.exoplayer:

## April 2017 Meetup: ExoPlayer 2.0 & Lint - olin

DevFeed: [April 2017 Meetup: ExoPlayer 2.0 & Lint - olin](<https://devfeed.tech/articles/april-2017-meetup-exoplayer-2-0-lint-olin-38136.md>)

Original publisher: [Read original article](<https://touchlab.co/2017-4-april-2017-meetup-exoplayer-20-brushing-up-on-lint>)

Published: 2017-04-25T21:40:44Z

Content type: article

Language: en

Sources: [Touchlab | Enterprise Mobile Innovation & Development](<https://devfeed.tech/sources/touchlab-enterprise-mobile-innovation-development.md>)

Topics: [ExoPlayer](<https://devfeed.tech/topics/exoplayer.md>), [Android](<https://devfeed.tech/topics/android.md>), [Library](<https://devfeed.tech/topics/library.md>), [issue tracker](<https://devfeed.tech/topics/issue-tracker.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [app](<https://devfeed.tech/tags/app.md>), [community](<https://devfeed.tech/tags/community.md>), [exoplayer](<https://devfeed.tech/tags/exoplayer.md>), [github](<https://devfeed.tech/tags/github.md>), [issue-tracker](<https://devfeed.tech/tags/issue-tracker.md>), [meetup](<https://devfeed.tech/tags/meetup.md>)

### AI overview

A recap of Touchlab's April 2017 meetup, featuring talks on ExoPlayer 2.0 and Android Lint. The ExoPlayer discussion emphasized understanding its architecture and initialization before customizing it, consulting the official samples carefully, and using the GitHub issue tracker as a learning resource.

### Source excerpt

For April, we welcomed Vimeo to our family of awesome meetup hosts! We thoroughly enjoyed their space, swanky arm chairs, and of course, sandwiches & pizza.