项目总结(VideoStream网页播放视频)
代码中sd卡下music文件夹的位置:/storage/emulated/0/Music/xxx.mp3
项目使用技术:ButterKnife、RxBinding、RxJava2、IJKPlayer、RecyclerView、IMediaPlayer。
ButterKnife:
以前总是要写很多findViewById来找到View对象,ButterKnife可以省去这些步骤,强大的View绑定和Click事件处理功能。使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。
ButterKnife使用:
1、在Activity 类中绑定 :ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind。
2、在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。
3、使用ButterKnife修饰的方法和控件,不能用private or static 修饰,否则会报错。
4、setContentView()不能通过注解实现。(其他的有些注解框架可以)
5、使用Activity为根视图绑定任意对象时,如果你使用类似MVC的设计模式你可以在Activity 调用ButterKnife.bind(this, activity),来绑定Controller。
6、使用ButterKnife.bind(this,view)绑定一个view的子节点字段。如果你在子View的布局里或者自定义view的构造方法里 使用了inflate,你可以立刻调用此方法。或者,从XML inflate来的自定义view类型可以在onFinishInflate回调方法中使用它。
ButterKnife注解示例:
@BindViews({ R2.id.button1, R2.id.button2, R2.id.button3}) public List<Button> buttonList ;
@BindArray(R2.array.city) //绑定string里面array数组 String [] citys ;
@BindBitmap( R2.mipmap.bm)//绑定Bitmap 资源 public Bitmap bitmap ;
@OnClick(R.id.submitCode,R.id.submitFile,R.id.submitTest) public void sayHi(Button button) {//多个控件对应公共事件button.setText("Success!"); }
IJKPlayer:
ijkplayer是b站开源的视频播放器。Android和ios都可用,还支持多种视频的硬解码。ijkplayer没有提供一个播放器控件给我们使用,所以自己定义一个。主要是创建一个surfaceview,把它赋给IMediaPlayer,自定义了一个监听器继IMediaPlayer的n个listener。在activity中加载so包,设置监听器,设置路径。
//加载native库
IjkMediaPlayer.loadLibrariesOnce(null); I
jkMediaPlayer.native_profileBegin("libijkplayer.so");
ijkPlayer.setListener(...)
ijkPlayer.setVideoPath(path);
SurfaceView:
Surface对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都要画在Surface的Canvas上。传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行。SurfaceView中具有两个Surface, 即双缓冲机制。
SurfaceView就是展示Surface中数据的地方,同时可以认为SurfaceView是用来控制Surface中View的位置和尺寸的。
SurfaceView可以用独立的线程进行绘制,因此可以提供更高的帧率。
SurfaceHolder是一个接口,其作用就像一个关于Surface的监听器,提供访问和控制SurfaceView内嵌的Surface 相关的方法。它通过三个回调方法,让我们可以感知到Surface的创建、销毁或者改变。
Surface、SurfaceView和SurfaceHolder实质上就是广为人知的MVC。Model就是数据模型也就是这里的Surface;View即视图,代表用户交互界面也就是这里的SurfaceView;SurfaceHolder很明显可以理解为Controller。
SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。
Rect:
Rect类主要用于表示坐标系中的一块矩形区域,Rect 其实就是左上右下。
Paint:
Paint即画笔,在绘图过程中极其重要的作用,画笔主要保存了颜色、样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法,大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。
Canvas:
在android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西。除了在画布上绘制之外,还需要设置一些关于画布的属性,比如,画布的颜色、尺寸等。
RecyclerView:
RecyclerView并没有像ListView的点击事件,而是可以在Adapter中设置点击事件以及长按点击事件,如下:
@Override
public void onBindViewHolder(@NonNull MyViewHodler myViewHodler, final int i) {myViewHodler.tv.setText(datas.get(i));myViewHodler.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(MainActivity.this,"点击了第"+i+"个",Toast.LENGTH_SHORT).show();}});
自定义Adapter重写方法onCreateViewHolder(inflate了recyclerView的子布局)、onBindViewHolder(绑定数据)、getItemCount(得到总条数)以及内部类ViewHolder。SwipeRefreshLayout实现下拉刷新,OnScrollListener实现上拉刷新。
优势:低耦合高类聚
IMediaPlayer:
Android下对于音频或者视频的支持均需要使用到MediaPlayer类。
IMediaPlayer使用:
1.在使用start()播放流媒体之前,需要装载流媒体资源。最好使用prepareAsync()用异步的方式装载。在一些硬件不理想的设备上,如果使用prepare()同步的方式装载资源,可能会造成UI界面的卡顿,为了避免还没有装载完成就调用start()而报错的问题,需要绑定MediaPlayer.setOnPreparedListener()事件,在异步装载完成之后回调。
2.MediaPlayer是很消耗系统资源所以使用完不要等待系统自动回收,用release()主动回收资源。
3.对于单曲循环可以使用setLooping()方法进行设置,还可以为MediaPlayer注册播放完毕回调函数MediaPlayer.setOnCompletionListener()。
4.可能一段流媒体前半段可以正常播放中间一段无法播放,可以为MediaPlayer注册回调函数setOnErrorListener()来设置出错之后的解决办法。
RxJava2:
RxJava可以浓缩为异步两个字,其核心的东西不外乎两个, Observables(被观察者) 和 Observable(观察者)。Observables可以发出一系列的事件(例如网络请求、复杂计算、数据库操作、文件读取等),事件执行结束后交给Observable 的回调处理。
观察者模式:举个例子,Android中View的点击监听器的实现,View是被观察者,OnClickListener对象是观察者,Activity要如何知道View被点击了?那就是派一个OnClickListener对象,入驻View,与View达成一个订阅关系,一旦View被点击了,就通过OnClickListener对象的OnClick方法传达给Activity。
如图所示,RxJava的概念分别为:Observable(被观察者,事件源),Observer(观察者,订阅者),subscribe(订阅)、事件;,RxJava 把多个事件看做一个队列,并对每个事件单独处理。在一个队列中 onCompleted() 和 onError(),只有一个会被调用。如果调用了 onCompleted() 就说明队列执行完毕,没有出现异常,否则调用 onError() 方法并终止队列。
响应式编程的组成为Observable/Operator/Subscriber,RxJava在响应式编程中的基本流程如下:
这个流程,可以简单的理解为:Observable -> Operator1 -> Operator2 -> Operator3 -> Subscriber
1. Observable发出一系列事件,他是事件的产生者;
2. Subscriber负责处理事件,他是事件的消费者;
3. Operator是对Observable发出的事件进行修改和变换;
4. 若事件从产生到消费不需要其他处理,则可以省略掉中间的Operator,从而流程变为Obsevable -> Subscriber;
5. Subscriber通常在主线程执行,所以原则上不要去处理太多的事务,而这些复杂的处理则交给Operator;
RxBinding:
1.首先RxBinding
是对Android View事件
的扩展,它使得你可以对View事件
使用RxJava
的各种操作。
2.提供了与RxJava
一致的回调,使得代码简洁明了。尤其是页面中充斥着大量的监听事件,各种各样的匿名内部类时。
3.几乎支持我们常用的所有控件及事件。
RxBinding使用场景:
1.防止按钮重复点击
这个应该是最常用的方法了。利用操作符throttleFirst
()取时间间隔内第一次点击事件。
2.点击的多次监听
Android是不能多次监听同一个点击事件。但利用RxJava
的操作符,例如publish
, share
或replay
可以实现。而RxBinding
恰好支持对点击事件的多次监听。
3.获取验证码倒计时
用interval()
在给定的时间间隔发射从0开始的整数序列。
项目总结(VideoStream网页播放视频)相关推荐
- 某盘视频网页播放视频修改播放速度代码
某网盘视频网页播放控制速度代码 F12打开开发者模式,点击console,粘上下面的代码按回车 videojs.getPlayers("video-player").html5pl ...
- 网页播放视频有声音无图像问题的临时解决办法
问题:网上查阅了很多资料,都没有解决我遇到的问题.我的临时解决办法 可以观看 瞬间黑屏一下然后正常播放后再启用(屏幕切换闪) 我的解决办法:(发现是独立显卡的问题,集成显卡又无法正常设置分辨率)计算机 ...
- 网页播放视频解决代码(来自百度知道)
有5种方法 1.最通用的标签是: <embed src="文件名"> 其中文件名可以取任何一种多媒体文件格式,例如 "a.wma",就会在网页上显示 ...
- FFmpeg系列(二)-Android项目引入FFmpeg库播放视频
在系列一中讲述了如何编译FFmpeg的源码,现在就在Android项目中引入我们编译出来的库,并实现播放一个在线视频的功能 新建Android工程 新建一个支持ndk的Android工程,在AS中新建 ...
- bilibili网页播放视频绿屏的解决办法
小编在用电脑刷网页版bilibili视频是经常会遇到视频绿屏,啥也看不清的情况,每次都是随着视频的播放满满视频画面变得正常,但是这个过程比较缓慢,也比较折磨人,小编在这里分享一个解决办法: 1.点击视 ...
- html5media 网页播放视频,html5media 在IE8播放视频黑屏
(以下是我做的笔记) 使用html5media.js的时候 官网提示你只需要引入这个js就行了 但是实际使用中发现不管是本地文件协议还是http协议在ie8下都无法打开视频或音频 报的错都是无法找到/ ...
- 网页播放视频没有进度条怎么可以实现倍速播放
F12进入开发者模式 点击剪头之后,鼠标指向视频在的位置即可: 2. 看一下视频播放的位置 3. 在Console中运行命令就可以实现倍速 输入命令之后需要用回车来运行: 4. 代码: documen ...
- http-flv协议源码实现(可通过网页播放视频)
FLV数据格式 视频帧:0x09 音频帧:0x08 script帧:0x12 FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧.封装简单等特点,使 ...
- 谷歌浏览器 chrome 网页播放视频 全屏退出死机 解决方法
现象:使用谷歌浏览器全屏看视频在线视频时,退出时全屏电脑假死,使用Alt+F4关闭浏览器无效果 解决方法:浏览器地址栏上输入 chrome://settings/system 进入系统设置 关闭 使用 ...
最新文章
- 工业物联网时代,这五大职业跻身新热门
- React拾遗:Render Props及其使用场景
- 在Linux PC上查看arm交叉编译的可执行文件依赖的动态库
- centos安装android应用程序,centos7软件安装系列【二十一】安装android打包环境
- WaveNet原理简单理解
- Zookeeper和kafka在linux环境下的安装
- 关于Ajax工作原理
- java工作流 表设计_创建activiti工作流所需23张表
- 【Tomcat】安装Tomcat服务器Tomcat的目录结构
- JSP中调用存储过程(SQL2000)
- Asp.net MVC中使用Razor Generator实现View的单元测试
- python中不能使用下标运算的是_下列选项中,不能使用下标运算的是() (3.0分)_学小易找答案...
- 常见反爬虫策略 及应对措施
- 基于巴法云平台的天猫精灵控制开关
- 300多张电脑壁纸打包下载,高清电脑壁纸
- 分享一款统计手机使用时间的APP,帮助集中注意力,拒绝手机上瘾,支持双端
- Android之Edittext禁止输入表情符号(雷惊风)
- 有功,无功,视在功率的关系公式和图
- 全球及中国贴片电容行业市场竞争态势及投资风险预测报告2022-2028年
- 名帖90 蔡襄 楷书《临锺繇帖卷》