仿微信的录制小视频功能

这里主要重点介绍录制的过程和录制完播放的过程,其次会简单介绍一下录制按钮的实现。

总纲简介

首先我们录制视频需要知道用到几个类 SurfaceView Camera MediaRecorder,这几个类配合实现录制播放流程,下面是简述:

首先我们需要camera获取底层的视频流数据(YUV格式),然后把视频流输出和SurfaceView的句柄进行绑定,这样就可以显示出来预览了(这里要注意预览变形的问题,可以参考我的另一篇文章),然后是MediaRecorder接收预览的视频流数据,最后是吧录制好的数据通过SurfaceView 和MediaPlayer进行播放(此处的SurfaceView 和camera的为同一个,实现录制和播放的无缝的衔接效果)。


下面介绍详细步骤

  1. 第一步首先需要实现camera的预览,具体的不多说了,直接上代码了,在我的另外博客有详细介绍。

    
    //1.获取surfaceview的句柄,activity实现接受的回调方法mHolder = cameraPreview.getHolder();mHolder.setKeepScreenOn(true);mHolder.addCallback(this);
    //2.在surfaceCreated开启相机openCamera(mHolder);
    //3.在surfaceChanged中进行尺寸的选择mHolder = holder;//设置相机的一些尺寸screenWidth = FSScreen2.getScreenWidth();//包括虚拟按键的高度screenHeight = FSScreen2.getHasVirtualKey();Camera.Parameters parameters = mCamera.getParameters();//获取支持的预览尺寸List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();Camera.Size optimalPreviewSize = getOptimalPreviewSize(sizes, screenHeight, screenWidth);parameters.setPreviewSize(optimalPreviewSize.width, optimalPreviewSize.height);cameraPreview.setLayoutParams(new FrameLayout.LayoutParams(optimalPreviewSize.height, optimalPreviewSize.width));//获取video的尺寸List<Camera.Size> supportedVideoSizes1 = parameters.getSupportedVideoSizes();mSize = getOptimalPreviewSize(supportedVideoSizes1, screenHeight, screenWidth);//获取照片的尺寸sizes = parameters.getSupportedPictureSizes();//支持图片尺寸optimalPreviewSize = getOptimalPreviewSize(sizes, optimalPreviewSize.width, optimalPreviewSize.height);//比值1.77parameters.setPictureSize(optimalPreviewSize.width, optimalPreviewSize.height);Log.i(TAG, "surfaceChanged----视频尺寸");parameters.setRotation(0);mCamera.setParameters(parameters);和设置
    //4.在surfaceDestroyed中进行资源的释放工作releaseMediaRecorder();releaseCamera();
  2. 预览已经没有问题了,下面就是重要的一步,将预览数据和MediaRecorder关联起来,获取到录制的视频资料,这里有一个要注意的地方是,录制视频的大小,这里我们是可以自己调整分辨率,不过要想真正的更接近微信的话,还是要做视频的压缩操作(一般是需要的,后期我会把压缩视频的内容加上),下面上代码:

    /*** 开始录制,这段代码来自网络,由于刚开始不能使用,所以我是做了一下修改*/private void startRecord() {Log.i(TAG, "startRecord----开始录像了");if (mRecorder == null) {mRecorder = new MediaRecorder(); // 创建MediaRecorder}if (mCamera != null) {mCamera.unlock();mRecorder.setCamera(mCamera);}try {// 设置音频采集方式mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//设置视频的采集方式mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设置文件的输出格式mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webm//设置audio的编码格式mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置video的编码格式mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);//设置录制的视频编码比特率,下面我会贴出一些自己测试在不同分辨率和格式下产生的视频大小的数据mRecorder.setVideoEncodingBitRate(2 * 1024 * 1024);// 设置帧频率,然后就清晰了
    //            CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
    //            mRecorder.setProfile(cProfile);//设置录制的视频帧率,注意文档的说明:mRecorder.setVideoFrameRate(30);//设置要捕获的视频的宽度和高度,这里msize是在surfaceChanged中进行获取并比较取得合适的尺寸mHolder.setFixedSize(mSize.width, mSize.height);//最高只能设置640x480mRecorder.setVideoSize(mSize.width, mSize.height);//最高只能设置640x480//设置记录会话的最大持续时间(毫秒)mRecorder.setMaxDuration(60 * 1000);// 输出旋转90度,保持竖屏录制mRecorder.setOrientationHint(90);
    //注释掉并无影响,猜测是camera设置过显示就可以了
    //            mRecorder.setPreviewDisplay(mHolder.getSurface());videoPath = getSDPath();if (videoPath != null) {File dir = new File(videoPath + "/videos");if (!dir.exists()) {dir.mkdirs();}videoPath = dir + "/" + System.currentTimeMillis() + ".mp4";//设置输出文件的路径mRecorder.setOutputFile(videoPath);Log.i(TAG, "startRecord----path" + videoPath);//准备录制mRecorder.prepare();//开始录制mRecorder.start();isRecording = true;}} catch (Exception e) {e.printStackTrace();}}

    上面我们可以自己写分辨率

    mRecorder.setVideoEncodingBitRate(2 * 1024 * 1024);// 设置帧频率

    也可以用系统里面预制的

               CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);mRecorder.setProfile(cProfile);

    下面是一份我自己整理的一份资料:

    CamcorderProfile.QUALITY_QVGA //5秒  大小为448k  模糊
    CamcorderProfile.QUALITY_QCIF //5秒  大小为370k 模糊
    CamcorderProfile.QUALITY_480P//5秒 大小为1.81M  清晰
    CamcorderProfile.QUALITY_CIF //未知原因不能用,并且导致相机连接没有断开,相机无法打开
    CamcorderProfile.QUALITY_720P //5秒  大小为5.8M 很清晰
    CamcorderProfile.QUALITY_TIME_LAPSE_480P //无法使用,导致相机崩溃
    CamcorderProfile.QUALITY_HIGH //5秒  大小为8.47 非常清晰
  3. 这里可以完成了录制视频,我是仿微信的倒计时来做的录像,一会会简单介绍一下录制的倒计时操作,就是那个长按的按钮:

    //我这里是自定义的控件,里面两个回调长按和点击,原来用其他的人的,不过和微信的差的比较远,就自己写了一个。
    bnCapture.setOnProgressTouchListener(new LProgressBar.OnProgressTouchListener() {@Overridepublic void onClick(LProgressBar progressBar) {if (!_isCapturing) {return;}_isCapturing = false;focuseView.setVisibility(View.INVISIBLE);//这里我们获取jpeg的回调try {mCamera.takePicture(null, null, pictureCallback);} catch (RuntimeException e) {e.printStackTrace();_isCapturing = false;}}@Overridepublic void onLongClick(LProgressBar progressBar) {startRecord();}@Overridepublic void onLongClickUp(LProgressBar progressBar) {//抬起的话直接取消录制,并切删除录制的文件stopRecord();playVideo(mHolder);}});
  4. 这里介绍一下停止录制和播放的工作:

    private void stopRecord() {Log.i(TAG, "stopRecord----停止录像了");bnCapture.setVisibility(View.GONE);tv_confirm.setVisibility(View.VISIBLE);try {//停止录制mRecorder.stop();//重置mRecorder.reset();} catch (Exception e) {e.printStackTrace();}isRecording = false;}

    下面是播放视频的方法:

    //播放的代码操作,主要是释放一些资源,holder重新绑定
    private void playVideo(final SurfaceHolder mHolder) {releaseMediaRecorder();releaseCamera();mHolder.removeCallback(this);mMediaPlayer = new MediaPlayer();mMediaPlayer.setDisplay(mHolder);mMediaPlayer.getCurrentPosition();//设置显示视频显示在SurfaceView上
    //        String path = getSDPath() + "/videos/" + "1493888903914.mp4";Log.d(TAG, videoPath);try {mMediaPlayer.setDataSource(videoPath);mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mMediaPlayer.prepareAsync();mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();}});mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {bnCapture.setClickable(true);}});} catch (Exception e) {e.printStackTrace();}}

整体的拍摄和播放流程的总结,到这里基本上整个流程就走下来了,鉴于篇幅有点长了,按钮那个小控件我单独在写在下一篇吧。再次欢迎各位大神纠错,帮助小弟进步。

demo下载链接

仿微信的录制小视频功能相关推荐

  1. 仿 微信/QQ 实现小程序功能 -IOS

    仿 微信/QQ 实现小程序功能 -IOS 1. 需求 首先,来大致看一下 微信/QQ 小程序的功能. Android端: 点击图标进入小程序,会新开一个任务栈,每个小程序一个任务栈(有的机型所有小程序 ...

  2. android点击拍照长按录制小视频

    实现了点击拍照,长按录制小视频功能.录制时间以及进度环都可以自定义;功能直接看图 部分代码: 下载地址:下载完整demo请戳我

  3. 【高仿微信系列】03、微信录制小视频

    本文为个人原创,欢迎转载,但请务必在明显位置注明出处! GitHub地址:https://github.com/motianhuo/wechat 微信从6.0版本开始推出小视频功能,随着4G网络的出现 ...

  4. Android之---高仿微信录制小视频(拍摄和查看)

    高仿微信录制小视频(拍摄和查看) Android仿微信小视频录制功能 http://blog.csdn.net/u012227600/article/details/50835633 Android仿 ...

  5. android高仿微信小视频,Android仿微信录制小视频

    本文实例为大家分享了Android仿微信录制小视频的具体代码,供大家参考,具体内容如下 先上张图片看看效果 简单叙述下 首先通过Camera类调用系统相机 通过surfaceview绘制出来 通过Me ...

  6. Android录制小视频(仿微信小视频)

    Android录制小视频 一.概述 日常生活中,录制一些视频已经渐渐成为一种习惯,当然这对于我们技术来说并没有什么影响,因为无论大家用不用,你都需要开发,这只是需求制定者–PM应该关心的事情,我们需要 ...

  7. H5版仿制微信跳一跳小游戏,网页版仿微信跳一跳小游戏源码,实现了跳一跳的基本核心功能

    H5版仿制微信跳一跳小游戏,网页版仿微信跳一跳小游戏源码,实现了跳一跳的基本核心功能 完整代码下载地址:H5版仿制微信跳一跳小游戏,网页版仿微信跳一跳小游戏源码 运行截图 Project setup ...

  8. android 语音发送功能,Android仿微信、录制音频并发送功能

    MyRecorder(仿微信,录制音频并发送功能) ①布局实现(activity_main.xml)布局采用线性布局,上面使用的一个ListView,下面使用的是一个自定义的Button(会在下面进行 ...

  9. 谈谈微信首页下拉拍摄小视频功能

    时间回到2014年,此刻你就是一名光荣的微信产品经理,在此前一年Twitter旗下短视频分享应用Vine已经风靡了美国,而国内以美拍为代表的国内学徒也是搅得风声水起.此刻核心功能为移动即时通讯的微信, ...

最新文章

  1. Oracle 11g Win10卸载 ,亲测
  2. Anaconda:成功解决Anaconda下载时速度超慢(conda下载慢)的几种方法图文教程
  3. 动态规划—最长公共子串
  4. android 多语言不起作用,Android本地化语言环境不起作用,所有区域代码都存在问题...
  5. [bzoj1036]树的统计
  6. 微信小程序网络通信(一)
  7. python变量类型之间转换_【Python】Python 变量类型(变量赋值,数据类型,数据转换)...
  8. Windows域控设置 AD域策略屏蔽端口 禁用端口【全域策略生效】
  9. vux安装中遇到的坑(转)
  10. 2017.12.7 URAT 串口通信
  11. asp.net mvc 2.0 TryValidateModel(Object)方法
  12. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_03-freemarker测试环境搭建
  13. unity 实现PPT动画效果切换图片
  14. 如何提升邮箱邮件安全性,邮箱管理制度有哪些?
  15. C语言简单实现世界协调时UTC与北京时间BJT转换
  16. 喜欢的歌——隐形的翅膀(张韶涵)
  17. python浮点数加整数_Python中整数和浮点数运算
  18. [转]VC常用小知识
  19. 转载-酷狗音乐API
  20. python+selenium环境安装及配置以及示例

热门文章

  1. 面试-操作系统-进程管理-进程-进程调度-死锁
  2. 关于python中面向对象(一)
  3. HCNP——LSR报文、LSU报文及LSAck报文
  4. 炫出我的色彩 HUAWEI nova青春版流光水波纹闪亮来袭
  5. react基于WOW.js和Animate.css实现特定位置的动画执行
  6. OpenGL中显示背景贴图
  7. office 所有后缀对应的 content-type
  8. poky linux初探 -- 添加自己的内核食谱
  9. python opencv 读取png图像的alpha通道
  10. 弘辽科技:拼多多再出“新招”