How to Choose Audio Stream in Video Stream with ExoPlayer

Abstract: Resolve incorrect audio playback in multi-track MPEG-TS files by programmatically selecting specific audio tracks using ExoPlayer's TrackSelector API.

Created: 2026-09-25 by

ExoPlayer allows developers to select specific audio tracks from multi-track video streams by using the TrackSelector API. This guide explains how to identify available audio streams in an MPEG-TS file and configure your player to switch between them programmatically, ensuring the correct language or quality is played.

Understanding Multi-Stream Video Files

Modern video containers, such as MPEG-TS (Transport Stream), often bundle multiple audio tracks within a single file. This is common in broadcast scenarios where different languages or commentary options are provided. When you load such a file into ExoPlayer, the media parser detects these separate tracks but does not automatically decide which one to play. Instead, it exposes all available audio variants to the application layer through its track selection mechanism.

The example scenario involves an input file like my-stream.ts with a duration of nearly an hour and a bitrate around 8013kb/s. Inside this container, there may be two distinct audio streams. Without explicit configuration, ExoPlayer will typically default to the first audio track found in the stream metadata. However, for applications requiring specific user preferences, such as selecting a secondary language, manual intervention is required.

Configuring the Track Selector

The core of managing audio streams lies in the DefaultTrackSelector. By default, ExoPlayer uses a set of rules to pick tracks, but these can be overridden. To choose a specific audio stream, you need to create a custom TrackSelectionOverride. This object tells the player exactly which track ID to prioritize for the audio renderer.

First, ensure your ExoPlayer instance is initialized with a DefaultTrackSelector. You can access this selector via the player's getTrackSelector() method. Once you have a reference to the selector, you can modify its parameters. The most effective way to do this is by updating the Parameters of the selector with a new override.

// Assuming 'player' is your ExoPlayer instance
DefaultTrackSelector trackSelector = (DefaultTrackSelector) player.getTrackSelector();

// Create a builder for the track selector parameters
DefaultTrackSelector.ParametersBuilder paramsBuilder = trackSelector.buildUponParameters();

// Define the group index (usually 0 for the first audio track if only one exists initially)
// and the specific track index within that group you wish to select.
int audioGroupIndex = 0; 
int audioTrackIndex = 1; // Selects the second audio stream

// Create the override
TrackSelectionOverride override = new TrackSelectionOverride(
    MediaTrackGroup.AUDIO_TRACK_TYPE, 
    audioGroupIndex, 
    audioTrackIndex
);

// Apply the override
paramsBuilder.setOverrideForType(override);

// Update the track selector with the new parameters
trackSelector.setParameters(paramsBuilder.build());

This code snippet demonstrates the direct approach. It assumes you know the indices of the tracks. In a real-world application, you should dynamically query the available tracks rather than hardcoding indices, as these can vary between different source files.

Dynamically Identifying Available Audio Tracks

Hardcoding track indices is risky because the order of streams in a container is not guaranteed across different encoders or processing tools. A more robust solution involves inspecting the MediaMetadataRetriever or listening to the Tracks event from ExoPlayer. When the player prepares the media, it fires a onTracksChanged callback. Inside this callback, you can iterate through the available tracks to find those with the C.TRACK_TYPE_AUDIO type.

You can list the characteristics of each audio track, such as its label, language, or bitrate. This information is crucial for building a UI menu that lets users choose their preferred audio stream. For instance, if you have two streams, one might be labeled "English" and the other "Spanish". By mapping these labels to track IDs, you can present a clear choice to the user.

Refer to our article on Defining Two Stream Variants of Different Audio Streams with ExoPlayer and FFmpeg for deeper insights into preparing these files with FFmpeg before they even reach the player.

Handling User Selections

Once you have identified the tracks, you need to handle user interaction. If a user selects a different language from a settings menu, you must update the TrackSelector again. It is important to note that changing track selections does not require reloading the media source. The change takes effect immediately after the new parameters are applied.

If the selected track is not currently active, the player will seamlessly switch to it. However, if the user tries to select a track that does not exist or has been removed from the stream, ExoPlayer will fall back to its default selection logic. Always validate the track ID against the current list of available tracks before applying the override to prevent errors.

Common Pitfalls and Debugging

One common issue arises when the audio tracks are not detected at all. This usually happens if the container format is not properly supported or if the audio codec is incompatible with the device. Check your build dependencies to ensure you have included the necessary extensions for MPEG-TS and the specific audio codecs used in your stream.

Another pitfall is ignoring the MediaItem lifecycle. If you change the track selector parameters while a media item is already playing, the changes apply to the current playback. If you want the selection to persist across different media items, you must save the TrackSelector parameters to persistent storage and restore them when initializing a new player instance. This ensures that user preferences are respected throughout the session.

Frequently Asked Questions

Can I switch audio tracks without restarting the video?

Yes, ExoPlayer supports seamless switching between audio tracks. By updating the TrackSelector parameters while the player is in the PLAYING state, the audio renderer will switch to the new track almost instantly without interrupting the video playback or seeking.

How do I get the list of all available audio tracks?

You can retrieve the list by implementing the Player.Listener.onTracksChanged callback. Inside this method, access the TrackGroupArray and filter for groups containing C.TRACK_TYPE_AUDIO. Each track in these groups contains metadata like language and bitrate that you can use to display options to the user.

What happens if the selected audio track is unavailable?

If you attempt to select a track index that exceeds the number of available tracks in the current stream, ExoPlayer will ignore the invalid override and revert to its default selection algorithm. It is best practice to always verify the track count before creating the TrackSelectionOverride.

Does this work with HLS and DASH streams?

Yes, the TrackSelector API works consistently across different media formats, including HLS, DASH, and local files like MPEG-TS. However, the structure of the track groups may differ slightly depending on the manifest format, so you should always inspect the track array dynamically rather than assuming a fixed structure.

Why is my audio still playing in the default language?

This often occurs if the TrackSelector parameters are not correctly applied or if the override is being overwritten by subsequent default behaviors. Ensure that you call setParameters on the DefaultTrackSelector and that no other part of your code is resetting the selector to its default state after your modification.

Latest News

How to Display Output of xterm Command in Terminal Screen using Cron

Resolve the inability to display xterm output in a terminal screen from cron by redirecting logs or using wall instead of insecure X11 workarounds.

Read More
Expose Local Server on VPS Preserving Real Client IPs (OS Level)

Resolve VPS logging showing only gateway IPs by configuring reverse proxies to forward real client addresses via X-Forwarded-For headers.

Read More
How to Clear Recent Files History in Linux without Deleting Actual Files?

Clear recent files history in Linux by deleting ~/.local/share/recently-used.xbel without removing the actual files.

Read More
Best HDD Copy Strategy: Manually Syncing and Rewriting Scratch

Resolve data drift between two 4TB hard drives by using rsync with the --delete flag to manually sync and rewrite scratch data for an exact mirror.

Read More
Understanding Bash Prompt Abbreviations: An Overview

Resolve repetitive typing errors by creating and persisting Bash aliases in the .bashrc file for improved command-line efficiency.

Read More
Free Tools and Methods to Log Real-Time Performance Details in Task Manager

Log real-time CPU and memory metrics to CSV files using Windows Performance Monitor Data Collector Sets to troubleshoot system slowness.

Read More
Contact Qatar Airways Customer Service: Phone Number, Help Center, and More

Resolve urgent Qatar Airways reservation issues like flight changes and baggage claims using the US phone number +1801-855-5905 or online self-service tools.

Read More
Windows 11: Alt Codes Displaying Wrong Characters - Solutions

Resolve Windows 11 Alt codes showing wrong characters by verifying the US keyboard layout and enabling Num Lock.

Read More
Run Programs with Elevated Privileges: A Comprehensive Guide

Eliminates the need to type sudo for frequent administrative tasks by configuring .bashrc aliases or functions.

Read More
Dynamically Changing Dates in Excel Formulas Using Cells

Eliminate manual date updates in Excel by using cell references to create dynamic formulas that automatically adjust calculations when input dates change.

Read More
Granting Edit Access to a Specific Excel Sheet in an Office 365 User Email ID-Based Login

Excel Online lacks native sheet-level permissions, so users must split workbooks or use worksheet protection to isolate edit access for specific tabs.

Read More
Creating Network Load on Local Wi-Fi from One PC

Generate sustained Wi-Fi bandwidth load from a single PC using a VM SFTP server to test router stability and throughput.

Read More
Changing the Default Editor for Batch Files in Windows 11's File Explorer

Resolve the issue of batch files opening in Notepad by changing the default editor to a preferred application like VS Code.

Read More
Gain WiFi Connection Minutes Before Losing it by Changing MAC Address

Bypass MAC address filtering to restore WiFi connectivity temporarily when a device is blocked by network administrators.

Read More
Photos Folders Turned Black: Troubleshooting Picture Applications on Windows

Resolve black screens in Windows Photos by resetting the app, updating graphics drivers, and repairing system files.

Read More
Troubleshooting High CPU Temperature Values: A Step-by-Step Guide

Resolve high CPU temperatures and thermal throttling by monitoring with Speedfan, cleaning dust from cooling components, and replacing degraded thermal paste.

Read More
Make cURL establish TLS connection with CA unknown

Resolve cURL TLS connection failures with unknown or self-signed certificates by using the --insecure flag to bypass CA validation.

Read More
Troubleshooting Incorrect Network Metrics Values in Grafana, Prometheus, InfluxDB, and Telegraf

Fix incorrect network metrics in Grafana, Prometheus, InfluxDB, and Telegraf by verifying interface selection, resolving unit mismatches, and handling counter resets.

Read More
Start Another Terminal Window (cmd.exe) Windows Repair/Troubleshoot

Provides step-by-step instructions to access the Windows Command Prompt via bootable media for advanced system repair and troubleshooting.

Read More
Thinkpad P1 Gen 6: Sudden Thunderbolt 3 Dock USB-C Charging Stopped Working

Resolve sudden Thunderbolt 3 dock USB-C charging and internet failure on ThinkPad P1 Gen 6 by updating firmware, resetting the dock, and adjusting power settings.

Read More
ASUS Windows 11 Laptop: Internet Connection Issue with Hotspot

Resolve ASUS Windows 11 laptop spinning wheel issue when connecting to mobile hotspot by resetting network stack, disabling IPv6, and adjusting power settings.

Read More
Developing iOS Project with Firebase: Logging in and Sending Push Notifications

Integrates Firebase to enable secure user authentication and push notifications in iOS applications.

Read More
Troubleshooting Bash Script with Suspected Issues of Spaces, Dashes, Filenames and Quoting

Resolve Bash script failures caused by word splitting, globbing, and special characters in filenames by applying proper quoting techniques.

Read More
Populating OneDrive Folder for Local Backup without Affecting Remote Files

Prevent OneDrive from deleting remote files during Windows reinstallation by unlinking the account or using symbolic links to isolate local data.

Read More
Force First Frame as Keyframe Without Re-encoding: A Quick Solution

Resolve inaccurate seeking and playback glitches by re-encoding video to ensure the first frame is a valid keyframe.

Read More
Find Information in Database Using WSL (Ubuntu) on Windows-10

Resolve database connection issues from WSL Ubuntu on Windows 10 by configuring client tools and network access to query remote or local servers.

Read More
Configuring a New Router with Different Networks: One Family, One Guest

Resolve IP conflicts and isolate guest traffic by configuring a second router with a distinct subnet via its WAN port.

Read More
Quickly Open Multiple Stock Websites with a Single Command

Solve the problem of manually opening multiple stock research websites by creating a single command to launch them simultaneously on Windows, macOS, or Linux.

Read More
Improved Adobe Acrobat Search Experience: Access Advanced Search with Ease

Access advanced search filters like case sensitivity and regex in Adobe Acrobat by clicking More Options in the Find bar.

Read More
Port Forwarding VM via OpenVPN: A Comprehensive Guide

Configure OpenVPN server and iptables to forward specific ports from VPN clients to a virtual machine's internal IP address.

Read More
Understanding Partitions in the 1980s: A Look Back at MS-DOS and Master Boot Record

Explains how the Master Boot Record and partition table enabled MS-DOS to manage multiple disk volumes on a single physical drive.

Read More
Windows 10 Enterprise: Keyboard Not Detected in Managed Organization with Admin Privileges

Resolve Windows 10 Enterprise keyboard detection failures caused by Group Policy restrictions, driver corruption, or USB enumeration errors.

Read More
Can't Find x86_64 Versions of Applications on MacOS arm64 (M1)

Resolve missing x86_64 app issues on M1 Macs by installing Rosetta 2 and reinstalling apps as universal binaries.

Read More
How to Hide Installation Source for an Android App

Manage Android app installation source visibility by using USB transfers or file managers to reduce browser traces and isolate data via work profiles.

Read More
Connecting Momentus 4200.2 ST9808210A Hard Drive via USB Cable

Resolve inability to access Seagate Momentus 4200.2 ST9808210A hard drive by connecting it via USB using a compatible SATA-to-USB adapter and configuring the disk in Windows.

Read More