编程论坛

 找回密码
 立即注册
广告联系qq1031180668广告位
查看: 601|回复: 1

[安卓开发] Android视频编辑SDK-RDVECore来自锐动的无UI,高度抽象化API

[复制链接]
  • ta_mind
    郁闷
    2017-11-15 15:04
  • classn_01: 1 classn_02

    [LV.1]初来乍到

    5

    主题

    5

    帖子

    67

    积分

    注册会员

    Rank: 2

    积分
    67
    发表于 2017-11-15 16:59:15 | 显示全部楼层 |阅读模式
    本帖最后由 灰蒙蒙 于 2017-11-15 17:02 编辑

    1 RDVECore功能概述
    RDVECore是锐动推出的无UI,高度抽象化API的视频编辑SDK,支持以下功能:
    1.1 丰富的编辑功能
    RDVECore包含了丰富的基础功能,对于编辑中的视频、图片、音乐有各种
    处理方式,并且可以根据实际的业务需求,进行搭配组合,所有处理都可以精确
    到毫秒级,达到最专业的的要求,主要功能如下:
    · MVMV根据配置资源进行混合以及动画,增强短视频效果
    · 滤镜 RDVEUISdk本身提供丰富的滤镜效果让开发者进行选择,同时用户还可以根据自己的需求进行滤镜扩展。
    · 字幕特效 字幕特效支持在指定位置,指定时间段显示;实时预览效果
    · 配音、配乐 支持指定时间段添加配音; 支持配音、配乐与视频原音比例调节; 支持本地添加更多配乐
    · 截取、分割 支持毫秒级截取、分割视频; 支持快速预览截取、分割后视频
    · 调速 调整视频的播放速度,快放或者慢放
    · 转场 支持多种转场; 支持随机转场、指定转场时长等扩展设置
    · 其它编辑功能 支持多种比例裁剪; 支持90、180、270度旋转视频画面; 支持左右镜像、上下镜像; 支持输出比例调整;

    1.2 完善的视频拍摄功能
    · 实时美颜可以在拍摄过程中实时人脸美肤,提亮、美白等效果,达到人脸美化,同时支持美化程度的调节
    · 人脸贴纸/挂件
            支持人脸识别及贴纸/挂件显示
    · 拍摄自由定义
    · RDVECore在拍摄过程中,可以根据具体的录制需求,进行自由化的设定,拥有更佳优异的拍摄录制效果。
    多段拍摄 一个视频可以分多段次拍摄
    摄像头切换 前、后摄像头自由切换,中间无卡顿
    多比例支持 支持1:1 、9:16、16:9多个比例录制
    变焦、对焦 通过相应手势可以缩放摄像头采集画面及清晰度(依赖硬件支持)
    · 滤镜
    在拍摄过程中,除了实时美颜,同时还可以实时添加滤镜效果,RDVEUISdk本身提供丰富的滤镜效果让开发者进行选择,同时用户还可以根据自己的需求进行滤镜扩展。
    · 照片 当前摄像头画面保存到图片




    RDVECRDVECore架构图:
    图片1.png
    RDVECore简要流程图:
    图片2.png


    2 集成步骤2.1 运行环境
    l Android 4.3api 18)以上;
    l 处理器:双核 1GHz以上CPU(目前只支持ARM CPU, X86MIPS暂不支持)
    推荐四核1.2GHz以上CPU
    l 内存:1 GB以上;
    2.2 注册申请AppKeyAPPSECRET
    1、 登录http://www.rdsdk.com 注册用户
    2、 登录注册好的用户
    3、 进入视频云管理 点击(新增)获取应用的 appkey 、appsecret




    2.3 下载并导入SDK2.3.1 Android Studio 导入rdVECore模块
    点击File--->Import Module,选择路径,填写“Module name”,默认为rdVECore,点击finish
    图片3.png
    图片4.png

    之后点击File--->Project Structure,选择你自己工程的Module,在Flavors选项卡中设置Min Sdk Version 不低于18
    图片5.png

    然后切换到Dependencies选项卡并点击右侧“+”号在弹出的下拉菜单选择Module Dependency点击。
    图片6.png

    弹出的小窗口中选择SDK相关的Modules,OK
    图片7.png
    添加成功后点击Project Structure设置界面的“OK”完成导入工作。
    图片8.png



    关于集成NDK SO库引发冲突解决办法如下:
    步骤一:sdk library模块过滤
    图片9.png
    步骤二:application模块中过滤
    编辑SDK NDK包含以下架构的SO库:
    · armeabi-v7a
    建议在Module的build.gradle文件中使用NDK的“abiFilter”配置,设置支持的SO库架构。
    如果在添加“abiFilter”之后Android Studio出现以下提示:
    NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
    则在项目根目录的gradle.properties文件中添加:
    android.useDeprecatedNdk=true
    在集成NDK SO库时,请注意只保留支持的架构SO库参考截图配置
    图片10.png
    关于gradle插件
    gradle插件请使用版本2.3.x
    可参考demo中使用的版本

    图片11.png





    2.3.2 准备AndroidManifest.xml  (权限)
    添加权限:
    图片12.png


    2.3.3 调用初始化API
    RdVECore.initialize(context, rootPath, appKey, appSecret, debuggable);
    Parameters:
    context 应用上下文
    rootPath 自定义的工作目录
    appkey 在平台申请的Appkey
    appScrect 在平台申请的appScrect
    debuggable是否调试


    初始化成功后才能正常使用其他功能接口,还要注意系统权限的申请,否则SDK在系统api级别 >= 23android 6.0+)下不能正常使用 图片13.png

    2.4 录制视频
    2.4.1 录制初始化参数
    // 画面打开之前配置录制参数(可包含摄像头、输出尺寸、帧码率、是否美颜等)
    // 通过此方法设置摄像头方向、是否美颜只在onPrepare(RelativeLayout,listener)之前调用有效
    //初始化之后设置前后置方向使用
    RecorderCore.switchCamera()、RecorderCore.enableBeautify(bEnableBeautify)
    RecorderConfig config = new RecorderConfig()
    .setVideoSize(width, height) //设置录制视频输出宽高
    .setVideoFrameRate(frameRate) //设置录制视频帧率
    .setVideoBitrate(bitrate) //设置录制视频码率
    .setEnableFront(isFrontCamera) //设置录制视频码率
    .setEnableBeautify(canBeautiy) //设置是否启用美颜
    .setBeauitifyLevel(level) //设置美颜级别
    .setEnableFrontMirror(enableFrontMirror) //设置录制时是否镜像
    .setEnableAutoFocus(true) //设置是否自动对焦
    .setEnableAutoFocusRecording(false)//设置录制时是否自动对焦
    //设置音频编码参数{numChannels - 声音数sampleRate - 采样率bitRate - 码率(bps)}
    .setAudioEncodingParameters(numChannels, sampleRate, bitRate) ;
    RecorderCore.setEncoderConfig(config); //设置配置

    2.4.2 初始化录制界面
    /**
    * 准备录制
    *
    * @param parentLayout
    *            用于显示摄像头的父布局
    * @param listener
    *            录制回调消息Listener
    */
    RecorderCore.onPrepare(parentLayout, IRecorderCallBackShot listener);
    一般用在Activity.onStart()

    2.4.3 关于录制结束时的释放清理操作
    用于响应Activity.onDestroy()
      RecorderCore.onExit(this);

    2.4.4 录制
    //开始录制   
    RecorderCore.startRecord(localSaveMp4File);
    //结束录制
    RecorderCore.stopRecord();
    //是否正在录制...
    RecorderCore.isRecording();

    2.4.5 关于回调接口
    /*
    * 打开摄像头成功并且开始预览界面
    * @param result
    *            返回值 >={@link ResultConstants#SUCCESS} 代表成功,否则为失败
    * @param resultInfo
    *            具体返回消息
    */
    IRecorderCallBackShot.onPrepared(int result, String resultInfo);
    /*
    * 响应录制开始
    * @param result
    *            返回值 >={@link ResultConstants#SUCCESS} 代表成功,否则为失败
    * @param resultInfo
    *            具体返回消息
    */
    IRecorderCallBackShot.onRecordBegin(int result, String resultInfo);
    /*
    * 响应获取已录制信息
    * @param position 已录制时间 (ms)
    * @param recordFPS 录制帧率
    * @param delayed 延迟时间
    */
    IRecorderCallBackShot.onGetRecordStatus(int position, int recordFPS, int delayed);
    /**
    * 响应直播结束
    * @param result
    *            返回值 >={@link ResultConstants#SUCCESS} 代表成功,否则为失败
    * @param resultInfo
    */
    IRecorderCallBackShot.onRecordEnd(int result, String resultInfo);
    /**
    * 录制出现错误
    * @param result
    *            返回值
    * @param resultInfo
    *            具体返回消息
    */
    IRecorderCallBackShot.onRecordFailed(int result, String resultInfo);
            /**
             * 响应摄像头打开信息
             * @param nResult
             *            返回值 >={@link ResultConstants#SUCCESS} 代表成功,否则为失败
             * @param strResultInfo
             *            具体返回消息
             */
    IRecorderCallBackShot.onCamera(int result, String resultInfo);

    /**
    * 保存当前画面回调
    * @param nResult =ResultConstants.SUCCESS
    * @param picturePath图片本地路径
    */
    IRecorderCallBackShot.onScreenShot(int result,String picturePath);

    2.4.6 摄像头相关(必须在onprepare回调之后才有效)
    //聚焦
    RecorderCore.cameraAutoFocus();
    // 是否为前摄像像头
    RecorderCore.isFaceFront();
    // 切换摄像头
    RecorderCore.switchCamera();

    2.4.7 闪光灯(必须在onprepare回调之后才有效)
    //获取闪光灯状态
    RecorderCore.getFlashMode();
    //打开闪光灯
    RecorderCore.setFlashMode(boolean enable);



    2.4.8 美颜
    //是否支持美颜
    RecorderCore.isBeautifyEnabled();
    //打开或关闭美颜
    RecorderCore.enableBeautify(boolean enableBeautify);

    2.4.9 截图 (必须在listener.onPrepared回调之后才有效)
    /**
    * 当前画面截图
    * @param isFocus 是否聚焦
    * @param path截图文件路径
    * @param width截图宽度
    * @param height截图高度
    */
    RecorderCore.screenshot(isFocus,path, 360, 640, 50);
    /**
    * 响应保存截图
    * @param nResult
    *            返回值 =={@link ResultConstants#SUCCESS} 代表成功,否则为失败
    * @param msg
    *
    */
    IRecorderCallBackShot.onScreenShot(int nResult, String path);

    2.4.10 静音
    RecorderCore.setMute(isMute);

    2.4.11 滤镜
    //获取支持的滤镜 在listener.onprepared() 回调成功之后才能获取支持的滤镜
    effects = RecorderCore.getSupportedColorEffects();
    //设置滤镜
    RecorderCore.setColorEffect(color);


    2.4.12
    水印相关
    //判断水印是否注册
    RecorderCore.isOsded();
    //开启水印
    RecorderCore.registerOSD(osd);
    //关闭水印
    RecorderCore.registerOSD(null);

    public class CameraWatermarkBuilder extends VEOSDBuilder{
         //设置水印位置
         setOSDGravity(int nGravity);
         //刷新水印内容
         protected void onRefreshOSDView(View vOSD) {}
    }


    2.4.13
    水印相关横竖屏录制
    说明:输出视频的录制方向,内部通过获取屏幕方向得到
    //开始直播录制
    第一步:锁定屏幕当前的方向(固定输出方向)
    图片14.png
    第二步:录制前通过设置屏幕方向的旋转角度(获取当前屏幕的方向090180270 ) 辨别是否横屏录制。
    RecorderCore.setOrientation(nOrientation);



    2.4.14
    混音播放器
    图片15.png
    (只支持播放本地音乐,支持的音频格式mp3、mp2、 aac wma wmv ac3、 ogg)
    此播放器支持混音功能.场景:插上耳机,传输一路音频流到看直播端
    player.setOnPreparedListener(listener);
    player.setOnInfoListener(infolistener);
    player.setOnCompletionListener(completlistener);
    player.setOnErrorListener(onErrorListener);
    player.prepareAsync();



    2.4.15
    是否开启混音功能
    //设置是否开启混音
    RecorderCore.enableMixAudio(enable);
    //获取当前是否开启混音
    RecorderCore.isEnableMixAudio();


    2.4.16
    设置混音占比
    //设置混音占比0-100
    RecorderCore.setMixFactor(factor);
    //获取当前混音占比
    RecorderCore.getMixFactor();


    2.5
    编辑视频

    2.5.1 添加播放器
    布局里面添加播放器
    图片16.png
    代码里面用
    @BindView(R2.id.epv_player)
    VirtualVideoView mVideoPlayer;
    或者
    VirtualVideoView mVideoPlayer;
    mVideoPlayer = (VirtualVideoView) findViewById(R.id.epv_player);
    获取mVideoPlayer 播放器对象



    2.5.2
    构造虚拟视频并添加到播放器
    //构造虚拟视频
    VirtualVideo mVirtualVideo
    mVirtualVideo = new VirtualVideo();
    //构造一个场景
    Scene scene = VirtualVideo.createScene();
    //给场景添加媒体(传媒体路径)并返回媒体对象
    MediaObject mediaObject = scene.addMedia(mediaPath);
    //将场景添加到虚拟视频
    mVirtualVideo.addScene(scene);

    //将虚拟视频添加到播放器
    try {
        mVirtualVideo.build(mVideoPlayer);
    } catch (InvalidStateException e) {
    }



    2.5.3
    获取视频缩略图
    方式1:虚拟视频对象获取缩略图
    虚拟视频添加场景后调用build(Context context)函数加载所有媒体,
    如:
    try {
        mVirtualVideo.build(mContext);
    } catch (InvalidStateException e) {
        e.printStackTrace();
    }
    再调用boolean getSnapShot(float timeSecond,Bitmap snapshot)即可获取对应时间点的缩略图
    其中参数timeSecond为缩略图时间点(单位秒),snapshot为获取缩略图的Bitmap对象
    返回值为true表示获取成功,false为失败
    如:
    mVirtualVideo.getSnapshot(1, bitmap);
    获取1秒位置的缩略图,并把图片绘入bitmap

    方式2:通过文件获取缩略图
    VirtualVideo.getSnapShot(
    String mediaPath,   // 媒体地址
    float timeSecond,   // 缩略图时间点(单位秒)
    Bitmap snapShot,   // 位图对象
    boolean isFastSeek) // 是否为快速定位


    2.5.4
    添加滤镜特效
    //在虚拟视频对象添加滤镜特效
    mVirtualVideo.addEffect(
    EffectType,  //特效类型
    startTime,   //开始位置(单位秒)
    endTime,    //结束位置(单位秒)
    arg);        //其他参数(例如倒序需要传一个倒序视频路径)
    //添加完成后更新特效
    mVirtualVideo.updateEffects(videoView);



    2.5.5
    添加音乐
    //在虚拟视频添加音乐
    方式一:
    /**
    * 添加音乐资源
    *
    * @param musicPath     音乐路径
    * @param trimStart     音乐截取开始位置(单位秒)
    * @param trimEnd       音乐截取结束位置(单位秒)
    * @param timelineStart 音乐在主时间线的开始位置(单位秒)
    * @param timelineEnd   音乐在主时间线的结束位置(单位秒)
    * @param mixFactor     音量占用比例(正常范围0-100,超过100代表音量增益,过大会破音,比如设置20代表原音量的20%500则为原音量增益5倍)
    * @param speed         音乐速度
    * @param original      是否为原音
    * @return
    * @throws InvalidArgumentException
    */
    public VirtualVideo addMusic(String musicPath, float trimStart, float trimEnd, float timelineStart, float timelineEnd, int mixFactor, float speed, boolean original) throws InvalidArgumentException

    //清除音乐
    mVirtualVideo.clearMusic();
    //造作完成后刷新音乐
    mVirtualVideo.updateMusic(videoView);
    //设置配乐音量占用比例(音量占用比例(正常范围0-100,超过100代表音量增益,过大会破音,比如设置20代表原音量的20%500则为原音量增益5倍,实时更改,不用调updateMusic
    mVirtualVideo.setMusicMixFactor(musicMixFactor);




    2.5.6
    添加水印
    /**
    * 添加水印
    *
    * @param watermark 水印对象
    */
    public VirtualVideo addWatermark(Watermark watermark)
    其中Watermark对象
    //创建一个水印对象
    Watermark watermark = new Watermark();
    //设置水平路径(图片路径)
    watermark.setPath(watermarkPath);
    //设置水印显示区域(RectF 其中上下左右用0-1
    watermark.setShowRect(watermarkShowRectF);
    //设置开始时间(单位秒)
    watermark.setStartTime(startTIme);
    //设置结束时间 (单位秒)
    watermark.setEndTime(endTime);



    2.5.7
    视频倒序
    /**
    * 视频倒序
    *
    * @param context          上下文
    * @param mediaObject      媒体对象
    * @param reverseVideoPath 倒序保存路径
    * @param vc               配置类
    * @param listener         倒序回调
    */
    public static void ExportUtils.reverseSave(Context context, MediaObject mediaObject, String
    reverseVideoPath, VideoConfig vc, final ExportListener listener)
    /**
    * 快速倒序(原视频必须每帧都为关键帧)
    *
    * @param context          上下文
    * @param mediaObject      媒体对象
    * @param reverseVideoPath 倒序保存路径
    * @param listener         倒序回调
    */
    public static void ExportUtils.fastReverseSave(Context context,MediaObject mediaObject, String
    reverseVideoPath, final ExportListener listener)


    2.5.8
    MV
    第一步:注册MV,得到MVId
    MVInfo temp = RdVECore.registerMV(localPath);
    第二步:设置MV
    if (null != mMVFragment) {
        mVirtualVideo.setMV(mMVFragment.getCurrentMVId());
    }
    //是否移除MV中的声音(切换配乐时可以移除声音,防止两种声音吵杂)
    mVirtualVideo.removeMVMusic(bRemoveMVMusic);


    2.5.9
    完成编辑导出视频
    /**
    * 导出视频
    * @param context     上下文
    * @param filePath    保存路径
    * @param videoConfig 导出配置
    * @param listener    导出回调
    */
    public VirtualVideo export(Context context, String filePath, VideoConfig videoConfig,
    ExportListener listener)
    其中 ExportListener 为导出Listener
    public interface ExportListener {
        /**
         * 导出开始回调
         */
        void onExportStart();
        /**
         * 导出进度回调
         *
         * @param progress 当前进度
         * @param max      最大进度
         * @return 返回是否继续执行,false为终止导出
         */
        boolean onExporting(int progress, int max);
        /**
         * 导出结束回调
         *
         * @param result 结束返回int
         */
        void onExportEnd(int result);
    }
    导出配置VideoConfig说明如下:
    /**
    * 设置视频分辨率
    * 如果设置此项,则宽高比将无效
    *
    * @param width  视频宽度
    * @param height 视频高度
    */
    public VideoConfig setVideoSize(int width, int height)
    /**
    * 设置视频帧率
    *
    * @param frameRate 帧率
    */
    public VideoConfig setVideoFrameRate(int frameRate)
    /**
    * 设置码率
    *
    * @param bitRate 码率(bps)
    */
    public VideoConfig setVideoEncodingBitRate(int bitRate)
    /**
    * 设置关键帧间隔
    *
    * @param interval 关键帧间隔(秒为单位)
    */
    public VideoConfig setKeyFrameTime(int interval)
    /**
    * 设置音频编码参数
    *
    * @param numChannels 声音数
    * @param sampleRate  采样率
    * @param bitRate     码率(bps)
    */
    public void setAudioEncodingParameters(int numChannels, int sampleRate, int bitRate)
    /**
    * 设置输出文件是否需要针对网络优化
    *
    * @param optimizeForNet 输出文件是否需要针对网络优化
    */
    public VideoConfig setOptimizeForNet(boolean optimizeForNet)
    /**
    * 设置是否使用硬件编码
    *
    * @param enable ture使用硬件编码
    */
    public VideoConfig enableHWEncoder(boolean enable)
    /**
    * 设置是否使用硬件解码
    *
    * @param enable ture使用硬件解码
    */
    public VideoConfig enableHWDecoder(boolean enable)

    /** * 设置音频编码参数 * * @param numChannels 声音数 * @param sampleRate  采样率 * @param bitRate     码率(bps) */public void setAudioEncodingParameters(int numChannels, int sampleRate, int bitRate)




    2.6
    打包混淆
    需要在proguard.cfg文件中添加如下配置项:
    -dontwarn  com.rd.**
    -keep class com.rd.** { *; }
    #水印
    -keepclassmembers class * extends com.rd.recorder.OSDBuilder{  * ;}



    评分

    参与人数 1编程币 +20 收起 理由
    夜的黑 + 20 赞一个!

    查看全部评分

  • ta_mind
    难过
    2018-5-16 22:51
  • classn_01: 52 classn_02

    [LV.5]常住居民I

    13

    主题

    123

    帖子

    225

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    225
    发表于 2018-1-5 13:46:21 | 显示全部楼层
    支持! 感谢分享
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|Archiver|小黑屋|sitemap|编程论坛 - 一个单纯的编程学习交流论坛 ( 豫ICP备15032706号 )

    GMT+8, 2018-12-19 16:09 , Processed in 1.167611 second(s), 30 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表