Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API相关的知识,希望能为你提供帮助。
RDVECore功能概述 RDVECore是锐动推出的无UI,高度抽象化API的视频编辑SDK,支持以下功能:
1.1  丰富的编辑功能 RDVECore包含了丰富的基础功能,对于编辑中的视频、图片、音乐有各种
处理方式,并且可以根据实际的业务需求,进行搭配组合,所有处理都可以精确
到毫秒级,达到最专业的的要求,主要功能如下:
·  MV  MV根据配置资源进行混合以及动画,增强短视频效果
·  滤镜  RDVEUISdk本身提供丰富的滤镜效果让开发者进行选择,同时用户还可以根据自己的需求进行滤镜扩展。
·  字幕特效  字幕特效支持在指定位置,指定时间段显示;实时预览效果
·  配音、配乐  支持指定时间段添加配音; 支持配音、配乐与视频原音比例调节; 支持本地添加更多配乐
·  截取、分割  支持毫秒级截取、分割视频; 支持快速预览截取、分割后视频
·  调速  调整视频的播放速度,快放或者慢放
·  转场  支持多种转场; 支持随机转场、指定转场时长等扩展设置
·  其它编辑功能  支持多种比例裁剪; 支持90、180、270度旋转视频画面; 支持左右镜像、上下镜像; 支持输出比例调整;
 
1.2  完善的视频拍摄功能 ·  实时美颜  可以在拍摄过程中实时人脸美肤,提亮、美白等效果,达到人脸美化,同时支持美化程度的调节
·  人脸贴纸/挂件 
支持人脸识别及贴纸/挂件显示
·  拍摄自由定义
  RDVECore在拍摄过程中,可以根据具体的录制需求,进行自由化的设定,拥有更佳优异的拍摄录制效果。
多段拍摄  一个视频可以分多段次拍摄
摄像头切换  前、后摄像头自由切换,中间无卡顿
多比例支持  支持1:1 、9:16、16:9多个比例录制
变焦、对焦  通过相应手势可以缩放摄像头采集画面及清晰度(依赖硬件支持)
·  滤镜 
在拍摄过程中,除了实时美颜,同时还可以实时添加滤镜效果,RDVEUISdk本身提供丰富的滤镜效果让开发者进行选择,同时用户还可以根据自己的需求进行滤镜扩展。
·  照片  当前摄像头画面保存到图片
 


RDVECore架构图:

Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

 
 
RDVECore简要流程图: 
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

 
 
集成步骤 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  、appsecret
 
2.3  下载并导入SDK 2.3.1  Android Studio 导入rdVECore模块
点击File---> Import Module,选择路径,填写“Module name”,默认为rdVECore,点击“finish”
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

 
之后点击File---> Project Structure,选择你自己工程的Module,在Flavors选项卡中设置Min Sdk Version 不低于18
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

       
然后切换到Dependencies选项卡并点击右侧“+”号在弹出的下拉菜单选择Module Dependency点击。
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

 
弹出的小窗口中选择SDK相关的Modules,“OK”
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片


添加成功后点击Project Structure设置界面的“OK”完成导入工作。
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

 
 
 
关于集成NDK SO库引发冲突解决办法如下: 步骤一:sdk library模块过滤
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

步骤二: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库,参考截图配置
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

    关于gradle插件 gradle插件请使用版本2.3.x
可参考demo中使用的版本


Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

 
 
 
 
 
 
 
2.3.2  准备AndroidManifest.xml   (权限)
添加权限:
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

 
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+)下不能正常使用
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

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  水印相关横竖屏录制
说明:输出视频的录制方向,内部通过获取屏幕方向得到
  //开始直播录制
第一步:锁定屏幕当前的方向(固定输出方向)
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

第二步:录制前通过设置屏幕方向的旋转角度(获取当前屏幕的方向0、90、180、270 ) 辨别是否横屏录制。
RecorderCore.setOrientation(nOrientation);
 
2.4.14  混音播放器
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

(只支持播放本地音乐,支持的音频格式mp3、mp2、 aacwmawmv、 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  添加播放器
布局里面添加播放器
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API

文章图片

代码里面用
@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.** { *; }
#水印
【Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API】 -keepclassmembers class * extends com.rd.recorder.OSDBuilder{   * ; }

    推荐阅读