ExoPlayer 是 google 开源的应用级媒体播放器,github源码 → https://github.com/google/ExoPlayer 。相较于 MediaPlayer,ExoPlayer 具有以下优点:

  • 支持更多的视频播放格式(包含 DASH 和 SmoothStreaming,这2种 MediaPlayer 不支持)
  • 通过组件化自定义播放器,方便扩展定制
  • 持久的高速缓存

ExoPlayer 框架中组件主要有:

  • MediaSource :媒体资源,用于定义要播放的媒体。通过 player.prepare() 注入。使用 LoopingMediaSource 类指定媒体循环播放次数;ConcatenatingMediaSource 可以无缝拼接媒体资源。
  • Renderer :渲染器,用于渲染媒体文件。创建 player 时,Renderers 被注入。
  • TrackSelector :轨道选择器,用于选择 MediaSource 提供的轨道(tracks),供每个可用的渲染器使用。创建 player 时,TrackSelector 被注入。
  • LoadControl :用于控制 MediaSource 何时缓冲更多的媒体资源以及缓冲多少媒体资源。创建 player 时,LoadControl 被注入。

(1)添加仓库

在项目 build.gradle 中添加 google(),如下:

repositories {
    google()
    jcenter()

        (2)添加依赖

        在模块 build.gradle 中的 dependencies 下添加 ExoPlayer 框架依赖,如下:

implementation 'com.google.android.exoplayer:exoplayer:2.8.1'

        (3)添加权限

        在 AndroidManifest.xml 中的 manifest 标签(application 同级标签)下添加外部存储读写权限,如下:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

        (4)主类

        MainActivity.java

package com.zhyan8.exoplayer;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
public class MainActivity extends AppCompatActivity {
    private PlayerView playerView;
    private SimpleExoPlayer player;
    public static final String[] permissions = {
            "android.permission.WRITE_EXTERNAL_STORAGE",
            "android.permission.READ_EXTERNAL_STORAGE"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    private void init() {
        if(Build.VERSION.SDK_INT>=23){
            requestPermissions(permissions,1);
        playerView = (PlayerView) findViewById(R.id.video_view);
        initializePlayer();
    private void initializePlayer() {
        player = ExoPlayerFactory.newSimpleInstance(
                new DefaultRenderersFactory(this),
                new DefaultTrackSelector(),
                new DefaultLoadControl());
        playerView.setPlayer(player);
        Uri playUri = Uri.parse("file:///sdcard/Pictures/WeiXin/a.mp4");
        MediaSource mediaSource = buildMediaSource(playUri);
        player.prepare(mediaSource, true, false);
    private MediaSource buildMediaSource(Uri uri) {
        DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this, "com.example.exoplayerdemo");
        MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
        return videoSource;

        (5)布局

        activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.zhyan8.exoplayer.MainActivity">
    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

        (1)循环播放

MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
LoopingMediaSource loopingSource = new LoopingMediaSource(videoSource, 5); // 循环播放 5 次
player.prepare(loopingSource, true, false);

        (2)视频拼接

MediaSource videoSource1 = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri_a);
MediaSource videoSource2 = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri_b);
ConcatenatingMediaSource concatenatedSource  = new ConcatenatingMediaSource(videoSource1, videoSource2); // 无缝拼接资源
player.prepare(concatenatedSource, true, false);

        (3)倍速播放

PlaybackParameters params = new PlaybackParameters(3, 3); // 3 倍速播放,参数1:帧率,参数2:频率
player.setPlaybackParameters(params);
1 前言ExoPlayer 是 google 开源的应用级媒体播放器,github源码 →https://github.com/google/ExoPlayer。相较于 MediaPlayer,ExoPlayer 具有以下优点:支持更多的视频播放格式(包含 DASH 和 SmoothStreaming,这2种 MediaPlayer 不支持) 通过组件化自定义播放器,方便扩展定制 持久的高速缓存ExoPlayer 框架中组件主要有:MediaSource:媒体资源,用于定义要播放的媒体。. ExoPlayer是google开源的应用级媒体播放器项目,目前已有1W+的start,并一直在维护。该开源项目包含ExoPlayer库和演示 demo,github地址:https://github.com/google/ExoPlayer。和官方文档https://exoplayer.dev/hello-world.html 二、优缺点比较 与Android内置的MediaPlayer相比,ExoPlayer具有许多优点: *支持通过HTTP(D.
ExoPlayer是运行在YouTube app Android版本上的视频播放器。不仅功能强大,而且使用简单,可定制性强。ExoPlayer也是Google官方推荐的Android媒体播放器,可以在Android官方文档的音频和视频目录中找到。 一,优点和缺点 1,支持DASH和SmoothStreaming这两种数据格式的资源,而Media......
ExoPlayer介绍 MediaPlayer和ExoPlayer是Google官方支持的两种播放器,但是ExoPlayer比MediaPlayer多了支持基于 HTTP 的动态自适应流 (DASH)、SmoothStreaming 和通用加密等功能。 并且重要的是它独立于Android代码框
只是(视频)播放器 基于Android视频播放器 它使用ExoPlayer的extension-ffmpeg启用了(它甚至可以处理AC3,EAC3,DTS,DTS HD,TrueHD等特殊格式)。 使用蓝牙耳机/扬声器时,它可以正确地将音频与视频轨道同步。 (我找不到其他基于ExoPlayer的漂亮视频播放器,所以我创建了这个播放器。) 支持的格式 音频:Vorbis,Opus,FLAC,ALAC,PCM / WAVE(μ律,A律),MP1,MP2,MP3,AMR(NB,WB),AAC(LC,ELD,HE; xHE在Android 9+上) ,AC-3,E-AC-3,DTS,DTS-HD,TrueHD 视频:H.263,H.264 AVC(基准配置文件; Android 6+上的主要配置文件),H.265 HEVC,MPEG-4 SP,VP8,VP9,AV1 容器:MP4,MOV,
要在 Android使用 ExoPlayer2 和 ViewPager2 播放视频,需要以下步骤: 1. 安装 ExoPlayer2 库:在 build.gradle 文件中添加以下依赖项: implementation 'com.google.android.exoplayer:exoplayer:2.X.X' 2. 创建一个 ExoPlayer2 实例:在您的 Activity 或 Fragment 中创建一个 ExoPlayer 实例,并设置要播放的媒体文件。 3. 创建一个 ExoPlayerView:在您的布局文件中创建一个 ExoPlayerView 并将其与 ExoPlayer 实例关联。 4. 创建一个 ViewPager2:在您的布局文件中创建一个 ViewPager2,并将其填充为包含 ExoPlayerView 的 Fragment。 5. 设置 ViewPager2 适配器:创建一个适配器并将其与 ViewPager2 关联,以显示每个 Fragment。 这些步骤将为您提供一个可在 ViewPager2 中播放视频的基础架构。根据您的需求,您可以对代码进行进一步的调整。