实现类似微信的小视频功能,可以录制一个视频然后播放该视频。

   视频录制,使用一个自定义控件。

      

/** * 视频录制控件 *  * @author lip *  * @date 2015-3-16 */public class MovieRecorderView extends LinearLayout implements OnErrorListener {     private SurfaceView mSurfaceView;    private SurfaceHolder mSurfaceHolder;    private ProgressBar mProgressBar;     private MediaRecorder mMediaRecorder;    private Camera mCamera;    private Timer mTimer;// 计时器    private OnRecordFinishListener mOnRecordFinishListener;// 录制完成回调接口     private int mWidth;// 视频分辨率宽度    private int mHeight;// 视频分辨率高度    private boolean isOpenCamera;// 是否一开始就打开摄像头    private int mRecordMaxTime;// 一次拍摄最长时间    private int mTimeCount;// 时间计数    private File mVecordFile = null;// 文件     public MovieRecorderView(Context context) {        this(context, null);    }     public MovieRecorderView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }     @TargetApi(Build.VERSION_CODES.HONEYCOMB)    public MovieRecorderView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        mWidth=320;        mHeight=240;        isOpenCamera=true;        mRecordMaxTime=10;         LayoutInflater.from(context).inflate(R.layout.moive_recorder_view, this);        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);        mProgressBar.setMax(mRecordMaxTime);// 设置进度条最大量         mSurfaceHolder = mSurfaceView.getHolder();        mSurfaceHolder.addCallback(new CustomCallBack());        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    }     /**     *      * @author liuyinjun     *      * @date 2015-2-5     */    private class CustomCallBack implements Callback {         @Override        public void surfaceCreated(SurfaceHolder holder) {            if (!isOpenCamera)                return;            try {                initCamera();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }         @Override        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {         }         @Override        public void surfaceDestroyed(SurfaceHolder holder) {            if (!isOpenCamera)                return;            freeCameraResource();        }     }     /**     * 初始化摄像头     *      * @author lip     * @date 2015-3-16     * @throws IOException     */    private void initCamera() throws IOException {        if (mCamera != null) {            freeCameraResource();        }        try {            mCamera = Camera.open();        } catch (Exception e) {            e.printStackTrace();            freeCameraResource();        }        if (mCamera == null)            return;         setCameraParams();        mCamera.setDisplayOrientation(90);        mCamera.setPreviewDisplay(mSurfaceHolder);        mCamera.startPreview();        mCamera.unlock();    }     /**     * 设置摄像头为竖屏     *      * @author lip     * @date 2015-3-16     */    private void setCameraParams() {        if (mCamera != null) {            Parameters params = mCamera.getParameters();            params.set("orientation", "portrait");            mCamera.setParameters(params);        }    }     /**     * 释放摄像头资源     *      * @author liuyinjun     * @date 2015-2-5     */    private void freeCameraResource() {        if (mCamera != null) {            mCamera.setPreviewCallback(null);            mCamera.stopPreview();            mCamera.lock();            mCamera.release();            mCamera = null;        }    }     private void createRecordDir() {       // File sampleDir = new File(Environment.getExternalStorageDirectory() + File.separator + "im/video/");        File sampleDir = new File(Environment.getExternalStorageDirectory() + File.separator+"RecordVideo/");        //File sampleDir = new File("/video/");        if (!sampleDir.exists()) {            sampleDir.mkdirs();        }        File vecordDir = sampleDir;        // 创建文件        try {            mVecordFile = File.createTempFile("recording", ".mp4", vecordDir);//mp4格式            //LogUtils.i(mVecordFile.getAbsolutePath());            Log.d("Path:",mVecordFile.getAbsolutePath());        } catch (IOException e) {        }    }     /**     * 初始化     *      * @author lip     * @date 2015-3-16     * @throws IOException     */    private void initRecord() throws IOException {        mMediaRecorder = new MediaRecorder();        mMediaRecorder.reset();        if (mCamera != null)            mMediaRecorder.setCamera(mCamera);        mMediaRecorder.setOnErrorListener(this);        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());        mMediaRecorder.setVideoSource(VideoSource.CAMERA);// 视频源        mMediaRecorder.setAudioSource(AudioSource.MIC);// 音频源        mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 视频输出格式        mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);// 音频格式        mMediaRecorder.setVideoSize(mWidth, mHeight);// 设置分辨率:        // mMediaRecorder.setVideoFrameRate(16);// 这个我把它去掉了,感觉没什么用        mMediaRecorder.setVideoEncodingBitRate(1 * 1024 * 512);// 设置帧频率,然后就清晰了        mMediaRecorder.setOrientationHint(90);// 输出旋转90度,保持竖屏录制        mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP);// 视频录制格式        // mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000);        mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath());        mMediaRecorder.prepare();        try {            mMediaRecorder.start();        } catch (IllegalStateException e) {            e.printStackTrace();        } catch (RuntimeException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        }    }     /**     * 开始录制视频     *      * @author liuyinjun     * @date 2015-2-5//     * @param fileName//     *            视频储存位置     * @param onRecordFinishListener     *            达到指定时间之后回调接口     */    public void record(final OnRecordFinishListener onRecordFinishListener) {        this.mOnRecordFinishListener = onRecordFinishListener;        createRecordDir();        try {            if (!isOpenCamera)// 如果未打开摄像头,则打开                initCamera();            initRecord();            mTimeCount = 0;// 时间计数器重新赋值            mTimer = new Timer();            mTimer.schedule(new TimerTask() {                 @Override                public void run() {                    // TODO Auto-generated method stub                    mTimeCount++;                    mProgressBar.setProgress(mTimeCount);// 设置进度条                    if (mTimeCount == mRecordMaxTime) {// 达到指定时间,停止拍摄                        stop();                        if (mOnRecordFinishListener != null)                            mOnRecordFinishListener.onRecordFinish();                    }                }            }, 0, 1000);        } catch (IOException e) {            e.printStackTrace();        }    }     /**     * 停止拍摄     *      * @author liuyinjun     * @date 2015-2-5     */    public void stop() {        stopRecord();        releaseRecord();        freeCameraResource();    }     /**     * 停止录制     *      * @author liuyinjun     * @date 2015-2-5     */    public void stopRecord() {        mProgressBar.setProgress(0);        if (mTimer != null)            mTimer.cancel();        if (mMediaRecorder != null) {            // 设置后不会崩            mMediaRecorder.setOnErrorListener(null);            mMediaRecorder.setPreviewDisplay(null);            try {                mMediaRecorder.stop();            } catch (IllegalStateException e) {                e.printStackTrace();            } catch (RuntimeException e) {                e.printStackTrace();            } catch (Exception e) {                e.printStackTrace();            }        }    }     /**     * 释放资源     *      * @author liuyinjun     * @date 2015-2-5     */    private void releaseRecord() {        if (mMediaRecorder != null) {            mMediaRecorder.setOnErrorListener(null);            try {                mMediaRecorder.release();            } catch (IllegalStateException e) {                e.printStackTrace();            } catch (Exception e) {                e.printStackTrace();            }        }        mMediaRecorder = null;    }     public int getTimeCount() {        return mTimeCount;    }     /**     * @return the mVecordFile     */    public File getmVecordFile() {        return mVecordFile;    }     /**     * 录制完成回调接口     *     * @author lip     *      * @date 2015-3-16     */    public interface OnRecordFinishListener {        public void onRecordFinish();    }     @Override    public void onError(MediaRecorder mr, int what, int extra) {        try {            if (mr != null)                mr.reset();        } catch (IllegalStateException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        }    }}


    视频播放:

   

public class MainActivity extends ActionBarActivity {    private MovieRecorderView movieRV;    private Button startBtn;    private Button stopBtn;    private Button playBtn;    private Button pauseBtn;    private SurfaceView playView;    private MediaPlayer player;    int position;    public MainActivity() {    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViews();        initEvents();        init();    }    private void init()    {        player=new MediaPlayer();        playView=(SurfaceView) this.findViewById(R.id.play_surfaceV);        //设置SurfaceView自己不管理的缓冲区        playView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        playView.getHolder().addCallback(new Callback() {            @Override            public void surfaceDestroyed(SurfaceHolder holder) {            }            @Override            public void surfaceCreated(SurfaceHolder holder) {                if (position>0) {                    try {                        //开始播放                        play();                        //并直接从指定位置开始播放                        player.seekTo(position);                        position=0;                    } catch (Exception e) {                        // TODO: handle exception                    }                }            }            @Override            public void surfaceChanged(SurfaceHolder holder, int format, int width,                                       int height) {            }        });    }    private void initViews()    {        movieRV=(MovieRecorderView)findViewById(R.id.moive_rv);        //录制        startBtn=(Button)findViewById(R.id.start_btn);        stopBtn=(Button)findViewById(R.id.stop_btn);        //播放        playBtn=(Button)findViewById(R.id.play_btn);        pauseBtn=(Button)findViewById(R.id.pause_btn);    }    private void initEvents()    {        //开始录制        startBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                movieRV.record(new MovieRecorderView.OnRecordFinishListener() {                    @Override                    public void onRecordFinish() {                    }                });            }        });        //停止录制        stopBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                movieRV.stop();            }        });        //播放已录制视频        playBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {               play();            }        });        //暂停        pauseBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {               if(player.isPlaying())               {                   player.pause();               }               else               {                   player.start();               }            }        });    }    @Override    protected void onPause() {        //先判断是否正在播放        if (player.isPlaying()) {            //如果正在播放我们就先保存这个播放位置            position=player.getCurrentPosition()            ;           player.stop();        }        super.onPause();    }    private void play()    {        try {            Log.d("play:","");            player.reset();            player.setAudioStreamType(AudioManager.STREAM_MUSIC);            //设置需要播放的视频            String path=movieRV.getmVecordFile().getAbsolutePath();            player.setDataSource(path);            Log.d("play:",path);            //把视频画面输出到SurfaceView            player.setDisplay(playView.getHolder());            player.prepare();            //播放            player.start();        } catch (Exception e) {            // TODO: handle exception        }    }}
布局文件:

     

                        
    需要的系统权限:

     

            

    基本的视频录制功能就可以实现了。

   下载地址:android仿微信视频录制播放

更多相关文章

  1. android 多媒体部分学习十四---网络视频播放(http/rtsp)
  2. android 调用系统前置摄像头
  3. ADROID 2.1 架构解析 11 系统时间
  4. Android中日期时间格式转换
  5. Android/Linux 的时间和定时器
  6. android 时间,日期对话框
  7. Android时间互换代码

随机推荐

  1. Android(安卓)Audio代码分析22 - AudioEf
  2. 【Android】ViewGroup全面分析
  3. android 拍摄视频
  4. Android(安卓)添加多张图片。
  5. android 语音识别
  6. Android(安卓)自定义窗口标题
  7. Android(安卓)P WiFi 连接以及获取 IP 流
  8. Android(安卓)中日期对话框的应用
  9. 【高通SDM660平台 Android(安卓)10.0】(1
  10. android如何让webview里的资源访问本地缓