MediaPlayer之视频,拍照,录像

本文详细介绍如何在Android应用中实现视频播放与录制功能,包括使用VideoView和SurfaceView播放视频的具体实现方法,以及通过Camera和MediaRecorder进行拍照与录像的技术要点。

1:视频播放器

     使用VideoView、SurfaceView播放视频,它俩的区别在于:VideoView播放视频我们不需要去写播放按钮控件和进度条控件,你只要写一个VideoView控件就可以了,它自带得有播放控件以及暂停控件还有进度条控件,并且它还自己会计算时间就不需要我们再去计算时间了。SurfaceView播放视频则需要我们去写播放控件以及进度条还需要自己去计算时间。如果你不是专门需要视频播放器的话我建议用VideoView,因为它用起来比较方便,不需要过多复杂的过程,但是如果你是需要去做专门的视频播放器的话还是SurfaceView比较好,因为它可以自己去布置自己需要布局。下面我们就来实践

    SurfaceView:

          xml布局

<SeekBar
 
public class MainActivity extends AppCompatActivity {

    private SurfaceView sv_main_surfaceview;
    private SeekBar sb_main_seekbar_surfaceview;
    private ImageButton ib_main_imagebutton_surfaceview;
    private MediaPlayer mediaPlayer;
    private File[] files;
    private File file;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         getControl();


        //判断内存卡是否可用
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            //获取内存卡路径
            String sdpath=Environment.getExternalStorageDirectory().getAbsolutePath();
            file = new File(sdpath+"/Movies/");
            files = file.listFiles();

        }

        //seecbar滑动事件
        sb_main_seekbar_surfaceview.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                 //设置滑动位置
                mediaPlayer.seekTo(seekBar.getProgress());


            }
        });




    }

    private void getControl() {
        //获取surfaceview控件
        sv_main_surfaceview = (SurfaceView) findViewById(R.id.sv_main_surfaceview);
        //获取seekbar控件
        sb_main_seekbar_surfaceview = (SeekBar) findViewById(R.id.sb_main_seekbar_surfaceview);
        //获取imagebutton控件
        ib_main_imagebutton_surfaceview = (ImageButton) findViewById(R.id.ib_main_imagebutton_surfaceview);

    }



    //imagebutton点击事件
    public void videoplay(View view){


          if (mediaPlayer==null) {
              //创建媒体
              mediaPlayer = new MediaPlayer();
              try {
                  //指定播放源

                 // mediaPlayer.setDataSource(this, Uri.parse(file.getAbsolutePath()));
                  mediaPlayer.setDataSource(this,Uri.parse("file://mnt/sdcard/Movies/1505736258614.mp4"));

                  //准备
                  mediaPlayer.prepare();

              } catch (IOException e) {
                  e.printStackTrace();
              }
              //开始
              mediaPlayer.start();

               //将画面放在surfaceview
              mediaPlayer.setDisplay(sv_main_surfaceview.getHolder());




              //改变图片
              ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_pause);
              //获取视频时间
              int long_time = mediaPlayer.getDuration();
              Toast.makeText(this, ""+long_time, Toast.LENGTH_SHORT).show();
              //给seekbar设置时间
              sb_main_seekbar_surfaceview.setMax(long_time);
              //调用线程
              new MyThread().start();


          }else if (mediaPlayer.isPlaying()){
              //暂停
              mediaPlayer.pause();
              //改变按钮图片
              ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_play);
          }else{
              //开始
              mediaPlayer.start();

              //改变图片
              ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_pause);

          }






    }

   //耗时线程
    class MyThread extends Thread{
       @Override
       public void run() {
           super.run();
          while(sb_main_seekbar_surfaceview.getProgress()<sb_main_seekbar_surfaceview.getMax()){
                    //获取当前播放位置
              int current_time=mediaPlayer.getCurrentPosition();
              sb_main_seekbar_surfaceview.setProgress(current_time);

          }

       }
   }
android :layout_width= "match_parent" android :layout_height= "wrap_content" android :id= "@+id/sb_main_seekbar_surfaceview" /> < ImageButton android :layout_width= "wrap_content" android :layout_height= "wrap_content" android :src= "@android:drawable/ic_media_play" android :onClick= "videoplay" android :id= "@+id/ib_main_imagebutton_surfaceview" /> < SurfaceView android :layout_width= "356dp" android :layout_height= "380dp" android :id= "@+id/sv_main_surfaceview" />

    activity实现业务方法

public class MainActivity extends AppCompatActivity {

    private SurfaceView sv_main_surfaceview;
    private SeekBar sb_main_seekbar_surfaceview;
    private ImageButton ib_main_imagebutton_surfaceview;
    private MediaPlayer mediaPlayer;
    private File[] files;
    private File file;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         getControl(); //获取控件


        //seecbar滑动事件
        sb_main_seekbar_surfaceview.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                 //设置滑动位置
                mediaPlayer.seekTo(seekBar.getProgress());


            }
        });

    }

    private void getControl() {
        //获取surfaceview控件
        sv_main_surfaceview = (SurfaceView) findViewById(R.id.sv_main_surfaceview);
        //获取seekbar控件
        sb_main_seekbar_surfaceview = (SeekBar) findViewById(R.id.sb_main_seekbar_surfaceview);
        //获取imagebutton控件
        ib_main_imagebutton_surfaceview = (ImageButton) findViewById(R.id.ib_main_imagebutton_surfaceview);

    }


    //imagebutton点击事件
    public void videoplay(View view){

          if (mediaPlayer==null) {
              //创建媒体
              mediaPlayer = new MediaPlayer();
              try {
                  //指定播放源

                  mediaPlayer.setDataSource(this,Uri.parse("file://mnt/sdcard/Movies/1505736258614.mp4"));

                  //准备
                  mediaPlayer.prepare();

              } catch (IOException e) {
                  e.printStackTrace();
              }
              //开始
              mediaPlayer.start();

               //将画面放在surfaceview
              mediaPlayer.setDisplay(sv_main_surfaceview.getHolder());

              //改变图片
              ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_pause);
              //获取视频时间
              int long_time = mediaPlayer.getDuration();
              Toast.makeText(this, ""+long_time, Toast.LENGTH_SHORT).show();
              //给seekbar设置时间
              sb_main_seekbar_surfaceview.setMax(long_time);
              //调用线程
              new MyThread().start();


          }else if (mediaPlayer.isPlaying()){
              //暂停
              mediaPlayer.pause();
              //改变按钮图片
              ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_play);
          }else{
              //开始
              mediaPlayer.start();

              //改变图片
              ib_main_imagebutton_surfaceview.setImageResource(android.R.drawable.ic_media_pause);
          }
    }

   //耗时线程
    class MyThread extends Thread{
       @Override
       public void run() {
           super.run();
          while(sb_main_seekbar_surfaceview.getProgress()<sb_main_seekbar_surfaceview.getMax()){
                    //获取当前播放位置
              int current_time=mediaPlayer.getCurrentPosition();
              sb_main_seekbar_surfaceview.setProgress(current_time);
          }
       }
   }

}

权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />



   VideoView:
      xml布局
   
<VideoView
    android:layout_width="356dp"
    android:layout_height="380dp"
    android:id="@+id/vv_main_videoview"

    />

   activity业务方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_viedio);
    vv_main_videoview = (VideoView) findViewById(R.id.vv_main_videoview);

    //设置视频来源
    vv_main_videoview.setVideoURI(Uri.parse("file://mnt/sdcard/Movies/1505736258614.mp4"));

    //实例化媒体控制器
    MediaController mediaController=new MediaController(this);
    mediaController.setMediaPlayer(vv_main_videoview);
    vv_main_videoview.setMediaController(mediaController);
}
}

 1:拍照
    实现拍照技术有几种方法,你可以调用自己手机上的照相机,一点击拍照就让它进入到你的相机里面,还一种就是把拍照画面转入到你的布局页面。
下面我们就来实现将画面出现在布局中。
  拍照实现步骤:
	<1>界面使用SurfaceView控件,显示照相机的画面
	<2>SurfaceView接受摄像头界面变化的信息
		surfaceView.getHolder().addCallback()
	<3>重写三个方法
		surfaceDestroyed--->当预览界面关闭时,触发
			一般在这里执行销毁照相机的操作,释放内存
			camera.stopPreview();
			camera.release();
			camera = null;
		surfaceCreated----->预览界面被创建时,调用
			一般在这里打开照相机和设置照相机的一些参数


			// 打开摄像头
			camera = Camera.open();


			// 给摄像头设置参数
			Parameters parameters = camera.getParameters();
			// 设置每秒3栈
			parameters.setPreviewFrameRate(3);
			// 设置照片的输出格式
			parameters.setPictureFormat(PixelFormat.JPEG);
			// 设置照片的质量
			parameters.set("jpeg-quality", 85);
			// 给照相机设置参数
			camera.setParameters(parameters);
			//将摄像头的画面显示到SurfaceView控件上
			camera.setPreviewDisplay(sv_main_camera.getHolder());
			// 开始预览
			camera.startPreview();
		surfaceChanged----->当预览界面的格式和大小发生改变时,触发
	<4>保存
		camera.takePicture
		将照片保存到内存卡(压缩)
布局:

<SurfaceView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/sv_mian_view"
    />



 <Button
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:onClick="camera"
     android:text="拍照"
     />


activity:

public class CameraActivity extends AppCompatActivity {

    private SurfaceView sv_mian_view;
    private Camera camera;
    private FileOutputStream fileOutputStream;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);

        sv_mian_view = (SurfaceView) findViewById(R.id.sv_mian_view);

        sv_mian_view.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {

                //打开摄像头
                camera = Camera.open();

                //给摄像头设置参数
                Camera.Parameters parameters = camera.getParameters();

                //设置图片格式
                parameters.setPictureFormat(PixelFormat.JPEG);

                 //设置图片质量
                parameters.set("jpeg-quality",85);

                camera.setParameters(parameters);

                //将摄像头画面转到surfaceview
                try {
                    camera.setPreviewDisplay(sv_mian_view.getHolder());
                    camera.startPreview();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

                if(camera!=null){
                    camera.stopPreview();
                    camera.release();
                    camera=null;
                }
            }
        });

    }

    public void camera(View view){
        camera.takePicture(null, null, new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] bytes, Camera camera) {
                Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                try {
                    fileOutputStream = new FileOutputStream("/mnt/sdcard/Pictures/Screenshots/G160828"+System.currentTimeMillis()+".jpg");
                    //压缩技术
                    bitmap.compress(Bitmap.CompressFormat.JPEG,85,fileOutputStream);
                    camera.stopPreview();
                    camera.startPreview();

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

权限:<uses-permission android:name="android.permission.CAMERA" />

3:视频录像
实现步骤:
	<1>将视频动画显示到SurfaceView控件上
	<2>使用MediaRecorder类进行视频的录制
		常用的方法:
		mediaRecorder.reset();
		mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频
		mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
		mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
		mediaRecorder.setVideoFrameRate(3); //每秒3帧
		mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置视频编码方式
		mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
		File videoFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".3gp");
		mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
		mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
		mediaRecorder.prepare();//预期准备
		mediaRecorder.start();//开始刻录
		mediaRecorder.stop();//停止刻录
权限
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值