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

WxRecoderVideo

项目地址: maimingliang/WxRecoderVideo
简介:基于 VCamera,仿微信录制短视频
更多: 作者    提 Bug   
标签:

更新

最近在学习 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" />
  • 配置拍摄视频缓存路径 ```xml
   // 设置拍摄视频缓存路径
    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

```xml
<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

关于我

简书 maimingliang

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值