Android 相机,视频录制

源自:http://my.oschina.net/kooeasy/blog/478181

现在的收集一般都会提供相机功能,有些相机大镜头已经支持1000万以上的像素,有些还支持光学变焦,这些收集已经变成了抓也数码相机,为了充分利用手机上的相机功能,Android应用可以控制拍照和录制视频。

权限相关

?


1

2

3

4

5

6

7

8

     <!--摄像头相关-->

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

    <uses-feature android:name="android.hardware.camera" />

    <uses-feature android:name="android.hardware.camera.autofocus" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <!--音视频相关-->

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

拍照

一、通过系统Intent进行拍照

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

创建Uri方法一://添加参数ContentValues values = new ContentValues();//设置文件名称values.put(MediaStore.Images.Media.DISPLAY_NAME, String.valueOf(System.currentTimeMillis())+".jpg");//设置文件类型values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");//添加存储的位置的uriuri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

创建Uri方法二:File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+System.currentTimeMillis()+".jpg");uri = Uri.fromFile(file);

//添加图像方向intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);//设置图像输出位置intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

startActivityForResult(intent,1);

获取返回的图像路径

public static String getPathFromUri(Context mContext,Uri contentUri){    String[] proj = { MediaStore.Images.Media.DATA };    CursorLoader loader = new CursorLoader(mContext, contentUri, proj, null, null, null);    Cursor cursor = loader.loadInBackground();    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);    cursor.moveToFirst();    return cursor.getString(column_index);}

通过路径加载Bitmap

Bitmap bitmap = BitmapFactory.decodeFile(getPathFromUri(this, uri));

二、利用Camrea拍照

1、调用Camera的open()打开相机

2、调用Camera的getParameters()获取拍照参数。该方法返回一个Camera.Paremeters对象

3、调用Camera.Parameters对象方法设置拍照的参数

4、调用Camera.startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreviewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。

5、调用Camera的takePicture()方法进行拍照

6、结束程序时,调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源

public class CameraActivity extends Activity {

    private SurfaceView mSurfaceView;    private View mTake,mCancle;    private SurfaceHolder mSurfaceHolder;    private boolean isPreview = false;    private Camera mCamera;    private Camera.AutoFocusCallback autoFocusCallback = new Camera.AutoFocusCallback() {        @Override        public void onAutoFocus(boolean success, Camera camera) {            if(success){                // 第一个监听器;当用户按下快门时激发该监听器                // 第二个监听器;当相机获取原始照片时激发该监听器                // 第三个监听器;当相机获取JPG照片时激发该监听器                mCamera.takePicture(new Camera.ShutterCallback() {                    @Override                    public void onShutter() {                    //快门按下时                    }                }, new Camera.PictureCallback() {                    @Override                    public void onPictureTaken(byte[] data, Camera camera) {                    //此处代码可以决定是否需要保存原始照片信息                    }                }, new Camera.PictureCallback() {                    @Override                    public void onPictureTaken(byte[] data, Camera camera) {                        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);                        //创建矩阵 旋转图像                        Matrix matrix = new Matrix();                        matrix.setRotate(90f,bitmap.getWidth()/2,bitmap.getHeight()/2);                        Bitmap bit =Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);                        //销毁原图                        bitmap.recycle();

                        mImage.setImageBitmap(bit);                        File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");                        FileOutputStream fos = null;                        try {                            fos = new FileOutputStream(file);                            bit.compress(Bitmap.CompressFormat.JPEG,100,fos);                            try {

                                fos.close();                            } catch (IOException e) {                                e.printStackTrace();                            }                        } catch (FileNotFoundException e) {                            e.printStackTrace();                        }                        mCamera.stopPreview();;                        mCamera.startPreview();                        isPreview=true;                    }                });            }        }    };    private ImageView mImage;

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

    }

    private void setAllClick() {        mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {

            @Override            public void surfaceCreated(SurfaceHolder holder) {                initCamera();            }            @Override            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }            @Override            public void surfaceDestroyed(SurfaceHolder holder) {                if (mCamera != null) {                    if (isPreview) {                        mCamera.stopPreview();                        mCamera.release();                        mCamera = null;                    }                }            }        });

        mTake.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //拍照                if (mCamera != null) {                    //添加自动聚焦                    mCamera.autoFocus(autoFocusCallback);//                    takePhoto();                }            }        });    }

    private int mPreviewWidth=0;    private int mPreviewHeight=0;

    /**     * 初始化相机     */    private void initCamera() {

        if(!isPreview){            //打开相机//            mCamera = Camera.open(Camera.getNumberOfCameras()-1);            mCamera = Camera.open(0);

        }        if(mCamera!=null&&!isPreview){            //获取相关设置            Camera.Parameters parameters = mCamera.getParameters();

            List<Camera.Size> previewsizes = parameters.getSupportedPreviewSizes();

            Iterator<Camera.Size> iterator = previewsizes.iterator();            while(iterator.hasNext()){                Camera.Size next = iterator.next();                if(next.width>mPreviewWidth&&next.height>mPreviewHeight){                    mPreviewWidth=next.width;                    mPreviewHeight=next.height;                }                Log.i("TAG","camera->"+mPreviewWidth+":"+mPreviewHeight);            }

            Log.i("TAG","surface->"+mSurfaceView.getWidth()+":"+mSurfaceView.getHeight());

            //设置预览招聘时每秒显示多少帧的最小值和最大值//            parameters.setPreviewFpsRange(10, 20);            //设置图片格式            parameters.setPictureFormat(PixelFormat.JPEG);            //设置预览大小//            parameters.setPreviewSize(mPreviewWidth, mPreviewHeight);            //设置照片大小            parameters.setPictureSize(mPreviewWidth, mPreviewHeight);            //设置JPG照片的质量            parameters.set("jpeg-quality", 100);

            //设置取景的SutfaceView            try {                //设置显示方向                mCamera.setDisplayOrientation(90);                mCamera.setParameters(parameters);                //设置配置                mCamera.setPreviewDisplay(mSurfaceHolder);                mCamera.startPreview();            } catch (IOException e) {                e.printStackTrace();            }        }        isPreview=true;    }

    /**     * 业务过程     */    private void process() {

        mSurfaceHolder = mSurfaceView.getHolder();        //设置Surface不需要自己维护还冲区        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    }

    /**     * 初始化视图     */    private void initView() {        mSurfaceView =(SurfaceView) findViewById(R.id.camera_view);        mTake = findViewById(R.id.take_photo);        mCancle = findViewById(R.id.cancle);        mImage = (ImageView)findViewById(R.id.image);    }

}

 

录像

一、使用系统Intent

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);//限制时长 sintent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 5);//限制大小 intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024*1024);//设置质量intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);//设置输出位置intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, 1);

返回

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);    if(resultCode==RESULT_OK){        Uri uri = data.getData();        //视频地址        String videoPath = getPathFromUri(this,uri);    }}
public static String getPathFromUri(Context mContext,Uri contentUri){    String[] proj = { MediaStore.Images.Media.DATA };    CursorLoader loader = new CursorLoader(mContext, contentUri, proj, null, null, null);    Cursor cursor = loader.loadInBackground();    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);    cursor.moveToFirst();    return cursor.getString(column_index);}

二、使用MediaRecord

public class RecordeActivity extends Activity {

    private SurfaceView mRecordView;    private View mStart, mStop;    private boolean isRecord = false;    private SurfaceHolder mSurfaceHolder;

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

        initView();

        process();

        setAllClick();    }

    private void setAllClick() {        mStart.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if(!isRecord){                    startRecord();                }            }        });        mStop.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if(isRecord){                    //停止录制                    mRecorder.stop();                    //释放资源                    mRecorder.release();                    mRecorder=null;                }            }        });    }

    private File file;    private MediaRecorder mRecorder;

    /**     * 开始录制     */    private void startRecord() {        file = new File(Environment.getExternalStorageDirectory() + "/" + System.currentTimeMillis() + ".mp4");        try {            //创建MediaPay对象            mRecorder = new MediaRecorder();            mRecorder.reset();            //设置从麦克风采集声音            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);            //设置从摄像头采集图像            mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);            mRecorder.setOrientationHint(90);            //设置视频文件输出格式,这个设置必须在声音编码格式,图像编码格式之前设置            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);            //设置声音编码格式、图像编码格式            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);            mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);            //设置视频大小            mRecorder.setVideoSize(1280, 960);            //设置帧率  每秒32帧            mRecorder.setVideoFrameRate(32);            //设置编码比特率            mRecorder.setVideoEncodingBitRate(5*1024*1024);            mRecorder.setOutputFile(file.getAbsolutePath());            //指定使用Surface来预览视频            mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());            //准备            mRecorder.prepare();            //开始录制            mRecorder.start();            isRecord = true;        } catch (IOException e) {            e.printStackTrace();        }

    }

    private void process() {        mSurfaceHolder = mRecordView.getHolder();        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        mSurfaceHolder.setKeepScreenOn(true);    }

    private void initView() {        mRecordView = (SurfaceView) findViewById(R.id.video_recorde);        mStart = findViewById(R.id.start);        mStop = findViewById(R.id.stop);    }}
时间: 2024-10-23 05:35:04

Android 相机,视频录制的相关文章

Android实现视频录制

安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder. 每种方法都有自己的优缺点.接下来,把两种方法的代码写出来. 先说第一种方法,也是最简单的方法,那就是直接调用系统的视频功能. 代码很简单: //这是跳转至录制视频界面的按钮监听 class VideoListener implements OnClickListener {   @Override public void onClick(View v) {   Intent intent = new

Android &amp; IOS视频录制技术方案

屡次想经营一个技术博客,总因为各种理由推脱.这次下定决心开写,不为自我营销,不为扩大社交,只为了督促自己学习.近几个月定时更新两条线,一个是短视频处理技术,一个是<算法导论>笔记,也借机温故知新.精力有限而且学习也不能贪多,所以每周仅各一篇. 警告诸多网站:原创博客,未经本人允许不得转载. 移动端视频录制的技术方案,我所能想到并且尝试过的,有如下几种: 方案一: 用系统开发sdk录制的接口. 弊端: 1):不能更改视频比例,一般都有该手机屏幕分辨率所对应得视频录制分辨率,另外手机系统提供得分辨

Android 实现视频录制播放

实现类似微信的小视频功能,可以录制一个视频然后播放该视频. 视频录制,使用一个自定义控件. <span style="font-size:14px;">/** * 视频录制控件 * * @author lip * * @date 2015-3-16 */ public class MovieRecorderView extends LinearLayout implements OnErrorListener { private SurfaceView mSurfaceVi

android 截图,视频录制命令 screencap screenrecord screenshot

时间限制视频录制: screenrecord  --time-limit 20 /sdcard/demo.mp4 抓屏: screencap -p /sdcard/screen.png screenshot /sdcard/screen.png 视频录制命令screenrecord # screenrecord --help Usage: screenrecord [options] <filename> Records the device's display to a .mp4 file.

Android(java)学习笔记144:Android音视频录制类MediaRecorder用法举例

Android语音录制可以通过MediaRecorder和AudioRecorder.MediaRecorder本来是多媒体录制控件,可以同时录制视频和语音,当不指定视频源时就只录制语音(默认录制语言):AudioRecorder只能录制语音.二者录制的区别在于,MediaRecorder固定了语音的编码格式,具体平台支持类型可以在http://developer.android.com/guide/appendix/media-formats.html这里查看,而且使用时指定输出文件,在录制的

【Android】20.3 拍照和视频录制

分类:C#.Android.VS2015: 创建日期:2016-03-13 一.简介 Android提供的Camera有两个典型的版本,一个是在Android 5.0以前提供的,称为Camera:另一个是从Android 5.0开始提供的,称为Camera2. 这里仅演示使用系统Camera程序实现拍照的基本用法. 二.Camera基本概念 用Camera实现拍照和摄像功能时,有以下两种实现办法: 一是直接利用Intent启动系统自带的Camera App打开相机实现拍照和摄像功能,然后通过An

Android短视频开发

Android短视频录制 又拍云Android短视频录制SDK功能说明: Android 短视频播放 又拍云 Android 短视频播放器SDK功能说明:完美兼容Android2.3 (API)及其以上 支持多种视频协议:HLS,RTMP,HTTP-FLV等,支持HLS多种分辨率切换: 支持本地视频播放: 支持自由设置短视频播放窗口大小 支持全屏播放 支持缓冲区大小设置 提供UpVideoView控件 支持ARM.ARMv7a.ARM64v8a.X86等主流芯片体系架构. 进入又拍云短视频服务页

Android 微信小视频录制功能实现

目录 开发之前 开发环境 相关知识点 开始开发 案例预览 案例分析 搭建布局 视频预览的实现 自定义双向缩减的进度条 录制事件的处理 长按录制 抬起保存 上滑取消 双击放大(变焦) 实现视频的录制 实现视频的停止 完整代码 总结 开发之前 这几天接触了一下和视频相关的控件, 所以, 继之前的微信摇一摇, 我想到了来实现一下微信小视频录制的功能, 它的功能点比较多, 我每天都抽出点时间来写写, 说实话, 有些东西还是比较费劲, 希望大家认真看看, 说得不对的地方还请大家在评论中指正. 废话不多说,

利用FFmpeg玩转Android视频录制与压缩(二)&lt;转&gt;

转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女票已经分了又合,合了又分,本屌依旧骄傲单身.上一次啊我们大致说了一些简单的FFmpeg命令以及Java层简单的调用方式,然后有很多朋友在github或者csdn上给我留言,很多时候我都选择避而不答,原因是本库以前用的so包是不开源的,我根本改不了里面东西.但是这一次啊我们玩点大的,我重新编译了FFm

Android视频录制从不入门到入门系列教程(四)————Camera Parameter

Camera提供了一个叫做setParameters的方法帮助开发者设置相机的相关参数. 通过Camera的getParameters方法可以获取到当前为相机设置的相关参数. 下面简单介绍下,视频录制会用到的几个参数的用法. 一.设置PreviewSize,即视频预览大小,也即输出到SurfaceView的视频图片的分辨率大小. 需要注意的是,PreviewSize只有那么有限的几种,各个手机的值也不近相同,不是随便传进去个Size都行的.当然你非得随便搞个Size传进去,编译时不会出现任何问题