基于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-19 11:22:49

    window安装ffmpeg-concat出现的坑和解决办法

    最后还是选择了fluent-ffmpeg,没特效就没特效吧。最起码有声音吗。 ffmpeg-contact也可以有声音,但是需要先提取出来再合并进去,不知道能不能有效同步,果断放弃。

  • 2019-10-19 13:37:44

    v-model里使用过滤器

    档所述过滤器只能用在v-bind指令和{{}}表达式中,v-model中使用过滤器是一种思维误区。 因为v-model里实现数据显示和存储格式的转换应该是双向的。如下例:

  • 2019-10-19 16:35:45

    Vue.directive使用注意

    首先,Vue.directive要在实例初始化之前,不然会报错,还有,定义的指令不支持驼峰式写法,也会报下面同样的错,虽然在源码中没有找到在哪里统一处理大小写,但是在有关directive的方法中捕捉到的指令命名统一变为小写,所以,还是用'-'或者'_'分割吧。