Android 中MediaRecorder和Camera的关系

从功能的角度MediaRecorder一般包含音频,视频记录,视频预览的功能,Camera包含了取景区预览,静态图像捕获的功能。在Android中,应用程序自上而下分成JAVA应用,JAVA框架,JNI,C框架,具体实现几个部分。多媒体方面的程序尤其是这样。MediaRecorder 和Camera在Android中都有自上而下的架构,它们在顶层JAVA应用层,共用一个应用程序Camera(其中的程序也是独立的),在JAVA框 架和JNI层是独立的,主要的联系在于Camer的C框架以下的内容被MediaRecorder实现(也就是PVAuthor)所调用,作为 MediaRecorder实现的视频输入设备,它的作用是负责传输视频数据和提供显示预览。本身Camera C框架以下的代码基本提供了取景器预览(Preview)、视频数据流获取、静止图像获取三方面的功能,MediaRecorder实现使用其取景器预览和视频数据流获取的功能,而Camera的JNI使用其取景器预览和静止图像获取两方面的功能。

上一节讲述了关于MediaRecorder的声音的录制,这一节主要讲MediaRecorder的视频录制和播放,关于MediaRecorder不再多说,直接行代码了:

首先添加权限:

android:name="android.permission.INTERNET"/>android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>android:name="android.permission.WRITE_SETTINGS" />android:name="android.permission.RECORD_AUDIO"/>android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>android:name="android.permission.CAMERA"/>

1、录制的布局文件xml:

xmlns:android="http://schemas.android.com/apk/res/android"      android:orientation="horizontal"      android:layout_width="match_parent"      android:layout_height="match_parent">            android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:layout_weight="1" >                    android:id="@+id/surfaceview"            android:layout_width="fill_parent"            android:layout_height="fill_parent" />                android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:layout_weight="4"        android:gravity="center"        android:orientation="vertical" >                    android:id="@+id/start"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="录制" />                    android:id="@+id/stop"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="暂停" />                    android:id="@+id/starting"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="播放"            android:onClick="btnClick"/>    
2、录制的主要代码:

  private Button start;// 开始录制按钮    private Button stop;// 停止录制按钮    private MediaRecorder mediarecorder;// 录制视频的类    private SurfaceView surfaceview;// 显示视频的控件    // 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看    // 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口    private SurfaceHolder surfaceHolder;    private String FileName = "/sdcard/love.3gp";    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏        // 设置横屏显示        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);        // 选择支持半透明模式,在有surfaceviewactivity中使用。        getWindow().setFormat(PixelFormat.TRANSLUCENT);        setContentView(R.layout.layout_video);        init();    }    private void init() {        start = (Button) this.findViewById(R.id.start);        stop = (Button) this.findViewById(R.id.stop);        start.setOnClickListener(listener);        stop.setOnClickListener(listener);        surfaceview = (SurfaceView) this.findViewById(R.id.surfaceview);        SurfaceHolder holder = surfaceview.getHolder();// 取得holder        holder.addCallback(this); // holder加入回调接口        // setType必须设置,要不出错.        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    }    public void btnClick(View view){        Intent intent = new Intent(this,PlayerActivity.class);        intent.putExtra("fileName",FileName);        startActivity(intent);    }    private View.OnClickListener listener = new View.OnClickListener() {        @Override        public void onClick(View v) {            if (v == start) {                mediarecorder = new MediaRecorder();// 创建mediarecorder对象                // 设置录制视频源为Camera(相机)                mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);                // 设置录制完成后视频的封装格式THREE_GPP3gp.MPEG_4mp4                mediarecorder                        .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);                // 设置录制的视频编码h263 h264                mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);                // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错                mediarecorder.setVideoSize(176, 144);                // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错                mediarecorder.setVideoFrameRate(20);                mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());                // 设置视频文件输出的路径                mediarecorder.setOutputFile(FileName);                try {                    // 准备录制                    mediarecorder.prepare();                    // 开始录制                    mediarecorder.start();                } catch (IllegalStateException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }            if (v == stop) {                if (mediarecorder != null) {                    // 停止录制                    mediarecorder.stop();                    // 释放资源                    mediarecorder.release();                    mediarecorder = null;                }            }        }    };    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width,                               int height) {        // holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder        surfaceHolder = holder;    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        // holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder        surfaceHolder = holder;    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        // surfaceDestroyed的时候同时对象设置为null        surfaceview = null;        surfaceHolder = null;        mediarecorder = null;    }}
3、用VideoView进行录制的视频播放:

xml文件:

xmlns:android="http://schemas.android.com/apk/res/android"              android:orientation="vertical"              android:layout_width="match_parent"              android:layout_height="match_parent">            android:id="@+id/videoView"        android:layout_width="match_parent"        android:layout_height="match_parent"/>            android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal">                    android:id="@+id/start"            android:layout_width="0dp"            android:layout_weight="1"            android:layout_height="wrap_content"            android:text="开始"            android:onClick="btnClick"/>                    android:id="@+id/stop"            android:layout_width="0dp"            android:layout_weight="1"            android:layout_height="wrap_content"            android:text="暂停"            android:onClick="btnClick"/>                    android:id="@+id/cancel"            android:layout_width="0dp"            android:layout_weight="1"            android:layout_height="wrap_content"            android:text="返回"            android:onClick="btnClick"/>    
播放代码:

public class PlayerActivity extends AppCompatActivity{    private VideoView mView;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.player_layout);        init();    }    private void init() {        Intent intent = getIntent();        String fileName = intent.getStringExtra("fileName");        mView = (VideoView) findViewById(R.id.videoView);        //设置视频控制器        mView.setMediaController(new MediaController(this));        mView.setVideoPath(fileName);        mView.requestFocus();    }    public void btnClick(View view){        switch (view.getId()){            case R.id.start:                mView.start();                break;            case R.id.stop:                mView.pause();                break;            case R.id.cancel:                finish();                break;        }    }}

更多相关文章

  1. Android(安卓)安全机制概述
  2. Android声明和使用权限
  3. 获取web服务器xml数据
  4. Android(安卓)ApiDemos示例解析(88):Media->VideoView
  5. 探索 Android(安卓)Q:位置权限
  6. Android播放视频的方式
  7. Android(安卓)设备唯一标识(多种实现方案)
  8. 如何在Android智能手机上捕获数据包
  9. Android权限列表permission说明

随机推荐

  1. 【Android开发】交互界面布局详解
  2. Android(安卓)开发 回看
  3. SystemServer分析
  4. Standup Timer的MVC模式及项目结构分析
  5. 如何演示你的App?Android录制Gif动态图教
  6. Android 创建定时任务
  7. Android LayoutInflater深入分析及应用
  8. Android进程间通讯——使用Kotlin实现AID
  9. [Android] Android Badge技术分析
  10. Android面试之---谈谈你对Android NDK的