Android基础之网络视频播放器

来源:互联网 发布:win10系统优化软件 编辑:程序博客网 时间:2024/05/19 23:03

版权声明:本文为博主原创文章,未经博主允许不得转载。

开发步骤:

视频播放器
1.一般视频播放器的界面是横屏的  全屏
2.准备好视频文件(暂停)
3.视频播放器=MediaPlayer播放音频+界面
4.SurfaceView Surface表皮/皮肤     双缓冲视图
java.lang.IllegalArgumentException: The surface has been released
说人话:SurfaceView被释放了--->SurfaceView压根就没有---->SurfaceView还没初始化
因为SurfaceView是用来播放视频的  在内部需要先准备一下数据 才能去播放(需要一段时间)
5.什么时候SurfaceView准备完? holder.addCallback()
6.播放的正常情况下应该有个进度条?
7.拖动之后没有效果
8.当没人去触摸界面的时候  进度条会自动隐藏掉  当再次点击屏幕的时候 进度条会出现 然后过了一会后继续隐藏




网络视频:
1.远程服务器下的视频数据在加载的时候 可能没那么快 导致了黑屏
2.出现了黑白屏(缓冲数据)---->应该在中间设置一个加载框


MediaPlayer的操作:
1.new MediaPlayer()--->IDLE空闲状态
2.设置数据源 setDataSource()
3.准备播放的数据 prepare()
4.开始播放 start()-------------------------------->正在播放视频
如果你想播放其他的音乐 但是已经有音乐在播放了--->reset() 重置播放器 释放原有资源
stop()停止
pause()暂停--->是可以恢复的--->start()
音乐播放完成--->也是可以恢复的--->start()




* 如果是网络数据 一般调用准备播放的数据 prepareAsync()
当OnPreparedListener.onPrepared()被调用的时候 说明数据就准备完毕了
* 当资源不再使用 或者说 播放器不想要了 可以调用release()去释放资源
* 为了提供用户的体验 当播放失败的时候 提醒用户 可以调用OnErrorListener.onError();





public class MainActivity extends Activity implements OnSeekBarChangeListener,OnTouchListener {private MediaPlayer mMediaPlayer;private SurfaceView mSurfaceView;private SeekBar mVedioSkb;protected Timer mTimer;private Timer mVedioSkbTimer;private ProgressBar mLoadingPb;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);// 给SurfaceView设置一个触摸的监听器mSurfaceView.setOnTouchListener(this);mLoadingPb = (ProgressBar) findViewById(R.id.loading_pb);mVedioSkb = (SeekBar) findViewById(R.id.vedio_skb);// 给SeekBar设置一个拖动事件的监听器mVedioSkb.setOnSeekBarChangeListener(this);// 过了2秒后 进度条自动隐藏hideVedioSkbAfter2Seconds();// SurfaceHolder管理界面播放的一个控制器SurfaceHolder holder = mSurfaceView.getHolder();// 给holder设置一个SurfaceView准备数据的监听器holder.addCallback(new Callback() {@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}// mSurfaceView 准备完毕的时候调用的@Overridepublic void surfaceCreated(final SurfaceHolder holder) {try {if (mMediaPlayer == null) {mMediaPlayer = new MediaPlayer();// 设置网络视频数据Uri uri = Uri.parse("http://192.168.14.130:8080/oppo.3gp");mMediaPlayer.setDataSource(MainActivity.this, uri);mMediaPlayer.prepareAsync();// 异步加载数据的情况下 需要给mMediaPlayer设置一个异步准备数据的操作// 以避免加载框转动的时候出现卡顿mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {// 异步准备数据完毕后 该方法就会被调用@Overridepublic void onPrepared(MediaPlayer mp) {//播放之前 需要隐藏加载框mLoadingPb.setVisibility(View.GONE);mMediaPlayer.start();// 关联音频与界面mMediaPlayer.setDisplay(holder);// 设置进度条总进度mVedioSkb.setMax(mMediaPlayer.getDuration());// 创建一个定时器 设置进度条的当前进度mTimer = new Timer();mTimer.schedule(new TimerTask() {// 该方法是运行在子线程中的@Overridepublic void run() {// 在子线程中调用mVedioSkb的setProgress()// 它在内部会返回主线程操作UImVedioSkb.setProgress(mMediaPlayer.getCurrentPosition());}}, 500, 500);}});}else{mMediaPlayer.setDisplay(holder);}} catch (Exception e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format,int width, int height) {}});}private void hideVedioSkbAfter2Seconds() {mVedioSkbTimer = new Timer();mVedioSkbTimer.schedule(new TimerTask() {@Overridepublic void run() {runOnUiThread(new Runnable() {@Overridepublic void run() {mVedioSkb.setVisibility(View.GONE);}});}}, 2 * 1000);}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// TODO Auto-generated method stub}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}// 在拖动完成后 首先获取SeekBar当前进度 修改视频的播放进度@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {int progress = seekBar.getProgress();mMediaPlayer.seekTo(progress);}@Overridepublic boolean onTouch(View v, MotionEvent event) {// 首先让mVedioSkb显示出来mVedioSkb.setVisibility(View.VISIBLE);// 过了2秒后再次隐藏hideVedioSkbAfter2Seconds();return false;}@Overrideprotected void onRestart() {// 恢复播放mMediaPlayer.start();super.onRestart();}@Overrideprotected void onStop() {// 暂停播放器,mMediaPlayer.pause();super.onStop();}/* * 退出销毁资源 */@Overrideprotected void onDestroy() {mMediaPlayer.stop();mMediaPlayer.release();mMediaPlayer=null;super.onDestroy();}}

修改主题

<application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.m520it.httpPlayer.MainActivity"            android:label="@string/app_name"             android:theme="@android:style/Theme.NoTitleBar.Fullscreen"            android:screenOrientation="landscape" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application>





























原创粉丝点击