关于Android视频播放

1.基于HTTP的渐进下载,是在下载完成后再播放的模式基础上做了⼀些⼩的改进。
2.客户端在开始播放前仅需等待⼀段较短的时间⽤于下载和缓冲该媒体⽂件最前⾯⼀部分的数据,之后便可以⼀边下载⼀
边播放。开始播放前的缓冲通常需要⼏⼗秒甚⾄上百秒的时间。
3.只有满⾜特定封装条件的媒体⽂件格式才⽀持渐进下载播放,例如编码参数必须放在⽂件的起始部位,⾳视频⽂件完全
按照时间顺序交织等。
H TTP Live Str ea m ing协议
什么是HTTP Live Streaming?
最初是苹果公司针对其移动设备开发的流媒体协议。
让内容提供者通过普通Web服务器向客户端提供接近实时的⾳视频流媒体服务,包括直播和点播。
⽀持将同⼀节⽬编码为不同码率的多个替换流,客户端可以根据带宽变化在替换流之间智能切换。
⼆、解码
我们播放的视频⽂件都是经过压缩的,因为这样有利于节约存储空间。那么在播放过程,就需要进⾏⼀个反射的解压缩过程。
软解码和硬解码
解码分为硬解码和软解码两种
区别
举个栗⼦,CPU 相当于公司的 CEO ,GPU相当于公司技术总监、产品经理之类,来了⼀个需求,如果采⽤软解码,那就是让 CEO 去画原型,去⼀线写代码,这期间还要忙着各种⼤⼩的事物处理,如果采⽤硬解码,那就是CEO 朝技术总监、产品经理发指令,让他们去完成⼀件事,并且定期查询完成的程度。
硬解码:就是调⽤GPU的专门模块进⾏解码,由显卡核⼼GPU来对视频进⾏解码⼯作。
软解码:通过软件让CPU来对视频进⾏解码处理。
优缺点
⽹上看到⼀句话,“硬解码是将原来全部交由CPU来处理的视频数据的⼀部分交由GPU来做,⽽GPU的并⾏运算能⼒要远远⾼于CPU,这样可以⼤⼤的降低对CPU的负载,CPU的占⽤率较低了之后就可以同时运⾏⼀些其他的程序了。”
两者优缺点:
2.jpg
上⾯对⽐中⼀个是功耗⼀个是总功耗,这个也很容易理解,GPU的电路更复杂,并⾏运算能⼒要远远⾼于CPU,于是耗电量就更⾼,GPU功耗⼤,但运⾏速度提升更多,功耗 = 功率 * 时间,所以就算功率乘个4,但是时间除以个10,总耗能还是降低。
选择:说不上那个好,各有优点。我感觉硬解更好⼀些。过于占⽤CPU太耗性能。
三、播放器
⽬前播放器⽐较⽕热的有Android系统⾃带的MediaPalyer,还有google的ExoPlayer
3.1我们先说⼀下MediaPlayer
MediaPlayer处于Android多媒体包下"dia.MediaPlayer",仅有⼀个⽆参的构造函数,虽然Android平台仅为我们提供了⼀个⽆参的构造函数,但是为了⽅便我们初始化,还为我们提供了⼏个静态的`create()⽅法⽤于完成MediaPlayer初始化的⼯作。(常⽤的两个)
static MediaPlayer create(Context context,int resid):通过给定的Id来创建⼀个MediaPlayer实例。
static MediaPlayer create(Context context,Uri uri):通过给定的Uri来创建⼀个MediaPlayer实例。
还有⼀些重载的create⽅法。
MediaPlayer具体⽅法介绍:
void setDataSource(String path) 通过⼀个具体的路径来设置MediaPlayer的数据源,path可以是本地的⼀个路径,也可以是⼀个⽹络路径void setDataSource(Context context, Uri uri) 通过给定的Uri来设置MediaPlayer的数据源,这⾥的Uri可以是⽹络路径或是⼀个ContentProvider的Uri。
void setDataSource(MediaDataSource dataSource) 通过提供的MediaDataSource来设置数据源
void setDataSource(FileDescriptor fd) 通过⽂件描述符FileDescriptor来设置数据源
int getCurrentPosition() 获取当前播放的位置
int getAudioSessionId() 返回⾳频的session ID
int getDuration() 得到⽂件的时间
TrackInfo[] getTrackInfo() 返回⼀个track信息的数组
boolean isLooping () 是否循环播放
boolean isPlaying() 是否正在播放
void pause () 暂停
void start () 开始
void stop () 停⽌
void prepare() 同步的⽅式装载流媒体⽂件。
void prepareAsync() 异步的⽅式装载流媒体⽂件。
void reset() 重置MediaPlayer⾄未初始化状态。
void release () 回收流媒体资源。
void seekTo(int msec) 指定播放的位置(以毫秒为单位的时间)
void setAudioStreamType(int streamtype) 指定流媒体类型
void setLooping(boolean looping) 设置是否单曲循环
void setNextMediaPlayer(MediaPlayer next) 当 当前这个MediaPlayer播放完毕后,MediaPlayer next开始播放
void setWakeMode(Context context, int mode):设置CPU唤醒的状态。
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) ⽹络流媒体的缓冲变化时回调setOnCompletionListener(MediaPlayer.OnCompletionListener listener) ⽹络流媒体播放结束时回调
setOnErrorListener(MediaPlayer.OnErrorListener listener) 发⽣错误时回调
setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当装载流媒体完毕的时候回调。
在使⽤MediaPlayer播放⼀段流媒体的时候,需要使⽤prepare()或prepareAsync()⽅法把流媒体装载进MediaPlayer,才可以调⽤start()⽅法播放流媒体。
在使⽤start()播放流媒体之前,需要装载流媒体资源。这⾥最好使⽤prepareAsync()⽤异步的⽅式装载流媒体资源。因为流媒体资源的装载是会消耗系统资源的,在⼀些硬件不理想的设备上,如果使⽤prepare()同步的⽅式装载资源,可能会造成UI界⾯的卡顿,这是⾮常影响⽤于体验的。

本文发布于:2024-09-23 15:28:19,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/91159.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:播放   流媒体   解码   设置   时间
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议