1 RDVECore功能概述
RDVECore是锐动推出的无UI,高度抽象化API的视频编辑SDK,支持以下功能: 
1.1 丰富的编辑功能 
RDVECore包含了丰富的基础功能,对于编辑中的视频、图片、音乐有各种 
处理方式,并且可以根据实际的业务需求,进行搭配组合,所有处理都可以精确 
到毫秒级,达到最专业的的要求,主要功能如下: 
· MV MV根据配置资源进行混合以及动画,增强短视频效果 
· 滤镜 RDVEUISdk本身提供丰富的滤镜效果让开发者进行选择,同时用户还可以根据自己的需求进行滤镜扩展。 
· 字幕特效 字幕特效支持在指定位置,指定时间段显示;实时预览效果 
· 配音、配乐 支持指定时间段添加配音; 支持配音、配乐与视频原音比例调节; 支持本地添加更多配乐 
· 截取、分割 支持毫秒级截取、分割视频; 支持快速预览截取、分割后视频 
· 调速 调整视频的播放速度,快放或者慢放 
· 转场 支持多种转场; 支持随机转场、指定转场时长等扩展设置 
· 其它编辑功能 支持多种比例裁剪; 支持90、180、270度旋转视频画面; 支持左右镜像、上下镜像; 支持输出比例调整; 
1.2 完善的视频拍摄功能 
· 实时美颜 可以在拍摄过程中实时人脸美肤,提亮、美白等效果,达到人脸美化,同时支持美化程度的调节 
· 人脸贴纸/挂件 
支持人脸识别及贴纸/挂件显示 
· 拍摄自由定义 
RDVECore在拍摄过程中,可以根据具体的录制需求,进行自由化的设定,拥有更佳优异的拍摄录制效果。 
多段拍摄 一个视频可以分多段次拍摄 
摄像头切换 前、后摄像头自由切换,中间无卡顿 
多比例支持 支持1:1 、9:16、16:9多个比例录制 
变焦、对焦 通过相应手势可以缩放摄像头采集画面及清晰度(依赖硬件支持) 
· 滤镜 在拍摄过程中,除了实时美颜,同时还可以实时添加滤镜效果,RDVEUISdk本身提供丰富的滤镜效果让开发者进行选择,同时用户还可以根据自己的需求进行滤镜扩展。 
· 照片 当前摄像头画面保存到图片 
RDRDVECore架构图: 
RDVECore简要流程图: 
2 集成步骤
2.1 运行环境 
l Android 4.3(api 18)以上; 
l 处理器:双核 1GHz以上CPU(目前只支持ARM CPU, X86、MIPS暂不支持); 
推荐四核1.2GHz以上CPU 
l 内存:1 GB以上; 
2.2 注册申请AppKey和APPSECRET 
1、 登录http://www.rdsdk.com 注册用户 
2、 登录注册好的用户 
3、 进入视频云管理 点击(新增)获取应用的 appkey 、appsecre 
2.3 下载并导入SDK 
2.3.1 Android Studio 导入rdVECore模块 
点击File--->Import Module,选择路径,填写“Module name”,默认为rdVECore,点击“finish”。 
之后点击File--->Project Structure,选择你自己工程的Module,在Flavors选项卡中设置Min Sdk Version 不低于18 
然后切换到Dependencies选项卡并点击右侧“+”号在弹出的下拉菜单选择Module Dependency点击。 
弹出的小窗口中选择SDK相关的Modules,“OK” 
添加成功后点击Project Structure设置界面的“OK”完成导入工作。 
关于集成NDK SO库引发冲突解决办法如下: 
步骤一:sdk library模块过滤 
步骤二: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库,参考截图配置 
关于gradle插件 
gradle插件请使用版本2.3.x 
可参考demo中使用的版本 
2.3.2 准备AndroidManifest.xml (权限) 
添加权限:
2.3.3 调用初始化API 
RdVECore.initialize(context, rootPath, appKey, appSecret, debuggable); 
Parameters: 
context 应用上下文 
rootPath 自定义的工作目录 
appkey 在平台申请的Appkey 
appScrect 在平台申请的appScrect 
debuggable是否调试 
初始化成功后才能正常使用其他功能接口,还要注意系统权限的申请,否则SDK在系统api级别 >= 23(android 6.0+)下不能正常使用 
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 水印相关横竖屏录制 
说明:输出视频的录制方向,内部通过获取屏幕方向得到 
//开始直播录制 
第一步:锁定屏幕当前的方向(固定输出方向) 
第二步:录制前通过设置屏幕方向的旋转角度(获取当前屏幕的方向0、90、180、270 ) 辨别是否横屏录制。 
RecorderCore.setOrientation(nOrientation); 
2.4.14 混音播放器 
(只支持播放本地音乐,支持的音频格式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 添加播放器 
布局里面添加播放器 
代码里面用 
@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{ * ;}