基于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


  • 2018-03-04 10:15:33

    HTTP代理协议 HTTP/1.1的CONNECT方法

    我们平时使用HTTP协议无非就是GET、POST这些方法,但是HTTP的内容远不止那些。今天就来说说HTTP代理使用的CONNECT。这个不是在网页开发上用的,如果没兴趣就跳过吧。

  • 2018-03-05 11:30:04

    iOS wkwebkit 播放HTML5 视频 全屏问题解决

    使用html5 的video标签播放视频的时候,限制视频的尺寸,在android上是没有问题的,但是在ios上发现,视频没有开始播放的时候还是好的,但是一旦播放开是,就会全屏,非常奇怪。

  • 2018-03-07 14:35:32

    centos7下yum安装ffmpeg

    安装EPEL Release,因为安装需要使用其他的repo源,所以需要EPEL支持 yum install -y epel-release

  • 2018-03-08 09:44:12

    前端性能监控:window.performance

    Web Performance API允许网页访问某些函数来测量网页和Web应用程序的性能,包括 Navigation Timing API和高分辨率时间数据。

  • 2018-03-08 09:44:15

    前端性能监控:window.performance

    Web Performance API允许网页访问某些函数来测量网页和Web应用程序的性能,包括 Navigation Timing API和高分辨率时间数据。

  • 2018-03-08 09:47:14

    ES6,Array.fill()函数的用法

    ES6为Array增加了fill()函数,使用制定的元素填充数组,其实就是用默认内容初始化数组。

  • 2018-03-08 09:53:39

    document.readyState

    一个document 的 Document.readyState 属性描述了文档的加载状态。

  • 2018-03-09 02:09:23

    ArrayBuffer:类型化数组

    ArrayBuffer对象、TypedArray对象、DataView对象是JavaScript操作二进制数据的一个接口。这些对象早就存在,属于独立的规格,ES6将它们纳入了ECMAScript规格,并且增加了新的方法。

  • 2018-03-09 11:45:11

    SQL SELECT DISTINCT 语句

    如需从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句: