zoukankan      html  css  js  c++  java
  • android 播放视频

    播放视频的两种方式:

    使用VideoView播放视频(方便,推荐)

    使用MediaPlayer和SurfaceView播放视频(早期的方式)


    第一种方式:

    使用VideoView播放视频的过程例如以下:

    在界面布局文件里定义VideoView组件,或在程序中创建VideoView组建

    调用VideoView的例如以下两个方法载入指定视频

    setVideoPath(String paht):载入path文件所代表的视频

    setVideoURI(URI uri):载入uri所相应的视频

    调用VideoVIew的start(),stop(),pause()方法来控制视频播放


    MediaContraller类

    与VideoView一起结合使用的另一个MediaContraller类,它的作用时提供一个友好的图形控制界面,通过该控制界面来控制视频的播放,快进键,暂停键,后退键以及播放进度

    条都是该类提供


    样例代码:

    xml布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    	xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical"
    	android:layout_width="match_parent"
    	android:layout_height="match_parent">
    <!-- 定义VideoView播放视频 -->
    <VideoView
    	android:id="@+id/video"
    	android:layout_width="match_parent"
    	android:layout_height="match_parent" />
    </LinearLayout>
    Activity:

    import java.io.File;
    
    import android.app.Activity;
    import android.graphics.PixelFormat;
    import android.os.Bundle;
    import android.widget.MediaController;
    import android.widget.VideoView;
    
    public class VedioViewTest extends Activity {
        VideoView       videoView;
    
        MediaController mController;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getWindow().setFormat(PixelFormat.TRANSLUCENT);
            setContentView(R.layout.main);
            // 获取界面上VideoView组件
            videoView = (VideoView) findViewById(R.id.video);
            // 创建MediaController对象
            mController = new MediaController(this);
            File video = new File("/mnt/sdcard/movie.mp4");
            if (video.exists()) {
                videoView.setVideoPath(video.getAbsolutePath()); //①
                // 设置videoView与mController建立关联
                videoView.setMediaController(mController); //②
                // 设置mController与videoView建立关联
                mController.setMediaPlayer(videoView); //③
                // 让VideoView获取焦点
                videoView.requestFocus();
            }
        }
    }

    另外一种方式:

    使用MediaPlayer播放视频的过程例如以下:

    创建MediaPlayer对象,并让它载入指定的视频文件

    在界面布局文件里定义SurfaceView组件,或在程序中创建SurfaceView组件,并为SurfaceView的SurfaceView的SurfaceHolder添加Callback监听器 

    调用 MediaPlayer对象的setPisplay(SurfaceHolder sh):将所播放的视频图像输出到指定的SurfaceView组件

    调用MediaPlayer对象的start(),stop(),和pause()方法来控制视频的播放


    样例代码:

    xml布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
    	xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    <SurfaceView
    	android:id="@+id/surfaceView"
    	android:layout_width="match_parent" 
    	android:layout_height="360dp"
    	/>
    <LinearLayout
    	android:orientation="horizontal"
    	android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	android:layout_alignParentBottom="true"
    	android:gravity="center_horizontal">
    <ImageButton
    	android:id="@+id/play"
    	android:layout_width="wrap_content" 
    	android:layout_height="wrap_content" 
    	android:src="@drawable/play"
        />
    <ImageButton
        android:id="@+id/pause"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/pause"
        />
    <ImageButton
    	android:id="@+id/stop"
    	android:layout_width="wrap_content" 
    	android:layout_height="wrap_content" 
    	android:src="@drawable/stop"
    	/>
    </LinearLayout>	
    </RelativeLayout>

    Activity:

    import java.io.IOException;
    
    import android.app.Activity;
    import android.media.AudioManager;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.WindowManager;
    import android.widget.RelativeLayout.LayoutParams;
    import android.widget.ImageButton;
    
    public class SurfaceViewPlayVideo extends Activity
    	implements OnClickListener
    {
    	SurfaceView surfaceView;
    	ImageButton play, pause, stop;
    	MediaPlayer mPlayer;
    	// 记录当前视频的播放位置
    	int position;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		// 获取界面中的3个button
    		play = (ImageButton) findViewById(R.id.play);
    		pause = (ImageButton) findViewById(R.id.pause);
    		stop = (ImageButton) findViewById(R.id.stop);
    		// 为3个button的单击事件绑定事件监听器
    		play.setOnClickListener(this);
    		pause.setOnClickListener(this);
    		stop.setOnClickListener(this);
    		// 创建MediaPlayer
    		mPlayer = new MediaPlayer();
    		surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
    		// 设置播放时打开屏幕
    		surfaceView.getHolder().setKeepScreenOn(true);
    		surfaceView.getHolder().addCallback(new SurfaceListener());
    	}
    
    	@Override
    	public void onClick(View source)
    	{
    		try
    		{
    			switch (source.getId())
    			{
    				// 播放button被单击
    				case R.id.play:
    					play();
    					break;
    				// 暂停button被单击
    				case R.id.pause:
    					if (mPlayer.isPlaying())
    					{
    						mPlayer.pause();
    					}
    					else
    					{
    						mPlayer.start();
    					}
    					break;
    				// 停止button被单击
    				case R.id.stop:
    					if (mPlayer.isPlaying()) mPlayer.stop();
    					break;
    			}
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
    	}
    
    	private void play() throws IOException
    	{
    		mPlayer.reset();
    		mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    		// 设置须要播放的视频
    		mPlayer.setDataSource("/mnt/sdcard/movie.3gp");
    		// 把视频画面输出到SurfaceView
    		mPlayer.setDisplay(surfaceView.getHolder());  //①
    		mPlayer.prepare();
    		// 获取窗体管理器
    		WindowManager wManager = getWindowManager();
    		DisplayMetrics metrics = new DisplayMetrics();
    		// 获取屏幕大小
    		wManager.getDefaultDisplay().getMetrics(metrics);
    		// 设置视频保持纵横比缩放到占满整个屏幕
    		surfaceView.setLayoutParams(new LayoutParams(metrics.widthPixels
    			, mPlayer.getVideoHeight() * metrics.widthPixels
    			/ mPlayer.getVideoWidth()));
    		mPlayer.start();
    	}
    
    	private class SurfaceListener implements SurfaceHolder.Callback
    	{
    		@Override
    		public void surfaceChanged(SurfaceHolder holder, int format,
    			int width, int height)
    		{
    		}
    
    		@Override
    		public void surfaceCreated(SurfaceHolder holder)
    		{
    			if (position > 0)
    			{
    				try
    				{
    					// 開始播放
    					play();
    					// 并直接从指定位置開始播放
    					mPlayer.seekTo(position);
    					position = 0;
    				}
    				catch (Exception e)
    				{
    					e.printStackTrace();
    				}
    			}
    		}
    
    		@Override
    		public void surfaceDestroyed(SurfaceHolder holder)
    		{
    		}
    	}
    
    	// 当其它Activity被打开,暂停播放
    	@Override
    	protected void onPause()
    	{
    		if (mPlayer.isPlaying())
    		{
    			// 保存当前的播放位置
    			position = mPlayer.getCurrentPosition();
    			mPlayer.stop();
    		}
    		super.onPause();
    	}
    
    	@Override
    	protected void onDestroy()
    	{
    		// 停止播放
    		if (mPlayer.isPlaying()) mPlayer.stop();
    		// 释放资源
    		mPlayer.release();
    		super.onDestroy();
    	}
    }
    


  • 相关阅读:
    Event bubbling
    input/change event practice
    Form event
    Event_Object
    DOM_this keyword
    Random color generator exercise
    DOM_events_addEventListener
    Spring值SpEL
    Spring之使用外部属性文件
    Spring之Bean的作用域
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4035437.html
Copyright © 2011-2022 走看看