class VideoPlayer : FrameLayout, TextureView.SurfaceTextureListener{

    private var url:String? = null
private var headers:Map<String,String>? = null
private var mediaPlayer: IMediaPlayer? = null //播放器
private var container: FrameLayout? = null //播放器根目录
private var textureView: TextureView? = null //视频显示视图
private var surfaceTexture: SurfaceTexture? = null
private var playerType:Int = PlayerTypes.TYPE_IJK
private var surface: Surface? = null constructor(context: Context, attributeSet: AttributeSet):super(context,attributeSet){
init()
} /**
* 设置播放器类型
*
* @param playerType IjkPlayer or MediaPlayer.
*/
fun setPlayerType(playerType: Int) {
this.playerType = playerType
} fun setUp(url:String,headers:Map<String,String>?){
this.url = url
this.headers = headers
} fun start(){
mediaPlayer?.start()
} private fun init(){
container = FrameLayout(context)
this.removeView(container)
val params = LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT
)
this.addView(container,params) initTextureView()
initMediaPlayer()
} private fun initTextureView(){
if(textureView == null){
textureView = TextureView(context)
textureView?.surfaceTextureListener = this
}
container?.removeView(textureView)
val params = LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT,
Gravity.CENTER
)
container?.addView(textureView,0,params)
} private fun initMediaPlayer(){
if(mediaPlayer == null){
when(playerType){
PlayerTypes.TYPE_IJK -> mediaPlayer = IjkMediaPlayer()
PlayerTypes.TYPE_NATIVE -> mediaPlayer = AndroidMediaPlayer()
else -> mediaPlayer = IjkMediaPlayer()
}
} mediaPlayer?.setOnVideoSizeChangedListener { player, w, h, sar_num, sar_den ->
Log.d("======","setOnVideoSizeChangedListener")
} mediaPlayer?.setOnErrorListener { player, what, extra ->
Log.d("======","setOnErrorListener")
true
} mediaPlayer?.setOnCompletionListener {
Log.d("======","setOnCompletionListener")
} mediaPlayer?.setOnPreparedListener {
Log.d("======","setOnPreparedListener")
} mediaPlayer?.setOnInfoListener { player, what, extra ->
Log.d("======","setOnInfoListener")
true
} mediaPlayer?.setOnBufferingUpdateListener { player, percent ->
Log.d("======","setOnBufferingUpdateListener") } openMediaPlayer()
} private fun openMediaPlayer(){
mediaPlayer?.setDataSource(context, Uri.parse(url),headers)
mediaPlayer?.prepareAsync()
} override fun onSurfaceTextureSizeChanged(p0: SurfaceTexture?, p1: Int, p2: Int) { } override fun onSurfaceTextureUpdated(p0: SurfaceTexture?) { } override fun onSurfaceTextureDestroyed(p0: SurfaceTexture?): Boolean {
return p0 == null
} override fun onSurfaceTextureAvailable(p0: SurfaceTexture?, p1: Int, p2: Int) {
if(surfaceTexture == null){
surfaceTexture = p0
if(surface == null){
surface = Surface(surfaceTexture)
}
mediaPlayer?.setSurface(surface)
}else{
textureView?.surfaceTexture = surfaceTexture
}
} }

就是简单实现播放功能,其他的以后在添加

video_view.setPlayerType(PlayerTypes.TYPE_IJK)
video_view.setUp(VideoDatas.videoUrls[2],null)
video_view.start()

最新文章

  1. 十DHT11
  2. db2 重启
  3. 坑!坑!坑!防不胜防的unsigned int的运算
  4. 使用PHP的五个小技巧
  5. IIS7.0配置网站时,提示“ISAPI 和 CGI 限制”
  6. inotify+rsync目录实时同步
  7. JavaScript实现多栏目切换效果
  8. sql使用存储过程和交易
  9. 【C语言探索之旅】 第二部分第七课:文件读写
  10. WebService使用入门(包括发布服务,调用服务)
  11. 写给Android App开发人员看的Android底层知识(8)
  12. luogu P5304 [GXOI/GZOI2019]旅行者
  13. mysql zip包安装,本地安装两个mysql
  14. bzoj2007 NOI2010 海拔(对偶图)
  15. LeetCode--014--最长公共前缀(java)
  16. linux邮件系统的优势和便利性
  17. 【MySQL】MySQL之浅谈MySQL的存储引擎
  18. C++ 重载new和delete
  19. Internet History, Technology and Security (Week3)
  20. Beta阶段第2周/共2周 Scrum立会报告+燃尽图 09

热门文章

  1. 一个算法题--Self Crossing
  2. 从结构和数字看OO——面向对象设计与构造第一章总结
  3. Java线程——线程之间的通信
  4. linux下的hashpump安装
  5. mui 上拉加载
  6. JavaEE--使用百度echarts实现地图报表
  7. rename 修改文件名
  8. neo4jcypher基本语句
  9. 约数个数函数(d)的一个性质证明
  10. 104. HttpRequest对象详解