Android笔记
我的博客
Android笔记
Android笔记
  • Android学习资料
  • Android知识点梳理
  • Android Studio
  • aop
  • UI
    • ViewPager2
    • View
      • View.post()分析
      • 自定义View
        • Canvas使用
        • Paint使用
        • Path使用
        • PathMeasure使用
        • Matrix使用
      • View事件分发
    • TextView
    • EditText
    • 引导页
    • 菜单
    • Toolbar
    • RecyclerView
    • ViewPager
    • BottomSheet
    • 通知
    • CalendarView
    • TimePicker
    • LayoutInfalter
    • shadowlayout
    • 状态栏适配
    • RecyclerView
    • 屏幕适配
  • 组件
    • Activity
    • Intent
    • 服务
      • 服务
      • 绑定服务
      • AIDL
    • Broadcasts
    • Fragment
    • ContentProvider
  • 权限
  • 数据存储
    • 数据和文件存储
    • 将文件保存到外部存储中
    • 将文件保存在内部存储中
    • Android 存储用例和最佳做法
    • 保存键值对数据
  • 编译时注解
    • Untitled
    • Java注解处理器](annotation/annotation-processing.md)
    • JavaPoet 文档翻译
  • 图形和图像
    • Drawable使用
  • 网络
    • WebView
    • OkHttp文档翻译
      • OkHttp使用
      • OkHttp拦截器
    • Retrofit使用
    • Retrofit源码分析
    • HttpURLConnection使用
    • Volley使用
    • Volley源码分析
    • Glide使用
    • Glide源码分析
    • RxJava
  • 插件化
    • 插件化框架
    • VirtualAPK分析
  • 依赖注入
  • 开源库
    • EventBus源码分析
    • Okio概览
    • Okio菜谱
    • Okio
    • OkHttp拦截器
    • OKHttp缓存
    • Okhttp源码分析
  • 集合
    • SparseArray
    • ArrayMap
  • 架构
  • Jetpack
    • databinding adapter
    • databinding坑
    • databinding源码分析
    • Android Data Binding: Let’s Flip This Thing
    • Untitled
    • Lifecycle源码分析
    • ViewModel源码分析
    • LiveData源码分析
  • 音频和视频
    • CameraX使用
    • ExoPlayer
    • GsyVideoPlayer
  • 性能优化
    • 崩溃优化
    • 内存优化
      • LeakCanary如何工作
    • 渲染优化
    • 电池优化
    • 启动优化
    • 网络优化
    • 安装包大小优化
  • NDK开发
  • 系统源码分析
    • Android源码下载
    • Android系统启动
      • init进程启动过程
      • Zygote进程启动过程
      • Zygote进程启动流程
      • SystemServer处理过程
    • 应用程序进程启动过程
      • 应用程序进程启动过程介绍
    • Window
    • WMS
    • WindowManagerService
    • 四大组件的工作过程
      • Activity启动流程分析
      • Activity启动流程
    • ActivityManagerService分析
    • Context详解
    • Binder原理
      • Binder驱动
      • 获取ServiceManager
      • 启动ServiceManager
      • Parcel源码分析
    • Android图形系统概述
    • Choreographer原理
    • Handler使用
    • Handler源码分析
  • 逆向
    • Android抓包
    • 网易云音乐逆向
由 GitBook 提供支持
在本页
  • 1.介绍
  • 2.特点
  • 3.库介绍
  • 4.基本使用
  • 1.添加ExoPlayer的依赖
  • 2.创建ExoPlayer实例
  • 3.将player关联到view上
  • 4.准备Player
  • 扩展阅读
在GitHub上编辑
  1. 音频和视频

ExoPlayer

1.介绍

Android提供了MediaPlayer可以使用少量的代码快速实现媒体播放功能。同时还提供了偏向底层的媒体api如MediaCodec、AudioTrack和MediaDrm,可以利用这些去构建自定义媒体播放方案。

ExoPlayer是构建在Android底层媒体api之上的应用级别的开源项目。

2.特点

ExoPlayer对比MediaPlayer具有以下优点: 1. 支持基于HTTP的动态自适应流 (DASH) 和SmoothStreaming,任何目前MediaPlayer 支持的视频格式,同时它还支持 HTTP 直播(HLS),MP4,MP3,WebM,M4A,MPEG-TS 和 AAC。 2. 支持高级的 HLS 特性,例如正确处理 EXT-X-DISCONTINUITY 标签。 3. 能够无缝地合并,连接和循环媒体。 4. 具有自定义和扩展播放器以适应您的用例的能力。ExoPlayer专门设计了这一点,并允许许多组件被替换为自定义实现。 5. 便于随着 App 的升级而升级。因为 ExoPlayer 是一个包含在你的应用中的库,对于你使用哪个版本有完全的控制权,并且你可以简单的跟随应用的升级而升级; 6. 更少的适配性问题。 7. 支持Android 4.4(API等级19)以上的Widevine通用加密。

缺点: 1. ExoPlayer的标准视频和音频组件依赖Android的MediaCodec,该接口发布于Android4.1,因此不能再Android4.1之前的版本使用ExoPlayer。

3.库介绍

ExoPlayer库的核心是ExoPlayer接口。ExoPlayer提供传统的媒体播放功能例如媒体缓冲、播放,暂停和快进等。ExoPlayer实现不是直接实现媒体的加载和呈现,而是委托给其他组件来完成。常用的组件包括如下。

  • 一个MediaSource表示一个媒体资源,当调用ExoPlayer的prepare方法时,传入MediaSource。

  • Renderer渲染媒体的独立组件,当player创建时Renderer被注入。

  • TrackSelector选择由MediaSource提供的轨道,以供每个可用渲染器使用。当播放器创建时,TrackSelector将被注入。

  • LoadControl用于控制媒体的加载。在创建播放器时注入LoadControl。

这些组件提供了默认的实现以满足常见的用例。用户也可以自定义组件。

4.基本使用

1.添加ExoPlayer的依赖

  1. 首先确保工程根目录下build.gradle文件包含jcenter repository。

    repositories {
     jcenter()
    }
  2. 添加一个gradle compile dependency到你的app下的build.gradle文件中。

    compile 'com.google.android.exoplayer:exoplayer:r2.X.X'
  3. 你也可以只添加你需要的库。例如要开发一个只支持DASH内容播放的应用程序,则只需添加依赖Core,DASH和UI库模块。

    compile 'com.google.android.exoplayer:exoplayer-core:r2.X.X'
    compile 'com.google.android.exoplayer:exoplayer-dash:r2.X.X'
    compile 'com.google.android.exoplayer:exoplayer-ui:r2.X.X'

可用模块包括如下:

  • exoplayer-core:包含核心功能,所以必须被添加

  • exoplayer-dash:支持DASH内容

  • exoplayer-hls:支持HLS内容

  • exoplayer-smoothstreaming:支持SmoothStreaming内容

  • exoplayer-ui:UI组件和资源。

2.创建ExoPlayer实例

ExoPlayerFactory提供了多个创建ExoPlayer实例的方法。大多数情况下ExoPlayerFactory.newSimpleInstance方法,该方法返回一个SimpleExoPlayer对象。

//1.创建一个默认的 TrackSelector
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
// 2.创建Player
final SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);

3.将player关联到view上

ExoPlayer提供了一个SimpleExoPlayerView包含了一个PlaybackControlView和用于渲染视频的Surface。

在xml中添加SimpleExoPlayerView

<LinearLayout
    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"
    android:orientation="vertical"
    tools:context="cn.malinkang.multimedia.ExoPlayerSampleActivity">
    <com.google.android.exoplayer2.ui.SimpleExoPlayerView
        android:id="@+id/simpleExoPlayerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

通过setPlayer方法将player和view绑定:

simpleExoPlayerView.setPlayer(player);

4.准备Player

在ExoPlayer中,每一块媒体均由MediaSource表示。要播放一块媒体,您必须先创建一个相应的MediaSource,然后将此对象传递给ExoPlayer.prepare。 ExoPlayer库为DASH(DashMediaSource),SmoothStreaming(SsMediaSource),HLS(HlsMediaSource)和常规媒体文件(ExtractorMediaSource)都提供了MediaSource的实现。以下代码显示如何使用适合播放MP4文件的MediaSource准备播放器。

DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
            Util.getUserAgent(this, "Multimedia"));
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
MediaSource videoSource = new ExtractorMediaSource(
        Uri.parse("file:///android_asset/aimei.mp4"),
        dataSourceFactory, extractorsFactory, mainHandler,
        new ExtractorMediaSource.EventListener() {
            @Override
            public void onLoadError(IOException error) {
                Log.e(TAG, "onLoadError: " + error.getMessage());
            }
        });
player.prepare(videoSource);

按照上面的步骤,我们可以实现一个视频播放的功能。

扩展阅读

上一页CameraX使用下一页GsyVideoPlayer

最后更新于2年前

可以查看上的工程,了解更多的信息。

Bintray
项目主页
The ExoPlayer developer blog
视音频编解码技术零基础学习方法