集成Vitamio的视频播放器

项目现在已经差不多稳定了,总结自己这段时间的经历。

公司的项目是一款配合路由器的app,但是说到底其实都一样,只是在取数据的时候把网络,换成了一个路由器。公式的项目哗哗Wifi ,主要做的是视频以及免费上网。

   

视频功能:

1、视频播放的控制台,进度条,播放、暂停按钮、播放时长,返回按钮,播放影片的名称

2、调节音量

3、调节亮度

4、拖动屏幕来进行视频的快进跟快退

5、视频在横竖屏切换的时候的显示(注:动态改变vidwoView的高度能解决切换的时候自适应的问题)

开发的资料:

1、首先要有vitamio的library,这里是我修改过的一个 :http://download.csdn.net/detail/u012808234/8959989

2、然后就是一个vitamio的api文档,网上直接搜就好了;

然后就是真正的开发了

首先新建一个项目 : Vitamio_Demo, 然后就是把vitamio的library导入。

(1)在第一次进入的时候一定要对vitamio进行初始化及检查,

new AsyncTask<Object, Object, Object>() {
			@Override
			protected Object doInBackground(Object... params) {

				Vitamio.initialize(getApplicationContext());
				if (Vitamio.isInitialized(getApplicationContext()))
					return null;

				//反射解压
				try {
					Class c = Class.forName("io.vov.vitamio.Vitamio");
					Method extractLibs = c.getDeclaredMethod("extractLibs", new Class[] { android.content.Context.class, int.class });
					extractLibs.setAccessible(true);
					extractLibs.invoke(c, new Object[] { getApplicationContext(), R.raw.libarm });

//					Field vitamioLibraryPath = c.getDeclaredField("vitamioLibraryPath");
//
//					 AndroidContextUtils.getDataDir(ctx) + "libs/"

				} catch (NoSuchMethodException e) {
					Log.e("extractLibs", e.toString());
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
				return null;
			}
		}.execute();

(2)  实现一堆接口: OnClickListener, OnCompletionListener, OnInfoListener,

OnPreparedListener, OnErrorListener, OnBufferingUpdateListener, OnSeekCompleteListener

private void stopPlayer() {
		if (mVideoView != null)
			mVideoView.pause();
	}

	private void startPlayer() {
		if (mVideoView != null)
			mVideoView.start();
	}

	private boolean isPlaying() {
		return mVideoView != null && mVideoView.isPlaying();
	}

	/** 是否????自动恢复播放,用于自动暂停,恢复播放 */
	private boolean needResume;

	@Override
	public boolean onInfo(MediaPlayer arg0, int arg1, int arg2) {
		switch (arg1) {
		case MediaPlayer.MEDIA_INFO_BUFFERING_START:
			// ????缓存,暂停播??
			if (isPlaying()) {
				stopPlayer();
				needResume = true;
			}
			mLoadingView.setVisibility(View.VISIBLE);
			break;
		case MediaPlayer.MEDIA_INFO_BUFFERING_END:
			// 缓存完成,继续播??
			if (needResume) {
				startPlayer();
			}
			mLoadingView.setVisibility(View.GONE);
			break;
		case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
			// 显示 下载速度
			break;
		}
		return true;
	}

	/**
	 * 播放完成
	 */
	@Override
	public void onCompletion(MediaPlayer arg0) {
	}

	/**
	 * //在视频预处理完成后调用。在视频预处理完成后被调用。此时视频的宽度、高度、宽高比信息已经获取到,此时可调用seekTo让视频从指定位置开始播放。
	 */
	@Override
	public void onPrepared(MediaPlayer arg0) {
	}

	/**
	 * 在异步操作调用过程中发生错误时调用。例如视频打开失败。
	 */
	@Override
	public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
		mLoadingView.setVisibility(View.GONE);
		mTv_NoPlay.setVisibility(View.VISIBLE);
		return false;
	}

	/**
	 * 在网络视频流缓冲变化时调用。
	 *
	 * @param arg0
	 * @param arg1
	 */
	@Override
	public void onBufferingUpdate(MediaPlayer arg0, int arg1) {
		mTv_NoPlay.setVisibility(View.GONE);
		mLoadingView.setVisibility(View.VISIBLE);
	}

	/**
	 * 在seek操作完成后调用。
	 */
	@Override
	public void onSeekComplete(MediaPlayer arg0) {
	}

	private MediaController.PlayControl mPlayControll = new PlayControl() {

		@Override
		public void downLoad() {

		}

		@Override
		public void collect() {
		}

	};

<span style="white-space:pre">	</span>//点击开始暂停的回调
	private onPauseListener mPauseListener = new onPauseListener() {

		@Override
		public void onPause() {
			Log.d("pause", "pause");
		}

		@Override
		public void onPlay() {
			Log.e("onPlay", "play");
		}
	};

	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub

	}

然后就是实现他们的方法

(3)  然后初始化videoView, 进度条,等等的控件。

		if (mPath.startsWith("http:"))
				mVideoView.setVideoURI(Uri.parse(mPath));
			else
				mVideoView.setVideoPath(mPath);
			// 设置显示名称
			mMediaController = new MediaController(MainActivity.this, mVideoView);
			mMediaController.setmPlayControl(mPlayControll);
			mMediaController.setOnPauseListener(mPauseListener);
			mVideoView.setMediaController(mMediaController);
			mMediaController.setFileName("哈哈哈");

			int mCurrentOrientation = getResources().getConfiguration().orientation;
			if (mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT) {
				Utils.full(false, MainActivity.this);
				mRl_PlayView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 400));
				if (mVideoView != null){
//					mVideoView.setVideoLayout(VideoView.VIDEO_LAYOUT_STRETCH, 0);
					}
			} else if (mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
				Utils.full(true, MainActivity.this);
				mRl_PlayView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
				if (mVideoView != null)
					mVideoView.setVideoLayout(mLayout, 0);
			}
			mVideoView.requestFocus();
			

(4)然后就是进行音量调节,快进,快退亮度的调节,使用手势监听就能实现这一点

<span style="white-space:pre">	</span>mGestureDetector = new GestureDetector(new MyGestureListener());

然后就是在onTouch  跟onScroll 里边进行处理;

现在我是把屏幕分成平均的俩分,如果是在左边滑动,而且没有在快进回事快退的时候就是调整亮度,反之就是调整音量。

在调整进度的时候是不能调整亮度的,我加了这判断,而且视频只有在快进已经快退完成以后才进行视频的seekTo()。

/** 滑动 */
		@Override
		public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
			mMediaController.hide();
			float mOldX = e1.getX(), mOldY = e1.getY();
			int y = (int) e2.getRawY();
			int x = (int) e2.getRawX();
			Display disp = getWindowManager().getDefaultDisplay();
			int windowWidth = disp.getWidth();
			int windowHeight = disp.getHeight();

			if (Math.abs(x- mOldX) >20 && !isUp_downScroll) { //执行快进快退
				isFast_Forword = true;
					mFast_forward = x - mOldX;
					fast_ForWord(mFast_forward);
			}else if (mOldX > windowWidth * 1.0 / 2 && Math.abs(mOldY - y) > 3 && !isFast_Forword)// 右边滑动
				onVolumeSlide((mOldY - y) / windowHeight);
			else if (mOldX < windowWidth / 2.0 && Math.abs(mOldY - y) > 3 && !isFast_Forword)// 左边滑动
				onBrightnessSlide((mOldY - y) / windowHeight);
			return super.onScroll(e1, e2, distanceX, distanceY);
		}

调整音量:

	/**
	 * 滑动改变声音大小
	 *
	 * @param percent
	 */
	private void onVolumeSlide(float percent) {
		isUp_downScroll = true;
		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);
		}

		int index = (int) (percent * mMaxVolume) + mVolume;
		if (index > mMaxVolume)
			index = mMaxVolume;
		else if (index < 0)
			index = 0;

		// 变更声音
		mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);

		// 变更进度条
		ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
		lp.width = findViewById(R.id.operation_full).getLayoutParams().width * index / mMaxVolume;
		mOperationPercent.setLayoutParams(lp);
	}

调整亮度:

/**
	 * 滑动改变亮度
	 *
	 * @param percent
	 */
	private void onBrightnessSlide(float percent) {
		isUp_downScroll = true;
		if (mBrightness < 0) {
			mBrightness = 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);
		}
		WindowManager.LayoutParams lpa = 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;
		getWindow().setAttributes(lpa);

		ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
		lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * lpa.screenBrightness);
		mOperationPercent.setLayoutParams(lp);
	}

在手势进行快进快退的时候让时间进行改变:

private void fast_ForWord(float dis){
		long currentProgress ;
		long duration  = mVideoView.getDuration();
		if (mVideoView.getCurrentPosition() + 500*(long)dis < 0)
			currentProgress = 0;
		else
			currentProgress = mVideoView.getCurrentPosition() + 500*(long)dis;
		mTv_progress.setText(Utils.generateTime(currentProgress) + "/" + Utils.generateTime(duration));
		if (dis > 0)
			mIv_Progress_bg.setImageResource(R.drawable.btn_fast_forword);
		else
			mIv_Progress_bg.setImageResource(R.drawable.btn_back_forword);
		mFl_Progress.setVisibility(View.VISIBLE);
	}

改变进度是在onTouch 的action _up 的时候执行的:

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (mGestureDetector.onTouchEvent(event))
			return true;

		// 处理手势结束
		switch (event.getAction() & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_UP:
			endGesture();
			break;
		}

		return super.onTouchEvent(event);
	}

	/** 手势结束 */
	private void endGesture() {
		mVolume = -1;
		mBrightness = -1f;
		if (isFast_Forword) {
			onSeekProgress(mFast_forward);
		}
		// 隐藏
		mDismissHandler.removeMessages(0);
		mDismissHandler.sendEmptyMessageDelayed(0, 800);
	}

<span style="white-space:pre">	</span>onSeekProgress(long)是调整进度的:<pre name="code" class="java">	private void onSeekProgress(float dis){
		Log.e("position ==", mVideoView.getCurrentPosition() + 500*(long)dis+"/"+mVideoView.getDuration());
		mVideoView.seekTo(mVideoView.getCurrentPosition() + 500*(long)dis);
	}

以上就是里边比较关键的些部分,博客只是为了自己记录。

Demo就不发了。

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

时间: 2024-10-20 05:57:15

集成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) 等常

Android本地文件点击视频播放器vitamio版

本博客用Android studio集成了vitamio的自定义视频播放器,同时可以在文件管理中选择播放,想要一个自己的视频播放器这边便可以满足 实现具体功能如下: 1.sd卡内存视频文件的点击播放; 2.视频时间进度条; 3.屏幕亮度的手势滑动; 4.视频音量的手势滑动; 5.多点手势效果 6.自定义存储视频url播放 想要的重要的代码,我懂得: ------------------------------软件工程结构图: 最重要的是依赖上vitamio库: -----------------

centos 安装视频播放器mplayer

centos 桌面安装mplayer播放器看视频今天安装上centos 6.3 的 桌面环境来搭配 java开发环境.   完事之后,发现centos6.3 桌面程序应用中的 电视播放器 无法播放AVI 等视频(原来都是命令行) 本身centos 属于服务器系统 对于影音软件的集成 就比较 含蓄来.那我们就使用常用的mplayer 播放器来作为我们的视频播放器吧. 因为我装的系统是 64位的 所以 一下链接 都是64位的 第一: rpm -ivh [url=http://tree.repofor

iOS: FFmpeg视频播放器

现在视频直播非常的火,所以在视频直播开发中,使用的对视频进行解码的框架显得尤为重要了,其实,这种框架蛮多的,这次主要介绍一下FFmpeg视频播放器的集成和使用 原址:http://bbs.520it.com/forum.php?mod=viewthread&tid=707&page=1&extra=#pid3821 一 本播放器原理: 通过ffmpeg对视频进行解码,解码出每一帧图片,然后根据一定时间播放每一帧图 二 如何集成 ffmpeg 下载脚本 ffmpeg脚本 根据上面链接

ios媒体视频播放器应用项目

源码WSY_XMHelper,基于ReactiveCocoa和MVVM架构的流媒体视频播放器应用,此项目为一个完整项目.基于MVVM架构, 集成流媒体视频下载及播放,支持下拉刷新,上拉加载等.如果你想学习MVVM,此项目为一个很好的例子. 项目源码下载:http://code.662p.com/view/9891.html<ignore_js_op> <ignore_js_op> 详细说明:http://ios.662p.com/thread-2344-1-1.html

视频播放器的开源项目

1.VLC for Android,这个官方网站http://www.videolan.org/上有下载,而且VLC也是一个非常强大的视频播放器,支持hls\rtsp\rtmp\http协议,也支持非常丰富的编码格式MPEG-4,H.264,RMVB,XVID,MS MPEG-4,VP6,H.263,MPEG-1,MPEG-2,AVI,MOV,MKV,FLV,AVI,3GP,3G2,ASF,WMV,MP4,M4V, AAC,Vorbis,FLAC,MP3,MP2,WMA.问题是:当用户播放影片想

iOS媒体视频播放器应用源码

源码WSY_XMHelper,基于ReactiveCocoa和MVVM架构的流媒体视频播放器应用,此项目为一个完整项目.基于MVVM架构, 集成流媒体视频下载及播放,支持下拉刷新,上拉加载等.如果你想学习MVVM,此项目为一个很好的例子. 源码下载: http://code.662p.com/view/9891.html 2015-1-7 15:12 上传 详细说明:http://ios.662p.com/thread-2344-1-1.html

Pyqt 音视频播放器

在寻找如何使用Pyqt做一个播放器时首先找到的是openCV2 openCV2 貌似太强大了,各种关于图像处理的事情它都能完成,如 读取摄像头.图像识别.人脸识别.  图像灰度处理 . 播放视频等,强大的让你想不到! openCV2 播放视频也很简单: 1 #coding=utf-8 2 3 import cv2.cv as cv 4 filename = "cn.avi" 5 win_name = "video player" 6 capture = cv.Cap

手把手教你做视频播放器(五)

第7节 竖屏的播放界面 播放视频的功能放在一个单独的Activity当中.我们将为它们设置横竖屏两种布局. 在竖屏的时候,上半部分播放视频,下半部分显示视频信息: 在设备旋转成横屏的时候,视频进行全屏播放: 7.1 启动视频播放界面 当点击视频列表的视频项时,就启动播放器播放对应的视频.这里我们要创建一个名字叫做VideoPlayer的Activity,用它来完成视频播放的任务. 另外,还要为ListView添加一个数据项点击时的监听函数, 实现ListView的OnItemClickListe