基于VCamera,仿微信录制短视频

2020-02-11 17:43:35

vcamera.so这个确实挺好用,可定制性也挺高,但是确定也不小,需要引入的这个so包,10M啊。对于安装包苛刻的用户,这是致命啊。

我现在是抛弃他了。但是在这里还是记录一下用法吧。防止以后再用他。

参考地址 基于VCamera,仿微信录制短视频


最近在学习FFmpeg,撸了一个短视频编辑器Cut,有兴趣可以看看

录制出来的视频的大小还是比较大,但可以通过ffmpeg 来对视频压缩,

怎么压缩?

在合成ts后对视频进行了压缩,10s压缩后大概在2M内。压缩代码如下:

 protected Boolean compress(boolean mergeFlag) { if (!mergeFlag) { return mergeFlag; } String cmd = "ffmpeg -y -i " + mMediaObject.getOutputTempVideoPath() + " -strict -2 -vcodec libx264 -preset ultrafast " + "-crf 25 -acodec aac -ar 44100 -ac 2 -b:a 96k -s 360x640 -aspect 9:16 " + mMediaObject.getOutputVideoPath(); boolean compressFlag = UtilityAdapter.FFmpegRun("", cmd) == 0; File file = new File(mMediaObject.getOutputTempVideoPath()); if(compressFlag){ //压缩成功删除临时文件 if (file.exists()) { file.delete(); } file = new File(mMediaObject.getTsPath()); if (file.exists()) { file.delete(); } } return compressFlag; }

-crf:这是最重要的一个选项,用于指定输出视频的质量,取值范围是0-51,默认值为23, 数字越小输出视频的质量越高。这个选项会直接影响到输出视频的码率。一般来说, 压制480p我会用20左右,压制720p我会用16-18,1080p我没尝试过。个人觉得, 一般情况下没有必要低于16。最好的办法是大家可以多尝试几个值,每个都压几分钟,看 看最后的输出质量和文件大小,自己再按需选择。

简介

基于VCamera,仿微信录制短视频

这里写图片描述

使用

  1. 在build.gradle,添加wechatRecoderVideoLibrary module 。

配置manifest

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />     <uses-permission android:name="android.permission.INTERNET" />     <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" />     <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="android.permission.CAMERA" />     <uses-permission android:name="android.permission.RECORD_AUDIO" />     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />     <uses-permission android:name="android.permission.READ_PHONE_STATE" />     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  • 配置拍摄视频缓存路径

       // 设置拍摄视频缓存路径         File dcim = Environment                 .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);         if (DeviceUtils.isZte()) {             if (dcim.exists()) {                 VCamera.setVideoCachePath(dcim + "/recoder/");             } else {                 VCamera.setVideoCachePath(dcim.getPath().replace("/sdcard/",                         "/sdcard-ext/")                         + "/recoder/");             }         } else {             VCamera.setVideoCachePath(dcim + "/WeChatJuns/");         } // VCamera.setVideoCachePath(FileUtils.getRecorderPath());         // 开启log输出,ffmpeg输出到logcat         VCamera.setDebugMode(true);         // 初始化拍摄SDK,必须         VCamera.initialize(this);
  • 注册activity

<application     ...    <activity android:name="com.maiml.wechatrecodervideolibrary.recoder.WechatRecoderActivity"             android:configChanges="orientation|keyboardHidden|screenSize"             android:hardwareAccelerated="true"             android:launchMode="singleTop"             android:screenOrientation="portrait"             android:theme="@style/CameraTheme"             /> </application
  • 调用 WechatRecoderActivity

   WechatRecoderActivity.launchActivity(MainActivity.this,REQ_CODE);

*在 onActivityResult Method 接收结果

    @Override     protected void onActivityResult(int requestCode, int resultCode, Intent data) {         super.onActivityResult(requestCode, resultCode, data);         if(RESULT_OK == resultCode){             if(requestCode == REQ_CODE){                 String videoPath = data.getStringExtra(WechatRecoderActivity.VIDEO_PATH);                 play(videoPath);             }         }     }

##参数配置

###自定义dialog

拍摄完成需要对视频进行转码,转码过程中弹出的dialog。

让你的Activity implements OnDialogListener 例如:

  public class MainActivity extends AppCompatActivity implements OnDialogListener{     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main); WechatRecoderActivity.launchActivity(MainActivity.this,REQ_CODE);      }     /**      * 处理自定义Dialog 的显示      * @param context 自定义dialog 依赖的Context,注意:自定义dialog的Context 需要使用这个      *      */     @Override     public void onShowDialog(Context context) {     }     /**      * 处理自定义Dialog 的隐藏      * @param context 自定义dialog 依赖的Context,注意:自定义dialog的Context 需要使用这个      *      */     @Override     public void onHideDialog(Context context) {     } }

###配置参数

nameformatdescription
recoderTimeMaxinteger录制的最长时间
recoderTimeMininteger录制的最短时间
titleBarCancelTextColorintegertitleBar取消字体的颜色
pressBtnColorinteger按住拍字体的颜色
pressBtnBginteger圆环的颜色
lowMinTimeProgressColorintegerProgress小于录制最短时间的颜色
progressColorintegerProgress大于录制最短时间的颜色

注意:颜色值均为 十六进制值,例如:0xFFFC2828

这里写图片描述

这里写图片描述

##自定义参数

  RecoderAttrs attrs = new RecoderAttrs.Builder()                             .pressBtnColorBg(0xff00ff00)                             .titleBarCancelTextColor(0xff00ff00)                             .pressBtnTextColor(0xff00ff00)                             .build();         WechatRecoderActivity.launchActivity(MainActivity.this,attrs,REQ_CODE);

##Thanks

VCamera


  • 2019-10-08 13:14:44

    MySQL 批量修改表名

    功能:将数据库 booksystem 中的表名前缀是 sys_ 开头的表名替换 sys_ 为 qun_

  • 2019-10-08 13:26:19

    详解Linux服务器最大tcp连接数

    1全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的server ip。 2对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万 是没问题的,国外 Urban Airship 公司在产品环境中已做到 50 万并发 。

  • 2019-10-08 14:09:57

    git创建分支并提交到远程分支

    远程分支的创建,一般都是基于本地分支的。即将本地的某个分支提交到远程,作为远程分支。命令如下:

  • 2019-10-09 13:38:20

    NPM依赖包版本号~和^和*的区别

    ~ 会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0 ^ 会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0 * 这意味着安装最新版本的依赖包

  • 2019-10-09 14:39:40

    import双反斜杠\\的意思

    ​ \表示引用根目录下面的PHPEXcel;不用\的话是引用当前目录下面的 PHPExcel

  • 2019-10-09 15:33:31

    nuxt,nuxtjs简单介绍以及使用

    在集成的服务器端框架之间进行选择: 选择您喜欢的 UI 框架: 选择您喜欢的测试框架: 选择你想要的 Nuxt 模式 (Universal or SPA) 添加 axios module 以轻松地将 HTTP 请求发送到您的应用程序中。 添加 EsLint 以在保存时代码规范和错误检查您的代码。 添加 Prettier 以在保存时格式化/美化您的代码。

  • 2019-10-10 00:21:35

    laravel 5.6以上日志理解及日志格式定义

    Laravel/Lumen的日志默认是基于Monolog进行了一层封装,如果要求不高,用起来还是十分容易的,本文基于laravel5.6/Lumen5.6版本进行解说。5.6版对日志系统做了升级,将日志的配置单独放以了config/logging.php 配置文件中,所以现在实用多了。