​ ExoPlayer 是 google 开源的应用级媒体播放器,github源码 → github.com/google/ExoP… 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);
    

    ​ 声明:本文转自【Android】使用Exoplayer播放视频

    分类:
    Android
  •