`

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();
	}
}
分享到:
评论

相关推荐

    视频播放插件Video.js

    5. **插件生态系统**:有众多第三方插件可供选择,如广告插件、字幕插件、播放列表插件等,扩展了Video.js的功能范围。 6. **HTML5视频特性**:支持预加载、画中画模式、自适应比特率流、全屏模式等HTML5视频特性。...

    CEF插件使谷歌 正常使用video和audio

    总的来说,CEF和CEFsharp提供了一种强大的方式来构建具有现代Web功能的桌面应用,包括多媒体播放。当遇到播放问题时,通过正确配置和使用CEFsharp插件,可以有效地解决这些问题,确保用户能够顺畅地享受视频和音频...

    video.js5.18.4库

    三、video.js 5.18.4核心文件分析 压缩包中的"video5.18.4.js"文件是video.js的核心库文件,包含了所有基本功能和组件。开发者可以通过引入这个文件,结合HTML5 `<video>`标签,快速构建起一个功能完善的视频播放器...

    processing语言的video库---video-2.0.zip(free)

    Processing的video库为艺术家、设计师和程序员提供了一种简单易用的方式来集成视频内容到他们的项目中。无论是播放预录制的视频还是捕获实时流,video库都提供了必要的工具和灵活性。通过学习和掌握这个库,你可以...

    html5基于video的视频播放器

    本项目基于HTML5的Video元素,构建了一个功能丰富的视频播放器,提供了三种预设皮肤,并允许用户自定义控制按钮颜色、遮罩层透明度以及视频封面。 1. HTML5 Video元素: HTML5 Video元素是用于在网页上嵌入视频...

    Videojs 网页 播放器

    为实现全面兼容,开发者通常需要提供MP4、WebM和Ogg三种格式的视频。然而,Videojs通过智能检测和适配技术,只需MP4和WebM两种格式即可满足大多数浏览器的需求。 Videojs的使用非常简单,首先,通过引入CDN上的CSS...

    flex_video_帮助

    Flex Video 支持 Sorenson Spark 和 On2 VP6 FLV 文件格式,这两种格式是 Flash 视频中最常用的编码方式。其中,Sorenson Spark 提供了良好的兼容性,而 On2 VP6 则提供了更高质量的视频压缩。 ##### 5. 网络传输 ...

    videoplay.html

    标题中的"videoplay.html"指的是一个HTML网页文件,通常用于播放视频内容。...这个"videoplay.html"文件及其相关资源,为开发者或普通用户提供了一种便捷的方式来展示和播放网络视频流,无需复杂的设置或外部服务。

    解决html5中video标签无法播放mp4问题.pdf

    `<video>`标签通常支持以下三种主要格式: 1. **MPEG4** - 这种格式的视频必须包含H.264视频编码和AAC音频编码。 2. **WebM** - 使用VP8视频编码和Vorbis音频编码的开放源代码格式,由Google公司推动。 3. **Ogg** ...

    网页播放Flash的三种方式Demo

    随着HTML5的普及,Flash逐渐被淘汰,HTML5的video标签现在成为主流的视频播放方式,支持更多的原生功能和更好的跨平台兼容性。然而,在某些情况下,如旧项目的维护或对Flash有特定依赖的应用中,理解如何使用Flash...

    Unity3D视频全屏播放的方法1

    第三个参数是 ScaleMode,用于指定视频的缩放方式。在这里我们使用了 ScaleToFit,以便视频可以自动适应屏幕大小。 最后,我们使用 StartingMovie.Play() 来播放视频。 这个方法的优点是非常简单易用,适合初学者...

    vue-video-play.rar

    Vue Video Play是基于Vue.js开发的一个视频播放组件,它提供了一种便捷的方式来在Vue项目中集成视频播放功能。这个压缩包"vue-video-play.rar"可能包含了该组件的源代码、示例、文档和其他相关资源,虽然描述中提到...

    VIDEO@HOME2

    在IT领域,"VIDEO@HOME2"可以代表一种集成化、智能化的视频体验,允许用户在家中轻松地存储、播放、分享以及控制各种视频内容。 【描述】"VIDEO@HOME2 VIDEO@HOME2 VIDEO@HOME2" 的重复提及,可能是强调这个项目的...

    Boilsoft Video Splitter5.16注册码

    - 首先,访问官方网站或通过可靠的第三方平台下载 Boilsoft Video Splitter 5.16 的安装程序。 - 运行安装程序并按照提示完成软件的安装过程。安装过程中,请仔细阅读许可协议,并根据个人偏好选择合适的安装选项...

    Html5 Video Facts

    HTML5视频标签(`<video>`)的引入,旨在解决这些问题,提供一种无需插件即可播放视频的解决方案,大大提升了视频在网络上的传播效率和用户观看体验。 ### HTML5 `<video>`标签详解 HTML5的`<video>`标签允许...

    H5 Video标签调用摄像头进行录像,兼容苹果、安卓系统、可在微信浏览器正常使用

    在现代Web开发中,HTML5引入了许多新的特性,其中之一就是`<video>`标签,它使得在网页上直接播放视频成为可能。在这个场景中,我们利用`<video>`标签的特定属性来实现调用用户设备的摄像头进行录像,并且确保这个...

    浏览器HTML5标签video和audio支持

    HTML5是Web开发领域的一次重大革新,其中最引人注目的特性之一就是引入了`<video>`和`<audio>`标签,使得浏览器可以直接内嵌和播放多媒体内容,无需依赖Flash或其他第三方插件。这两个标签极大地提升了用户体验,...

    videojs压缩包

    10. **与其他服务集成**:`videojs`可以与各种CDN、流媒体服务器和其他第三方服务无缝集成,比如Vimeo、YouTube,或自建的流媒体解决方案。 总之,`videojs`压缩包中的实例和相关文件提供了在网页上集成RTMP流的...

    HTML5的Video标签有部分MP4无法播放的问题解析(多图)

    以上述方式组织Video标签后,即使视频文件在某个格式上存在问题,用户也能在其他格式的视频中选择观看,从而避免了播放失败的问题。 总结来说,在HTML5的Video标签使用过程中,若遇到部分MP4文件无法播放的情况,应...

    rtmp视频流播放-前端

    本文将深入探讨RTMP视频流播放的前端实现,以及如何使用video.js这样的库来处理视频流源文件。 首先,让我们理解RTMP的基本概念。RTMP是一种专为音视频数据实时传输而设计的协议,它由Adobe Systems开发,主要用于...

Global site tag (gtag.js) - Google Analytics