博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 全屏视频播放(SurfaceView + MediaPlayer)
阅读量:4696 次
发布时间:2019-06-09

本文共 4490 字,大约阅读时间需要 14 分钟。

介绍个第三方:

  实现Android的全屏视频播放,支持完全自定义UI、手势修改进度和音量、hls、rtsp,设置http头信息,也能在ListView、ViewPager和ListView、ViewPager和Fragment等多重嵌套模式下全屏工作,占用空间非常小,不到60k。

本次是通过 SurfaceView + MediaPlayer 实现 横屏 全屏 播放。

//注意修改:

WindowFeature下的:Window.FEATURE_NO_TITLE, Window.FEATURE_INDETERMINATE_PROGRESS

Fullscreen

AndroidManifest.xml下activity节点添加android:screenOrientation="landscape"

1)通过 AudioManager 控制视频声音。

2)通过getWindow().getAttributes().screenBrightness 获取当前亮度,通过继承SimpleOnGestureListener手势监听onScroll,onSingleTapUp事件,

重新生成

1 WindowManager.LayoutParams lpa = getWindow().getAttributes();2 if (lpa.screenBrightness > 1.0f)3 lpa.screenBrightness = 1.0f;4 else if (lpa.screenBrightness < 0.01f)5 lpa.screenBrightness = 0.01f;6 7 getWindow().setAttributes(lpa);

 

3)activity oncreate 进行初始化 MediaPlayer, SurfaceView Holder

1 if (mediaPlayer == null) { 2             mediaPlayer = new MediaPlayer(); 3             // 不维持自身缓冲区,直接显示 4             // this value only use Hardware decoder before Android 2.3 5             if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB 6                     && mHardwareDecoder) { 7                 sv_videoplayer.getHolder().setType( 8                         SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 9             }10             sv_videoplayer.getHolder().setFixedSize(11                     ScreenUtils.getScreenHeight(this),12                     ScreenUtils.getScreenWidth(this));13 14             sv_videoplayer.getHolder().setFormat(PixelFormat.RGBA_8888);15 16             sv_videoplayer.getHolder().setKeepScreenOn(true);17             sv_videoplayer.getHolder().addCallback(new SurFaceCallback());18         }

4)调用 MediaPlayer 进行播放

1 mediaPlayer.reset();2             mediaPlayer.setDataSource(playUrl);3             mediaPlayer.setDisplay(sv_videoplayer.getHolder());4             // 缓冲5             mediaPlayer.prepareAsync();6             mediaPlayer7                     .setOnBufferingUpdateListener(new BufferingUpdateListener());8             mediaPlayer.setOnPreparedListener(new PreparedListener(position));9             mediaPlayer.setOnCompletionListener(new CompletionListener());

5)在缓冲就绪初始化MediaController

1 /** 2      * //调用该方法,MediaPlayer就进入了"准备就绪" //状态,准备开始播放. //此处可用于动态设置SurfaceView的宽和高 3      *  4      */ 5     private final class PreparedListener implements OnPreparedListener { 6         private int position; 7  8         public PreparedListener(int position) { 9             this.position = position;10         }11 12         @Override13         public void onPrepared(MediaPlayer arg0) {14             // TODO Auto-generated method stub15             //MediaController进行设置和使用  16             mMediaController.setMediaPlayer(VideoPlayerActivity.this);  17             mMediaController.setAnchorView(findViewById(R.id.rl_video_player));  18             mMediaController.setEnabled(true);  19             mMediaController.show(); 20             mediaPlayer.start();21             mProgressBar.setVisibility(View.GONE);22             mLoadRate.setVisibility(View.GONE);23             if (position > 0)24                 mediaPlayer.seekTo(position);25         }26 27     }

6)显示缓冲百分比

1 private final class BufferingUpdateListener implements2             OnBufferingUpdateListener {3 4         @Override5         public void onBufferingUpdate(MediaPlayer arg0, int percent) {6             // TODO Auto-generated method stub7             mLoadRate.setText(percent + "%");8         }9     }

7)使用getHolder().addCallback(new SurFaceCallback()),继承Callback,

SurfaceView 所在Activity 离开了前台,SurfaceView会被destory。当Activity又重新

回到前台时,SurfaceView会被重新创建,SurfaceView是在onResume()方法之后被创建。

防止视频过程中,电话来到,导致视频播放失败。

1 private final class SurFaceCallback implements Callback { 2  3         @Override 4         public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, 5                 int arg3) { 6  7         } 8  9         @Override10         public void surfaceCreated(SurfaceHolder arg0) {11             if (mediaPlayer == null) {12                 return;13             }14             if (playUrl != null && position > 0) {15                 play(position);16                 position = 0;17             }18         }19 20         @Override21         public void surfaceDestroyed(SurfaceHolder arg0) {22             if (mediaPlayer == null) {23                 return;24             }25             if (mediaPlayer.isPlaying()) {26                 mediaPlayer.stop();27             }28         }29     }

 

转载于:https://www.cnblogs.com/CharlesGrant/p/4605198.html

你可能感兴趣的文章
Maven学习笔记
查看>>
FindChildControl与FindComponent
查看>>
1、简述在java网络编程中,服务端程序与客户端程序的具体开发步骤?
查看>>
C# Web版报表
查看>>
中国城市json
查看>>
android下载手动下载Android SDK
查看>>
C++学习:任意合法状态下汉诺塔的移动(原创)
查看>>
学霸修炼的秘籍
查看>>
Duplicate 复制数据库 搭建Dataguard
查看>>
leetcode133 - Clone Graph - medium
查看>>
Mybatis(一)入门
查看>>
DDR工作原理(转)
查看>>
(Frontend Newbie) Web三要素(一)
查看>>
(转载-学习)python wsgi 简介
查看>>
QPushButton 控制两种状态
查看>>
一点小基础
查看>>
PHP 自动加载类 __autoload() 方法
查看>>
JDK中的Timer和TimerTask详解(zhuan)
查看>>
【python练习】ATM&购物商城程序
查看>>
nginx 日志问题(\x22)
查看>>