基于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-09-03 23:09:17

    Linux下静态库(.a)和动态库(.so) 的生成与使用以及区别

    静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

  • 2019-09-03 23:19:12

    ./configure 的配置和用法

    Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。

  • 2019-09-04 16:24:17

    Ubuntu apt-get更换为阿里源

    ​进入阿里巴巴开源镜像页面,找到ubuntu,点击后面的帮助,可以看到类似下面的介绍,加入就好。切记下面的第三步。

  • 2019-09-04 16:32:56

    Ubuntu tar 解压缩命令详解

    tar 解压缩命令详解,这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。