`

Video三种播放方式

 
阅读更多
1、使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。

2、使用VideoView来播放。在布局文件中使用VideoView结合MediaController来实现对其控制。

3、使用MediaPlayer类和SurfaceView来实现。这种方式最灵活,也最复杂。

1、调用其自带的播放器:
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");//调用系统自带的播放器
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/mp4");
startActivity(intent);


2、使用VideoView来实现:
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");
VideoView videoView = (VideoView)this.findViewById(R.id.video_view);
videoView.setMediaController(new MediaController(this));
videoView.setVideoURI(uri);
//videoView.start();
videoView.requestFocus();


3、使用MediaPlayer:
/**
 * 该实例中使用MediaPlayer完成播放,同时界面使用SurfaceView来实现
 * 
 * 这里我们实现MediaPlayer中很多状态变化时的监听器
 * 
 * 使用Mediaplayer时,也可以使用MediaController类,但是需要实现MediaController.mediaController接口
 * 实现一些控制方法。
 * 
 * 然后,设置controller.setMediaPlayer(),setAnchorView(),setEnabled(),show()就可以了,这里不再实现
 * @author Administrator
 *
 */
public class VideoSurfaceDemo extends Activity implements OnCompletionListener,OnErrorListener,OnInfoListener,
	OnPreparedListener, OnSeekCompleteListener,OnVideoSizeChangedListener,SurfaceHolder.Callback{
	private Display currDisplay;
	private SurfaceView surfaceView;
	private SurfaceHolder holder;
	private MediaPlayer player;
	private int vWidth,vHeight;
	//private boolean readyToPlay = false;
 
 
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.video_surface);
 
 
		surfaceView = (SurfaceView)this.findViewById(R.id.video_surface);
		//给SurfaceView添加CallBack监听
		holder = surfaceView.getHolder();
		holder.addCallback(this);
		//为了可以播放视频或者使用Camera预览,我们需要指定其Buffer类型
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 
		//下面开始实例化MediaPlayer对象
		player = new MediaPlayer();
		player.setOnCompletionListener(this);
		player.setOnErrorListener(this);
		player.setOnInfoListener(this);
		player.setOnPreparedListener(this);
		player.setOnSeekCompleteListener(this);
		player.setOnVideoSizeChangedListener(this);
		Log.v("Begin:::", "surfaceDestroyed called");
		//然后指定需要播放文件的路径,初始化MediaPlayer
		String dataPath = Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v";
		try {
			player.setDataSource(dataPath);
			Log.v("Next:::", "surfaceDestroyed called");
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
		//然后,我们取得当前Display对象
		currDisplay = this.getWindowManager().getDefaultDisplay();
	}
 
	@Override
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
		// 当Surface尺寸等参数改变时触发
		Log.v("Surface Change:::", "surfaceChanged called");
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// 当SurfaceView中的Surface被创建的时候被调用
		//在这里我们指定MediaPlayer在当前的Surface中进行播放
		player.setDisplay(holder);
		//在指定了MediaPlayer播放的容器后,我们就可以使用prepare或者prepareAsync来准备播放了
		player.prepareAsync();
 
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
 
		Log.v("Surface Destory:::", "surfaceDestroyed called");
	}
	@Override
	public void onVideoSizeChanged(MediaPlayer arg0, int arg1, int arg2) {
		// 当video大小改变时触发
		//这个方法在设置player的source后至少触发一次
		Log.v("Video Size Change", "onVideoSizeChanged called");
 
	}
	@Override
	public void onSeekComplete(MediaPlayer arg0) {
		// seek操作完成时触发
		Log.v("Seek Completion", "onSeekComplete called");
 
	}
	@Override
	public void onPrepared(MediaPlayer player) {
		// 当prepare完成后,该方法触发,在这里我们播放视频
 
		//首先取得video的宽和高
		vWidth = player.getVideoWidth();
		vHeight = player.getVideoHeight();
 
		if(vWidth > currDisplay.getWidth() || vHeight > currDisplay.getHeight()){
			//如果video的宽或者高超出了当前屏幕的大小,则要进行缩放
			float wRatio = (float)vWidth/(float)currDisplay.getWidth();
			float hRatio = (float)vHeight/(float)currDisplay.getHeight();
 
			//选择大的一个进行缩放
			float ratio = Math.max(wRatio, hRatio);
 
			vWidth = (int)Math.ceil((float)vWidth/ratio);
			vHeight = (int)Math.ceil((float)vHeight/ratio);
 
			//设置surfaceView的布局参数
			surfaceView.setLayoutParams(new LinearLayout.LayoutParams(vWidth, vHeight));
 
			//然后开始播放视频
 
			player.start();
		}
	}
	@Override
	public boolean onInfo(MediaPlayer player, int whatInfo, int extra) {
		// 当一些特定信息出现或者警告时触发
		switch(whatInfo){
		case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
			break;
		case MediaPlayer.MEDIA_INFO_METADATA_UPDATE:
 
			break;
		case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
 
			break;
		case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
 
			break;
		}
		return false;
	}
	@Override
	public boolean onError(MediaPlayer player, int whatError, int extra) {
		Log.v("Play Error:::", "onError called");
		switch (whatError) {
		case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
			Log.v("Play Error:::", "MEDIA_ERROR_SERVER_DIED");
			break;
		case MediaPlayer.MEDIA_ERROR_UNKNOWN:
			Log.v("Play Error:::", "MEDIA_ERROR_UNKNOWN");
			break;
		default:
			break;
		}
		return false;
	}
	@Override
	public void onCompletion(MediaPlayer player) {
		// 当MediaPlayer播放完成后触发
		Log.v("Play Over:::", "onComletion called");
		this.finish();
	}
}
分享到:
评论

相关推荐

    Web_Video_Caster_Premium_v5.0.3.apk

    第三步照常播放视频,或单击应用程序菜单上的播放按钮。 然后,您要做的就是放松并欣赏视频。 如果您在使用其他网络浏览器时遇到想要播放的视频,那么您要做的就是与Web Video Caster共享网页。 一些网站...

    Android-Video-Trimmer-master.zip

    在Android系统当中,如果需要一台Android设备来获取到一个MP4这样的视频文件的话,主流的方式一共与三种:MediaRecorder、MediaCodec+MediaMuxer、FFmpeg。 MediaRecorder:是Android系统直接提供给我们的录制类,...

    VideoViewer:这个闪电网络组件允许用户在 Salesforce 中本地播放视频文件。 无需下载视频文件即可查看。 也无需将视频文件传输到第三方服务

    您可以通过两种方式使用此组件。 记录详情页面 现在可以通过该组件直接查看附加有此记录的任何受支持的视频文件。 您可以单击上一个或下一个按钮导航到不同的视频。 文件详细信息页面 您还可以直接在文件 ...

    屏幕图像抓取录制(oCam) v67.0 汉化绿色版.zip

    使用方式非常简单,预设会有一个框架,可以自己调整框架的大小,点选 Record 就开始录影了,录影设定可以调整档案格式,内键支援了 Intel IYUV codec、Cinepak Codec by Radius、Microsoft Video 1 三种档案格式,还...

    html5视频播放_动力节点Java学院整理

    而html5的video标签只支持mp4、webm、ogg三种格式.目前所有主流浏览器最新版本都支持html5(除了Opera) H.264已经占领视频市场的80%。如果移动应用视频,建议编译成264格式,有好的高压缩比、高画质。 H.264则是由...

    ffmpeg-video-client:一款优化后低延时的ffmpeg视频解码器,以及演示如何用dui制作出多路的网络视频播放器

    一个优秀的ffmpeg视频解码器源代码,编译方式:Release.x64版本。 .windows下播放网络视频流低延时 .解码器支持网络摄像头、本地视频文件、电脑自带usb摄像头、桌面抓取方法。 .视频解码处理过程已经经过硬解码,及...

    Android FFmpeg音频和视频开发教程。-Android开发

    An Android FFmpeg audio and video development tutorial. Android FFmpeg 音视频开发极简教程 An Android FFmpeg audio... FFmpeg 开发(06):FFmpeg 播放器实现音视频同步的三种方式 FFmpeg 开发(07):FFmpeg + O

    CustomVideoPlayer:Beat Saber的MVP mod的一个分支,它允许一次播放多个视频

    它通过添加的三个功能扩展了MVP的功能: 一次播放多个视频。 播放360个视频。 添加具有多个预设组合的“多屏幕放置”(MSP)功能。 随着人们收集更多视频并发现创造性的方式来分层或使它们与平台交互,此mod的...

    本科毕业设计论文 STB Scan与Play流程的设计与实现

    DVB(数字视频广播Digital Video Broadcasting的缩写)标准中主要有三种标准:DVB-C(有线)、DVB-T(地面无线)、DVB-S(卫星)。 本设计是基于DVB-S标准的设计和开发,硬件平台为Sunplus的SPHE1500开发平台,软件系统...

    输出端子.doc

     一般DVD机应有三种音频、三种视频输出端子,用户购买时应注意。  三种音频输出端子分别是:  •音频混合输出端子,即AV端子的A端子,一般为白色和红色,可输出立体声。  •5.1声道模拟输出,即AC-3端子,数字...

    屏幕录制功能效果

    该特效可以实现了屏幕录制功能效果源码,该功能实现三种方式的屏幕录制,而且还可以录制屏幕上的任意操作,比如绘图过程。代码包包括三份代码:AVAssetWriterDemo、ScreenCapture、ScreenRecorderDemo。其中...

    android 音视频播放 SDK

    1、UsageGradle: implementation 'ywl.ywl5320:wlmedia:1.0.0-beta17'2、实例图片播放视频播放 byte[](如:标准的 h264 h265 等)播放音乐竖屏播放(自动保持宽高比)横屏播放(自动保持宽高比)3、调用方式配置 ...

    meedu:开源在线教育点播系统

    MeEdu-基于Laravel开发的在线教育点播系统。 安装方式 使用傻瓜安装包安装。...支付宝/微信/手动转账三种支付方式 积分功能 视频试看,视频禁止快进 视频播放跑马灯(防录屏) 视频播放统计/课程观看进度/用户观看统计

    美萍vod视频点播服务器

    5、多中播放方式选择: 由于媒体文件的多样性,某些文件可能不适合做流媒体点播,这是您可以把这个节目设置 成通过网上邻居共享点播。这样一方面做到对这个节目的最好支持,同时也降低了服务器 的负载,灵活运用...

    多媒体教室

    可以通过4种使用方式来执行多媒体网络教室功能: 1. 通过在班级模型区弹出右键菜单执行。 2. 通过图形按钮区点击图形按钮执行。 3. 通过弹出式工具条执行。 4. 通过系统热键执行(参见"热键设置")。 4.6 班级模...

    完全免费的国产 光盘刻录大师 10.0 中文免费版.zip

    1.制作影视光盘:把视频以高清和自动两种方式刻录在CD/DVD盘片上,以便在家用VCD/DVD/SVCD播放机播放,让家人和好友与您一起分享快乐。 2.编辑与转换:可以转换MPEG-4, AMV, AVI, ASF, SWF, DivX, Xvid, RM, RMVB, FLV...

    FrameServer27_1.1

    DebugMode FrameServer(帧服务器)是个十分优秀的搭桥软件,它可将Sony Vegas、Adobe Premiere、Ulead VideoStudio等非线性编辑软件时间线上的视频和音频传送给第三方媒体播放器或编码器,直接播放或编译成高质量的...

    多媒体语音教室设计方案.doc

    随着现代化教学系统在各大院校的不断推进,传统的方式已经不适应现代化的需要,集多 功能教室系统、多媒体教学系统、演播系统於一体的新型现代化教育体系在教育行业得 到了日益广泛的运用.作为一种新型的教育形式和...

    视频编码信息查看工具_5款合集

     三种发布版本:图形界面,命令行,DLL(动态链接库)  与Windows资源管理器整合:拖放,右键菜单  国际化:有多种界面语言供选择  (软件界面)轻松实现本地化 (需要志愿者翻译语言文件) ---------------------...

    视频编码信息查看工具合集

     三种发布版本:图形界面,命令行,DLL(动态链接库)  与Windows资源管理器整合:拖放,右键菜单  国际化:有多种界面语言供选择  (软件界面)轻松实现本地化 (需要志愿者翻译语言文件) ---------------------...

Global site tag (gtag.js) - Google Analytics