google出版的exoplayer使用:

背景:项目最近要用到exoplayer播放远程摄像头录制的视频,原代码已经有写过,但视频不能重复播放的,基于此点经行修改

/*** Created  on  2019/05/29.* interface by** @author fengzimin*/
public class SimpleExoPlayerHelper {private final Context mContext;private SimpleExoPlayer mSimpleExoPlayer;private ConcatenatingMediaSource mConcatenatingMediaSource;private static SimpleExoPlayerHelper simpleExoPlayerHelper;public SimpleExoPlayerHelper(Context context, PlayerView playerView) {mContext = context;// 创建带宽BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();// 创建轨道选择工厂TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);// 创建轨道选择器实例TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);//step2. 创建播放器mSimpleExoPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelector);playerView.setPlayer(mSimpleExoPlayer);mConcatenatingMediaSource = new ConcatenatingMediaSource();}public static SimpleExoPlayerHelper createMySimpleExoPlayer(Context context, PlayerView playerView) {simpleExoPlayerHelper = new SimpleExoPlayerHelper(context, playerView);return simpleExoPlayerHelper;}/*** @return 提供simpleExoPlayer对象,实现其他功能*/public SimpleExoPlayer getSimpleExoPlayer() {return mSimpleExoPlayer;}public SimpleExoPlayerHelper prepare(List<String> urls) {for (String url : urls) {MediaSource mediaSource = buildMediaSource(url);mConcatenatingMediaSource.addMediaSource(mediaSource);}mSimpleExoPlayer.prepare(mConcatenatingMediaSource);return simpleExoPlayerHelper;}public SimpleExoPlayerHelper prepare(String url) {List<String> strings = new ArrayList<>();strings.add(url);prepare(strings);return simpleExoPlayerHelper;}public enum RepeatMode {REPEAT_MODE_ALL(Player.REPEAT_MODE_ALL),REPEAT_MODE_ONE(Player.REPEAT_MODE_ONE),REPEAT_MODE_OFF(Player.REPEAT_MODE_OFF);private int mMode;RepeatMode(int repeatMode) {mMode = repeatMode;}public int getMode() {return mMode;}public void setMode(int mode) {mMode = mode;}}/*** 设置循环样式** @param repeatMode* @return*/public SimpleExoPlayerHelper setRepeatMode(RepeatMode repeatMode) {mSimpleExoPlayer.setRepeatMode(repeatMode.getMode());return simpleExoPlayerHelper;}public SimpleExoPlayerHelper setPlayWhenReady(boolean playWhenReady) {mSimpleExoPlayer.setPlayWhenReady(playWhenReady);return simpleExoPlayerHelper;}public void stop() {mSimpleExoPlayer.stop();}public void pause() {boolean playWhenReady = mSimpleExoPlayer.getPlayWhenReady();if(playWhenReady) {mSimpleExoPlayer.setPlayWhenReady(false);}}public void start() {boolean playWhenReady = mSimpleExoPlayer.getPlayWhenReady();if(!playWhenReady) {mSimpleExoPlayer.setPlayWhenReady(true);}}public void release() {mSimpleExoPlayer.release();}private MediaSource buildMediaSource(String url) {String proxyUrl = getProxyUrl(url);return newVideoSource(proxyUrl);}/*** 获取带缓存的视频url** @param originalUrl* @return*/private String getProxyUrl(String originalUrl) {HttpProxyCacheServer proxy = VideoCacheProxy.getProxy(mContext);return proxy.getProxyUrl(originalUrl);}/*** 构造播放数据** @param url* @return*/private MediaSource newVideoSource(String url) {//测量播放过程中的带宽。 如果不需要,可以为null。DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();// 生成加载媒体数据的DataSource实例。DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(mContext,Util.getUserAgent(mContext, "useExoplayer"), bandwidthMeter);// 生成用于解析媒体数据的Extractor实例。ExtractorMediaSource.Factory factory = new ExtractorMediaSource.Factory(dataSourceFactory);ExtractorMediaSource mediaSource = factory.createMediaSource(Uri.parse(url));//        ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();//        return new ExtractorMediaSource(Uri.parse(url), dataSourceFactory, extractorsFactory, null,//                null);return mediaSource;}
}

设置缓存

public class App extends Application implements VideoCacheProxy.AppWrapper {private HttpProxyCacheServer mProxy;private HttpProxyCacheServer newProxy() {// 这里的配置可以修改,参考上面的“这里”return new HttpProxyCacheServer.Builder(this)// 视频缓存文件所在的文件夹,可以进行修改.cacheDirectory(VideoCacheProxy.getVideoCacheDir(this)).build();}@Overridepublic HttpProxyCacheServer getVideoCacheProxy() {return mProxy == null ? (mProxy = newProxy()) : mProxy;}
}

使用方法:

1.导入依赖包

    //exoplayer播放器implementation 'com.google.android.exoplayer:exoplayer:2.8.4'// 视频缓存implementation 'com.danikula:videocache:2.7.0'

2.xml布局中添加PlayerView

<com.google.android.exoplayer2.ui.PlayerViewandroid:id="@+id/exo_play_2"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"app:layout_constraintTop_toTopOf="parent"/>

3.使用工具类

    private void initExo2() {//播放的数据源List<String> strings = new ArrayList<>();strings.add("https://lixiang.https.xiaozhuschool.com/statics/images/shiping/1556521397576.mp4");strings.add("https://lixiang.https.xiaozhuschool.com/statics/images/shiping/net1.mp3");strings.add("https://lixiang.https.xiaozhuschool.com/statics/images/shiping/1556521318783.mp4");//设置mSimpleExoPlayerHelper1 = SimpleExoPlayerHelper.createMySimpleExoPlayer(this, mExoPlay2).prepare(strings).setRepeatMode(SimpleExoPlayerHelper.RepeatMode.REPEAT_MODE_ONE).setPlayWhenReady(true);//是否显示默认进度条mExoPlay.setUseController(true);}

VideoCacheProxy 类:

public class VideoCacheProxy {public static HttpProxyCacheServer getProxy(Context context) {Context app = context.getApplicationContext();AppWrapper wrapper = null;try {wrapper = (AppWrapper) app;return wrapper.getVideoCacheProxy();} catch (Exception e) {e.printStackTrace();throw new ClassCastException("Application not implemented com.example.communication.VideoCacheProxy.AppWrapper");}}public static File getVideoCacheDir(Context context) {return new File(context.getExternalCacheDir(), "video-cache");}public interface AppWrapper {HttpProxyCacheServer getVideoCacheProxy();}
}

android之exoplayer相关推荐

  1. Android 原生ExoPlayer 解析

    1.简述与应用范围 ExpPlayer是一个开源的,App等级的媒体API,它的开源项目包含了library和示例. ExoPlayer相较于MediaPlayer有很多优点: 1. 支持基于http ...

  2. Android 使用ExoPlayer视频播放 (二)

    一.缓存 1.使用ExoPlayer自带的缓存机制(匹配完整的url地址,相同则使用本地缓存文件播放,视频地址具有时效性参数时无法正确缓存) 创建缓存文件夹 public class CachesUt ...

  3. Android使用ExoPlayer播放音频实现报听写功能

    项目中需要实现报听写的功能,音频都是后台一个一个返回的链接,考虑到多个音频的连续播放,就选用了google的Exoplayer,主要实现随机播放,按次数播放(这里最多播放3次)的功能,ExoPlaye ...

  4. android exo解码问题,android – 使用ExoPlayer再现加密视频

    我在 Android中使用 ExoPlayer,我正在尝试重现本地存储的加密视频. ExoPlayer的模块化允许创建可以注入到ExoPlayer中的自定义组件,这种情况似乎如此.事实上,经过一些研究 ...

  5. Android进阶——ExoPlayer源码分析之宽带预测策略的算法详解

    前言 由于国内基础设施非常优秀,在平时的开发中,很少会关注网络情况,很容易忽略弱网情况下的网络状况,如果项目属于国外App,则需要考虑到当前的基础设施和网络情况,特别是播放视频的时候,需要通过动态调整 ...

  6. Android视频播放器Google Exoplayer

    最近开发的项目涉及音频.视频播放,搜索了解到ExoPlayer2.x可以很好的满足需求,现在跟大家分享一下. ExoPlayer库的核心是ExoPlayer接口.ExoPlayer 接口暴露了传统的 ...

  7. ExoPlayer 开发者指导

    ExoPlayer 开发者指导 字数2134 阅读12051 评论36 喜欢32 原文地址 想深入了解ExoPlayer的童鞋可以查看我的另外一篇文章:ExoPlayer源码浅析 Developer ...

  8. Android TV开发(—)开始电视应用

    官网:https://developer.android.com/training/tv/start/start.html 确定支持的媒体格式 点击查看以下各项的文档,了解在Android TV上的编 ...

  9. ExoPlayer漫谈之解码器复用

    播放器性能的极致优化,就是要发现播放流程中一点一滴的耗时,然后分析这些耗时,并提出有效的方式解决这些耗时.了解过ExoPlayer播放器的同学们都知道ExoPlayer的解码是依赖Android系统提 ...

  10. 开发android电视app

    翻译原文:https://developer.android.com/training/tv/start/start.html#run 开始创建TV 电视应用程序的开发与手机和平板电脑具有相同的结构, ...

最新文章

  1. 堆栈,静态变量和普通变量,静态函数和普通函数的区别
  2. 电销机器人价格_供应商电话销售机器人服务为先
  3. Oracle 子查询
  4. U66785 行列式求值
  5. minio获取上传文件_Springboot集成Minio实现对象存储服务
  6. 人工智能 之 机器学习常用算法总结 及 各个常用分类算法精确率对比
  7. word模板Normal.dotm文件的生成与替换
  8. VMware虚拟机安装WIN7操作系统
  9. CAD图纸一键共享,永久轻松办公!
  10. 58同城峰会落幕 智能化平台和下沉市场能让继续神奇吗?
  11. 远程网络教学系统用例图
  12. 开源)Java生成二维码分享海报
  13. 安装SVN后,更新项目没有对号等图标
  14. TFTP文件传输NFS挂载ARM开发板移植Linux系统步骤
  15. stm32 I2C总线入门笔记
  16. RTMP,RTSP,HLS 流服务器
  17. 07uec++多人游戏【瞄准镜效果】
  18. 解决ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
  19. param name=allowScriptAccess value=never/是什么意思
  20. 我上了985,211,才发现自己一无所有 | 或者,也不能这么说

热门文章

  1. 用计算机上初中英语课的方法,如何上好初中英语读写课
  2. 局域网 以太网 令牌环网(二)
  3. 36令牌环网的基本原理
  4. 魅族手机无信号无服务器,魅族手机没有信号的解决教程
  5. ManualResetEvent类的用法
  6. QT相关内容的下载链接
  7. java 传智播客 毕向东_传智播客:毕向东Java基础视频教程(全5)压缩包电驴下载...
  8. UE4实时渲染需要注意的点——RTR(Real Time Rendering)
  9. linux根分区inode满了该怎么办,linux inode已满解决方法 新的问题No space left on device...
  10. linux没有telnet命令