基于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-12-12 14:19:32

    laravel自定义分页LengthAwarePaginator

    有时候我们使用larave提供的后台分页数据库查询,有时候限制太多,我们需要自己定制分页功能。 下面是我给大家一个例子,我们可以根据例子,制作自己的分页功能。

  • 2019-12-14 21:04:05

    聊聊keep-alive组件的使用及其实现原理

    keep-alive是Vue.js的一个内置组件。它能够不活动的组件实例保存在内存中,而不是直接将其销毁,它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中。 它提供了include与exclude两个属性,允许组件有条件地进行缓存。

  • 2019-12-14 21:06:58

    vue----keep-alive缓存,activated,deactivated两个生命周期函数,,meta实现缓存

    如果没有缓存,每点击一次导航,内容区就会创建一个组件,该组件会经历整个生命周期,每点击一次,就会创建一个组件,比较浪费性能, 这时,我们就要考虑到是否能将点击过的已创建的组件进行缓存,当再次点击已访问过的组件时,这时,就会从缓存中获取该组件,而不会重新创建,

  • 2019-12-17 11:56:05

    ffmpeg concat video and mix audio,ffmpeg简单快速的合并视频

    在ffmpeg中,官网给出两种连接媒体文件(音频、视频、etc..)的解决方案。 the concat "demuxer" the concat "protocol" 对比而言, demuxer更加灵活一些,需要媒体文件是属于相同的编解码器,但是可以属于不同的容器格式(mp3,wav, mp4, mov, etc..). 而protocol只适用于少数集中容器格式。

  • 2019-12-17 11:58:55

    FFmpeg文章目录

    seek ffmpeg # How to seek in mp4/mkv/ts/flv ffmpeg # flags &= ~AVSEEK_FLAG_BACKWARD ffmpeg # AVSEEK_FLAG concat ffmpeg # concat 连接两个视频 ffmpeg # -f concat -i mylist.txt ffmpeg # concat详解+音画同步策略 截图