MediaPlayer之视频,拍照,录像
来源:互联网 发布:jquery获取数据库数据 编辑:程序博客网 时间:2024/06/06 08:34
1:视频播放器
使用VideoView、SurfaceView播放视频,它俩的区别在于:VideoView播放视频我们不需要去写播放按钮控件和进度条控件,你只要写一个VideoView控件就可以了,它自带得有播放控件以及暂停控件还有进度条控件,并且它还自己会计算时间就不需要我们再去计算时间了。SurfaceView播放视频则需要我们去写播放控件以及进度条还需要自己去计算时间。如果你不是专门需要视频播放器的话我建议用VideoView,因为它用起来比较方便,不需要过多复杂的过程,但是如果你是需要去做专门的视频播放器的话还是SurfaceView比较好,因为它可以自己去布置自己需要布局。下面我们就来实践
SurfaceView:
xml布局
<SeekBarpublic 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"/>
阅读全文
0 0
- MediaPlayer之视频,拍照,录像
- 视频播放器MediaPlayer拍照Camera-录像MediaRecorder
- 多媒体(视频播放,拍照,录像)
- Android多媒体(视频播放器-拍照-录像)
- 多媒体(视频播放器-拍照-录像)
- Android------多媒体(视频播放器-拍照-录像)
- 拍照 录像
- 拍照录像
- MediaPlayer之视频播放
- Android开发-拍照录像-AndroidStudio(三)VCamera仿微信小视频
- 28.Android-多媒体(视频播放器-拍照-录像)
- Android视频播放之MediaPlayer
- iOS之打开照相机拍照或者录像/打开手机的相册或者视频/视频压缩/自定义相机界面/照片或视频保存到相册
- 交叉编绎OpenCv之预览,拍照和录像
- AForge.net 使用之录像拍照功能实现
- Android实战技巧之三十一:拍照和录像 with Camera
- html5视频前端视频上传,手机拍照上传,手机录像上传
- 录像、录音和拍照
- Python里的一些注释规范
- 1.数据库基本概念知识
- scp或ssh 出现WARNING: Your password has expired.
- pip简单使用
- java线程池之java自带的四种线程池
- MediaPlayer之视频,拍照,录像
- 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- div 中心对齐
- HDU 6206 Apple (数学 高精度计算)
- python xlrd xlwt
- 继续阅读Proxy
- 在线编程题-计算文本的 TFIDF值
- Html中的document对象和window对象
- 2.数据完整性