最近一段时间没有写android了 然后折腾了下Vitamio 怎么说呢 这个框架有点坑 文档什么的都很简单 像我这种小菜鸟一开始是被搞的一脸懵逼 在网上找了一些资料然后就一步一个坑写了两天终于勉强的实现了一些功能。嗯 开场白就写这么多 下面让我们来看看Vitamio 是什么?
Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐。到目前,全球已经有超过 一万 种应用在使用 Vitamio,覆盖用户超过 5亿 。Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 与 iOS 上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。
一些更细节的请移驾官网 https://www.vitamio.org 。
使用第三框架的时候第一件事是去官网下载demo和文档 官网下Vitamio 5.2解压
GitHub下载(https://github.com/yixia/VitamioBundle)解压
我用的是GitHub上下载的
第一步现在新建自己的项目导入vitamio为依赖库 然后配置manifest
<activity android:name="io.vov.vitamio.activity.InitActivity" android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation" android:screenOrientation="sensor" android:launchMode="singleTop" android:theme="@android:style/Theme.NoTitleBar" android:windowSoftInputMode="stateAlwaysHidden" />注意点就是这个单独添加就好了不需要在哪里引用 然后是权限
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />自己 写一个Application 初始化(记得在 manifest application里面应用)
Vitamio.isInitialized(getApplicationContext());xml里面直接引用
<io.vov.vitamio.widget.VideoView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" />在activity里面加入这个判断
if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this)) return; setContentView(R.layout.activity_main);
添加url
private String path = "http://flv2.bn.netease.com/tvmrepo/2016/5/N/3/EBMTJBGN3/SD/EBMTJBGN3-mobile.mp4";
uri = Uri.parse(path); mVideoView.setVideoURI(uri);//设置视频播放地址 mMediaController = new MediaController(this); meMediaController = new MeMediaController(this,mVideoView,this); mVideoView.setMediaController(meMediaController); mVideoView.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH);//高画质 mMediaController.show(5000); mVideoView.requestFocus(); mVideoView.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { switch (what){ case MediaPlayer.MEDIA_INFO_BUFFERING_START: return true; //缓冲结束 case MediaPlayer.MEDIA_INFO_BUFFERING_END: mp.start(); return true; //正在缓冲 case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED: netSpeedTv.setText("当前网速:" + extra + "kb/s"); break; } return false; } });这样基本上就能播放视频了
如果你想写其他一些功能比如全屏 以及进度条等功能话 就得重写MediaController类了 比如这样的
布局我就不添加了 如果有需要可以去下载我的demo 在文章末尾我会添加地址
主要看看重写的MediaController类
/** * 滑动改变声音大小 * * @param percent */ private void onVolumeSlide(float percent) { if (mVolume == -1) { mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); if (mVolume < 0) mVolume = 0; // 显示 // mOperationBg.setImageResource(R.drawable.video_volumn_bg); mVolumeBrightnessLayout.setVisibility(View.VISIBLE); mOperationTv.setVisibility(VISIBLE); } int index = (int) (percent * mMaxVolume) + mVolume; if (index > mMaxVolume) index = mMaxVolume; else if (index < 0) index = 0; if (index >= 10) { mOperationBg.setImageResource(R.mipmap.volmn_100); } else if (index >= 5 && index < 10) { mOperationBg.setImageResource(R.mipmap.volmn_60); } else if (index > 0 && index < 5) { mOperationBg.setImageResource(R.mipmap.volmn_30); } else { mOperationBg.setImageResource(R.mipmap.volmn_no); } //DecimalFormat df = new DecimalFormat("######0.00"); mOperationTv.setText((int) (((double) index / mMaxVolume) * 100) + "%"); // 变更声音 mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0); }
/** * 滑动改变播放进度 * * @param percent */ private void onSeekTo(float percent) { //计算并显示 前进后退 if (!progress_turn) { onStartSeekBar(); progress_turn = true; } int change = (int) (percent); if (change > 0) { mOperationBg.setImageResource(R.mipmap.right); } else { mOperationBg.setImageResource(R.mipmap.left); } mOperationTv.setVisibility(View.VISIBLE); mVolumeBrightnessLayout.setVisibility(View.VISIBLE); if (progress + change > 0) { if ((progress + change < 1000)) mOperationTv.setText(setSeekBarChange(progress + change) + "/" + StringUtils.generateTime(videoView.getDuration())); else mOperationTv.setText(setSeekBarChange(1000) + "/" + StringUtils.generateTime(videoView.getDuration())); } else { mOperationTv.setText(setSeekBarChange(0) + "/" + StringUtils.generateTime(videoView.getDuration())); } }
/** * 滑动改变亮度 * * @param percent */ private void onBrightnessSlide(float percent) { if (mBrightness < 0) { mBrightness = activity.getWindow().getAttributes().screenBrightness; if (mBrightness <= 0.00f) mBrightness = 0.50f; if (mBrightness < 0.01f) mBrightness = 0.01f; // 显示 //mOperationBg.setImageResource(R.drawable.video_brightness_bg); mVolumeBrightnessLayout.setVisibility(View.VISIBLE); mOperationTv.setVisibility(VISIBLE); } WindowManager.LayoutParams lpa = activity.getWindow().getAttributes(); lpa.screenBrightness = mBrightness + percent; if (lpa.screenBrightness > 1.0f) lpa.screenBrightness = 1.0f; else if (lpa.screenBrightness < 0.01f) lpa.screenBrightness = 0.01f; activity.getWindow().setAttributes(lpa); mOperationTv.setText((int) (lpa.screenBrightness * 100) + "%"); if (lpa.screenBrightness * 100 >= 90) { mOperationBg.setImageResource(R.mipmap.light_100); } else if (lpa.screenBrightness * 100 >= 80 && lpa.screenBrightness * 100 < 90) { mOperationBg.setImageResource(R.mipmap.light_90); } else if (lpa.screenBrightness * 100 >= 70 && lpa.screenBrightness * 100 < 80) { mOperationBg.setImageResource(R.mipmap.light_80); } else if (lpa.screenBrightness * 100 >= 60 && lpa.screenBrightness * 100 < 70) { mOperationBg.setImageResource(R.mipmap.light_70); } else if (lpa.screenBrightness * 100 >= 50 && lpa.screenBrightness * 100 < 60) { mOperationBg.setImageResource(R.mipmap.light_60); } else if (lpa.screenBrightness * 100 >= 40 && lpa.screenBrightness * 100 < 50) { mOperationBg.setImageResource(R.mipmap.light_50); } else if (lpa.screenBrightness * 100 >= 30 && lpa.screenBrightness * 100 < 40) { mOperationBg.setImageResource(R.mipmap.light_40); } else if (lpa.screenBrightness * 100 >= 20 && lpa.screenBrightness * 100 < 20) { mOperationBg.setImageResource(R.mipmap.light_30); } else if (lpa.screenBrightness * 100 >= 10 && lpa.screenBrightness * 100 < 20) { mOperationBg.setImageResource(R.mipmap.light_20); } }
//显示电量, public void setBattery(String stringBattery) { if (textViewTime != null && img_Battery != null) { textViewBattery.setText(stringBattery + "%"); int battery = Integer.valueOf(stringBattery); if (battery < 15) img_Battery.setImageDrawable(getResources().getDrawable(R.mipmap.battery)); if (battery < 30 && battery >= 15) img_Battery.setImageDrawable(getResources().getDrawable(R.mipmap.battery_15)); if (battery < 45 && battery >= 30) img_Battery.setImageDrawable(getResources().getDrawable(R.mipmap.battery_30)); if (battery < 60 && battery >= 45) img_Battery.setImageDrawable(getResources().getDrawable(R.mipmap.battery_45)); if (battery < 75 && battery >= 60) img_Battery.setImageDrawable(getResources().getDrawable(R.mipmap.battery_60)); if (battery < 90 && battery >= 75) img_Battery.setImageDrawable(getResources().getDrawable(R.mipmap.battery_75)); if (battery > 90) img_Battery.setImageDrawable(getResources().getDrawable(R.mipmap.battery_90)); } }
//隐藏/显示 private void toggleMediaControlsVisiblity() { if (isShowing()) { hide(); } else { show(); } } //播放与暂停 private void playOrPause() { if (videoView != null) if (videoView.isPlaying()) { videoView.pause(); } else { videoView.start(); } }左右滑动快进在要在Vitamio里面的MediaController添加下面几个方法
/** 获取进度条进度 * @return */ public int getProgress() { if (mProgress != null) return mProgress.getProgress(); return 0; } /**改变进度条进度 * @param progress * @return */ public String setSeekBarChange(int progress) { if (mProgress == null) return ""; mProgress.setProgress(progress); long newposition = (mDuration * progress) / 1000; String time = StringUtils.generateTime(newposition); if (mInstantSeeking) mPlayer.seekTo(newposition); if (mInfoView != null) mInfoView.setText(time); if (mCurrentTime != null) mCurrentTime.setText(time); return time; } /** * 进度条开始改变 */ public void onStartSeekBar() { if (mAM == null) return; mDragging = true; show(3600000); mHandler.removeMessages(SHOW_PROGRESS); if (mInstantSeeking) mAM.setStreamMute(AudioManager.STREAM_MUSIC, true); if (mInfoView != null) { mInfoView.setText(""); } } /** * 进度条变化停止 */ public void onFinishSeekBar() { if (mProgress == null) return; if (!mInstantSeeking) mPlayer.seekTo((mDuration * mProgress.getProgress()) / 1000); System.out.println("MediaController-" + (mDuration * mProgress.getProgress()) / 1000); System.out.println("MediaController-" + mProgress.getProgress()); if (mInfoView != null) { mInfoView.setText(""); mInfoView.setVisibility(View.GONE); } show(sDefaultTimeout); mHandler.removeMessages(SHOW_PROGRESS); mAM.setStreamMute(AudioManager.STREAM_MUSIC, false); mDragging = false; mHandler.sendEmptyMessageDelayed(SHOW_PROGRESS, 1000); }
先来说说全屏吧 我在网上看到一些是一些比较杂 也没有实现 ,然后我是这么实现的 第一我在manifest也就是我引用Vitamio的activity里面加入了这两个属性
android:screenOrientation="sensor"/这个属性可以控制你activity的显示方向然后重新了 MediaController 在里面写一个方法 添加在双击方法中unspecified 默认值. 由系统选择显示方向. 在不同的设备可能会有所不同.
landscape 橫向 portrait 纵向 user 用戶当前的首选方向 behind 与在活动堆栈下的活动相同方向 sensor 根据物理方向传感器确定方向. 取决于用戶手持的方向, 当用戶转动设备, 它跟隨改变. nosensor 不经物理方向传感器確定方向. 该传感器被忽略, 所以当用戶转动设备, 显示不會跟隨改变.
除了这个区别,系統选择使用相同的政策取向对于“未指定”设置.
android:configChanges="keyboardHidden|orientation|screenSize"用于捕获手机状态的改变。一般用上面三个就差不多了
“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。(这不应该常发生。)
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。(这不应该常发生。)
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变“ScreenSize”自从Android 3.2(API 13)如果你想阻止程序在运行时重新加载Activity,除了设置"orientation"
,你还必须设置"ScreenSize
//横竖屏切换 public void isScreenChange() { Configuration mConfiguration = this.getResources().getConfiguration(); //获取设置的配置信息 int ori = mConfiguration.orientation; //获取屏幕方向 if (ori == mConfiguration.ORIENTATION_LANDSCAPE) { //横屏 activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏 } else if (ori == mConfiguration.ORIENTATION_PORTRAIT) { //竖屏 activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏 } }
项目地址:http://download.csdn.net/download/qazzwx/9786778