Android视频播放框架Vitamio集成及使用MediaPlayer+SurfaceView、VideoView+MediaController实现播放网络视频
来源:互联网 发布:叉叉助手最新源码 编辑:程序博客网 时间:2024/09/21 08:56
工作内容:
准备工作【集成Vitamio】
1.使用Vitamio框架中的VideoView,MediaController播放本地视频和网络视频
2.使用Vitamio的MediaPlayer+SurfaceView(用于得到SurfaceHolder)来播放视频
3.自定义MediaController,让其播放控制栏更好用【可以放其他的控件来控制VideoView的播放状态】
【注意:使用前需先执行vitamio的初始化操作【Vitamio.initialize(this)】】
学习分享:
使用Vitamio的原因是:Vitamio能够解析很多格式的视频(MKV,FLV,MP4,MOV,TS,RMVB,MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播),而我们系统自带的VideoView仅可以播放MP4,,3GP格式的视频。
【集成Vitamio】
1.在github上下载/clone“vitamio”地址:https://github.com/yixia/VitamioBundle
2.将VitamioBundle解压后,通过new —— import Module导入vitamio文件夹【出错,修改build.gradle中的compileSdkVersion,buildToolsVersion与你常用的一致即可】导入成功。
3.将vitamio添加为你原来的app的Module依赖,完成即可使用。
一、使用Vitamio框架中的VideoView,MediaController播放本地视频和网络视频
1.java代码:
import android.net.Uri;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import java.io.File;import io.vov.vitamio.MediaPlayer;import io.vov.vitamio.Vitamio;import io.vov.vitamio.widget.MediaController;import io.vov.vitamio.widget.VideoView;public class Demo_5_Activity extends AppCompatActivity { private VideoView videoView; private TextView tvProgress; private TextView tvDownloadSpeed; private String urlString = "http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com/D046015255134077DDB3ACA0D7E68D45.flv"; private MediaController controller; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo_5_); File file = Environment.getExternalStorageDirectory(); File file1 = new File(file,"a11.mp4"); //判断Vitamio是否已经初始化【并且初始化】 if (Vitamio.initialize(this)) { videoView = (VideoView) findViewById(R.id.vitamio);// videoView.setVideoURI(Uri.parse(urlString));//播放网络视频 videoView.setVideoPath(file1.getPath());//播放本地视频 controller = new MediaController(this);//视频控制器 videoView.setMediaController(controller);//关联控制器 videoView.start(); } initView(); setListener(); } private void setListener() { //设置缓冲进度的监听 videoView.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { tvProgress.setText(percent + "%"); } }); //设置缓冲下载监听 videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { switch (what) { //开始缓冲 case MediaPlayer.MEDIA_INFO_BUFFERING_START://开始缓冲时的视图变化 tvProgress.setVisibility(View.VISIBLE); tvDownloadSpeed.setVisibility(View.VISIBLE); mp.pause(); break; //缓冲结束 case MediaPlayer.MEDIA_INFO_BUFFERING_END://缓冲好后的视图变化(可播放) tvProgress.setVisibility(View.GONE); tvDownloadSpeed.setVisibility(View.GONE); mp.start(); break; //正在缓冲 case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED: tvDownloadSpeed.setText("当前网速:" + extra + "kb/s");//下载是速度 break; } return true; } }); //设置准备监听(判断一准备好播放) videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { videoView.setBufferSize(512*1025);//设置缓冲区大小 } }); } private void initView() { tvProgress = (TextView) findViewById(R.id.tv_progress_home); tvDownloadSpeed = (TextView) findViewById(R.id.tv_download_home); }}2.对应xml代码:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_demo_4_2" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="read.liu.com.wait.Demo_5_Activity"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:id="@+id/relativeLayout"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <io.vov.vitamio.widget.VideoView android:id="@+id/vitamio" android:layout_width="match_parent" android:layout_height="200dp" android:layout_gravity="center" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="5%" android:textColor="@color/white" android:layout_margin="10dp" android:id="@+id/tv_progress_home" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="200kb/s" android:id="@+id/tv_download_home" android:layout_alignBaseline="@+id/tv_progress_home" android:textColor="@color/white" android:layout_margin="10dp" android:layout_toRightOf="@+id/tv_progress_home" /> </RelativeLayout></RelativeLayout>演示效果:
二、使用Vitamio的MediaPlayer+SurfaceView(用于得到SurfaceHolder)来播放视频
java代码:
import java.io.IOException;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;import io.vov.vitamio.MediaPlayer;import io.vov.vitamio.Vitamio;import io.vov.vitamio.utils.Log;import read.liu.com.videoplayer.R;public class MediaActivity extends AppCompatActivity { private long playTime = 0; private MediaPlayer mediaPlayer; private SurfaceHolder surfaceHolder; private String urlString = "http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com/D046015255134077DDB3ACA0D7E68D45.flv"; private boolean isPlay = false; //用于记录是否在播放 @BindView(R.id.sf_media) SurfaceView sfMedia; @BindView(R.id.ib_play_media) ImageButton ibPlayMedia; @BindView(R.id.pb_media) SeekBar pbMedia; @BindView(R.id.ib_fullscreen_media) ImageButton ibFullscreenMedia; private int progress1 = 1; private Uri uri; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); pbMedia.setProgress(progress1); if((playTime-progress1*1000)<=1000){ Log.e("-----------","播放结束"); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_media); ButterKnife.bind(this); Vitamio.initialize(this);//初始化Vitamio init(); } private void init() { //关联mediaplayer和surfaceView surfaceHolder = sfMedia.getHolder(); surfaceHolder.setFormat(PixelFormat.RGBA_8888);//设置播放的清晰度(像素格式) mediaPlayer = new MediaPlayer(MediaActivity.this); mediaPlayer.setLooping(false); uri = Uri.parse(urlString); surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { try { mediaPlayer.setDisplay(surfaceHolder);//关联mediaplayer和surfaceview mediaPlayer.setDataSource(MediaActivity.this, uri);//设置播放数据源 mediaPlayer.prepareAsync();//异步准备 //异步准备监听 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { playTime = mediaPlayer.getDuration(); pbMedia.setMax((int)playTime/1000);//设置seekbar的最大值 isPlay = true; mediaPlayer.start(); startTimeTast(); ibPlayMedia.setImageResource(read.liu.com.wait.R.drawable.ic_adjust_black_24dp); } }); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }); mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { switch (what) { //开始缓冲 case MediaPlayer.MEDIA_INFO_BUFFERING_START://开始缓冲时的视图变化 mp.pause(); break; //缓冲结束 case MediaPlayer.MEDIA_INFO_BUFFERING_END://缓冲好后的视图变化(可播放) mp.start(); break; //正在缓冲 case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED: break; } return true; } }); //添加拖动条监听事件 pbMedia.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { //判断是用户拖动进度条产生的改变 if(fromUser){ mediaPlayer.seekTo(seekBar.getProgress()*1000); progress1 = progress; } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } private void startTimeTast() { new Thread(){ @Override public void run() { while (isPlay){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } handler.sendEmptyMessage(0); progress1++; } } }.start(); } @OnClick({R.id.ib_play_media, R.id.pb_media}) public void onClick(View view) { switch (view.getId()) { //点击了播放/暂停按钮 case R.id.ib_play_media: if (isPlay) { ibPlayMedia.setImageResource(read.liu.com.wait.R.drawable.ic_adjust_black_24dp); mediaPlayer.pause(); isPlay = false; } else { ibPlayMedia.setImageResource(read.liu.com.wait.R.drawable.ic_play_arrow); mediaPlayer.start(); isPlay = true; } startTimeTast(); break; case R.id.pb_media: break; } } //退出后注销mediapalyer @Override protected void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); } } @OnClick(R.id.ib_fullscreen_media) public void onClick() { //点击全屏按钮——将播放参数传入下一个全屏的界面 }}
- Android视频播放框架Vitamio集成及使用MediaPlayer+SurfaceView、VideoView+MediaController实现播放网络视频
- 视频播放器(SurfaceView+MediaPlayer+SeekBar,VideoView+MediaController)
- 使用VideoView+MediaController实现视频播放器
- Android两种播放视频的方法(SurfaceView+MediaPlayer+SeekBar)跟(VideoView+MediaController)
- Android播放视频(VideoView + MediaController)
- Android两种播放视频的方法(SurfaceView、MediaPlayer、SeekBar)和(VideoView、MediaController)等两种方法。
- VideoView和MediaController实现网络视频播放器demo
- Android 通过VideoView+MediaPlayer实现视频播放
- 通过VideoView+MediaController实现视频播放
- android视频播放(VideoView和MediaController)
- 使用VideoView和MediaController进行视频播放
- 使用VideoView和MediaController进行视频播放
- Android中VideoView及SurfaceView视频播放实现
- android MediaPlayer SurfaceView 网络视频播放器
- Android - SurfaceView+MediaPlayer、VideoView 2种方法播放视频
- videoView和mediaController视频播放
- Android SurfaceView + MediaPlayer实现视频播放器
- Android MediaPlayer+SurfaceView实现视频播放
- Shell数组:shell数组的定义、数组长度
- scala获取当前时间戳和今天0时时间戳(精确到秒)的小工具
- 自适应按钮
- Git远程操作详解
- 二叉树的镜像
- Android视频播放框架Vitamio集成及使用MediaPlayer+SurfaceView、VideoView+MediaController实现播放网络视频
- 细数中学生听讲技巧
- 52.自己动手封装Android6.0运行时权限相关代码
- Android控件 - ListView 简介
- 使用Markdown的方法
- 第八周—OJ小球下落反弹问题
- vsftp服务搭建
- Android笔记:invalidate()和postInvalidate() 的区别及使用
- 20161021-Allegro拼板