1 前言

​ 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 被注入。

2 案例

​ (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>

3 拓展

​ (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】使用Exoplayer播放视频的更多相关文章

  1. Android 视频播放器 (四):使用ExoPlayer播放视频

    一.简介 ExoPlayer是一个Android应用层的媒体播放器,它提供了一套可替换Android MediaPlayer的API,可以播放本地或者是线上的音视频资源.ExoPlayer支持一些An ...

  2. Windows及Android倍速播放视频软件下载

    目录 1. 更多推荐 2. 关键字 3. 按 4. 软件下载 4.1. IOS应用商店 4.2. 网盘下载 5. 软件介绍 5.1. PotPlayer(Windows) 5.2. MoboPlaye ...

  3. Android使用TextureView播放视频

    1.引言 如果你想显示一段在线视频或者任意的数据流比如视频或者OpenGL 场景,你可以用android中的TextureView做到. 1).TextureView的兄弟SurfaceView 应用 ...

  4. 不完全解决Android微信HTML5 播放视频的问题(不显示控制条,可交互)

    首先你需要知道以下内容: http://ad.weixin.qq.com/learn/2-3-3--%E9%80%9A%E7%94%A8%E5%BA%93 这是微信为广告商开放的API,我一直认为只有 ...

  5. android SurfaceView中播放视频 按视频的原始比例播放

    OnPreparedListener mediaPlayerOnPreparedListener = new OnPreparedListener() { @Override public void ...

  6. Android三种播放视频的方式

    在Android中,我们有三种方式来实现视频的播放: 1.使用其自带的播放器.指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型. 2.使用VideoView来播放. ...

  7. Android VideoView简单播放视频

    给Android VideoView一个文件目录,就可以直接播放智能设备中的视频文件,现在以播放事先用手机拍好并重命名的视频文件test.mp4为例.(1) 需要在布局文件中写一个ViedoView: ...

  8. android采用videoView播放视频(包装)

    //android播放视频.用法:于androidManifest.xml添加activity, // <activity android:name=".PlayVideo" ...

  9. Android 使用MediaPlayer 播放 视频

    http://pan.baidu.com/s/1lgKLS package cn.bgxt.surfaceviewdemo; import java.io.File; import android.m ...

  10. Android videoview循环播放视频

    如何在一个activity里实现videoview对一个文件夹下的所有视频文件顺序循环播放,当切换界面时暂停, 切换回来继续原来的视频播放呢.所谓的 自动循环播放就是监听到视频播放结束之后继续重新播放 ...

随机推荐

  1. [转帖]银河麒麟v10下载(服务器版 桌面版) - 2023-11-14更新

    银河麒麟v10下载(服务器版 桌面版) - 2023-11-14更新 如需转载请标明出处:[http://blog.csdn.net/itas109] 文章目录 银河麒麟v10下载(服务器版 桌面版) ...

  2. [转帖]HBase实战:记一次Safepoint导致长时间STW的踩坑之旅

    https://mp.weixin.qq.com/s/GEwD1B-XqFIudWP_EbGgdQ     ​过 程 记 录 现象:小米有一个比较大的公共离线HBase集群,用户很多,每天有大量的Ma ...

  3. [粘贴]Introducing Exadata X9M: Dramatically Faster, More Cost Effective, and Easier to Use

    https://blogs.oracle.com/exadata/post/exadata-x9m   The Exadata Product Management and Development t ...

  4. [转帖]CentOS7使用Chrony实现时间同步

    学习安装部署 ceph 时 ,在添加 mon 时报错了,搜索原因后发现是 时间同步问题.于是学习一下时间同步工具. 一般CentOS6 使用的时间同步工具是ntp.现在还有不少开源软件文档建议安装的时 ...

  5. [转帖]龙叔学ES:Elasticsearch XPACK安全认证

    https://juejin.cn/post/7081994919237287950 本文已参与「新人创作礼」活动,一起开启掘金创作之路. Elasticsearch往往存有公司大量的数据,如果安全不 ...

  6. [转帖]oswatch--Linux

    https://www.fengnayun.com/news/content/46922.html 一 官方参考OSWatcher (Includes: [Video]) (文档 ID 301137. ...

  7. [转帖]设置LD_LIBRARY_PATH不起作用(失效)

    部分Linux系统设置LD_LIBRARY_PATH变量,并不能生效,此时需要将变量值写入/etc/ld.so.conf文件中,如下所示: include ld.so.conf.d/*.conf in ...

  8. [转帖]【测试】 FIO:ceph/磁盘IO测试工具 fio(iodepth深度)

    目录 随看随用 NAS文件系统测试 块系统测试 FIO用法 FIO介绍 FIO 工具常用参数: FIO结果说明 I/O 的重放('录'下实际工况的IO,用fio'重放') fio工作参数可以写入配置文 ...

  9. ChatGPT 提高工作效率-一例SQL编写的过程

    ChatGPT 提高工作效率-一例SQL编写的过程 前言 遇到一个问题, 怀疑是有一些补丁没有被依赖. 导致第一次更新时没有更新这些没依赖的补丁. 后面更新时又更新了这些游离态的补丁. 导致出现 ol ...

  10. [转帖]官网:Nacos的授权验证

    https://nacos.io/zh-cn/docs/v2/guide/user/auth.html 注意 Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安 ...