MediaPlayer之视频,拍照,录像

来源:互联网 发布:jquery获取数据库数据 编辑:程序博客网 时间:2024/06/06 08:34

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业务方法
@Overrideprotected 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"/>

原创粉丝点击