textureview 缩放_用MediaPlayer+TextureView封装一个完美实现全屏、小窗口的视频播放器...

本文介绍了如何使用MediaPlayer和TextureView封装一个视频播放器,实现全屏和小窗口播放。TextureView允许视频内容在View中进行变换,适合自定义布局。MediaPlayer负责视频播放,其状态管理和接口较多。通过NiceVideoPlayer类封装MediaPlayer,分离播放逻辑和UI,提供全屏、小窗口功能,同时考虑了缓冲、播放状态的处理。文章提供了源码链接供读者参考。
摘要由CSDN通过智能技术生成

原标题:用MediaPlayer+TextureView封装一个完美实现全屏、小窗口的视频播放器

本文作者

本文由xiaoyanger授权发布。

xiaoyanger的博客地址:

http://www.jianshu.com/u/25c3b13f87ce

贴个简易的效果图:

1

为什么使用TextureView

在Android总播放视频可以直接使用VideoView,VideoView是通过继承自SurfaceView来实现的。

SurfaceView的大概原理就是在现有View的位置上创建一个新的Window,内容的显示和渲染都在新的Window中。这使得SurfaceView的绘制和刷新可以在单独的线程中进行,从而大大提高效率。

但是呢,由于SurfaceView的内容没有显示在View中而是显示在新建的Window中, 使得SurfaceView的显示不受View的属性控制,不能进行平移,缩放等变换,也不能放在其它RecyclerView或ScrollView中,一些View中的特性也无法使用。

TextureView是在4.0(API level 14)引入的,与SurfaceView相比,它不会创建新的窗口来显示内容。它是将内容流直接投放到View中,并且可以和其它普通View一样进行移动,旋转,缩放,动画等变化。TextureView必须在硬件加速的窗口中使用。

TextureView被创建后不能直接使用,必须要在它被它添加到ViewGroup后,待SurfaceTexture准备就绪才能起作用(看TextureView的源码,TextureView是在绘制的时候创建的内部SurfaceTexture)。

通常需要给TextureView设置监听器SurfaceTextuListener:

SurfaceTexture的准备就绪、大小变化、销毁、更新等状态变化时都会回调相对应的方法。当TextureView内部创建好SurfaceTexture后,在监听器的onSurfaceTextureAvailable方法中,用SurfaceTexture来关联MediaPlayer,作为播放视频的图像数据来源。

SurfaceTexture作为数据通道,把从数据源(MediaPlayer)中获取到的图像帧数据转为GL外部纹理,交给TextureVeiw作为View heirachy中的一个硬件加速层来显示,从而实现视频播放功能。

2

MediaPlayer介绍

MediaPlayer是Android原生的多媒体播放器,可以用它来实现本地或者在线音视频的播放,同时它支持https和rtsp ( https://developer.android.google.cn/guide/topics/media/media-formats.html)。

MediaPlayer定义了各种状态,可以理解为是它的生命周期。

这个状态图描述了MediaPlayer的各种状态,以及主要方法调用后的状态变化。

MediaPlayer的相关方法及监听接口:

方法

介绍

状态

setDataSource

设置数据源

Initialized

prepare

准备播放,同步

Preparing —> Prepared

prepareAsync

准备播放,异步

Preparing —> Prepared

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值