Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API
1 RDVECore功能概述
1.1 丰富的编辑功能
1.2 完善的视频拍摄功能
RDVECore简要流程图:
2 集成步骤2.1 运行环境
2.3 下载并导入SDK
2.3.1 Android Studio 导入rdVECore模块
之后点击File--->Project Structure,选择你自己工程的Module,在Flavors选项卡中设置Min Sdk Version 不低于18
然后切换到Dependencies选项卡并点击右侧“+”号在弹出的下拉菜单选择Module Dependency点击。
弹出的小窗口中选择SDK相关的Modules,“OK”
添加成功后点击Project Structure设置界面的“OK”完成导入工作。
关于集成NDK SO库引发冲突解决办法如下:
关于gradle插件
2.3.3 调用初始化API
2.4 录制视频
2.4.1 录制初始化参数
2.4.2 初始化录制界面
2.4.3 关于录制结束时的释放清理操作
2.4.4 录制
2.4.5 关于回调接口
2.4.6 摄像头相关(必须在onprepare回调之后才有效)
2.4.7 闪光灯(必须在onprepare回调之后才有效)
2.4.8 美颜
2.4.9 截图 (必须在listener.onPrepared回调之后才有效)
2.4.10 静音
2.4.11 滤镜
2.4.12 水印相关
2.4.13 水印相关横竖屏录制
2.4.16 设置混音占比
2.5 编辑视频2.5.1 添加播放器
2.5.4 添加滤镜特效
2.5.5 添加音乐
//清除音乐
2.5.6 添加水印
2.5.7 视频倒序
2.5.8 MV
2.5.9 完成编辑导出视频
RDVECore是锐动推出的无UI,高度抽象化API的视频编辑SDK,支持以下功能:
1.1 丰富的编辑功能
RDVECore包含了丰富的基础功能,对于编辑中的视频、图片、音乐有各种
处理方式,并且可以根据实际的业务需求,进行搭配组合,所有处理都可以精确
到毫秒级,达到最专业的的要求,主要功能如下:
处理方式,并且可以根据实际的业务需求,进行搭配组合,所有处理都可以精确
到毫秒级,达到最专业的的要求,主要功能如下:
· MV MV根据配置资源进行混合以及动画,增强短视频效果
· 滤镜 RDVEUISdk本身提供丰富的滤镜效果让开发者进行选择,同时用户还可以根据自己的需求进行滤镜扩展。
· 字幕特效 字幕特效支持在指定位置,指定时间段显示;实时预览效果
· 配音、配乐 支持指定时间段添加配音; 支持配音、配乐与视频原音比例调节; 支持本地添加更多配乐
· 截取、分割 支持毫秒级截取、分割视频; 支持快速预览截取、分割后视频
· 调速 调整视频的播放速度,快放或者慢放
· 转场 支持多种转场; 支持随机转场、指定转场时长等扩展设置
· 其它编辑功能 支持多种比例裁剪; 支持90、180、270度旋转视频画面; 支持左右镜像、上下镜像; 支持输出比例调整;
1.2 完善的视频拍摄功能
· 实时美颜 可以在拍摄过程中实时人脸美肤,提亮、美白等效果,达到人脸美化,同时支持美化程度的调节
· 人脸贴纸/挂件
支持人脸识别及贴纸/挂件显示
· 拍摄自由定义 RDVECore在拍摄过程中,可以根据具体的录制需求,进行自由化的设定,拥有更佳优异的拍摄录制效果。
多段拍摄 一个视频可以分多段次拍摄
摄像头切换 前、后摄像头自由切换,中间无卡顿
多比例支持 支持1:1 、9:16、16:9多个比例录制
变焦、对焦 通过相应手势可以缩放摄像头采集画面及清晰度(依赖硬件支持)
· 滤镜
在拍摄过程中,除了实时美颜,同时还可以实时添加滤镜效果,RDVEUISdk本身提供丰富的滤镜效果让开发者进行选择,同时用户还可以根据自己的需求进行滤镜扩展。
· 照片 当前摄像头画面保存到图片
RDVERDVECore架构图:
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 、appsecret
3、 进入视频云管理 点击(新增)获取应用的 appkey 、appsecret
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.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) //设置录制视频帧率
.setVideoFrameRate(frameRate) //设置录制视频帧率
.setVideoBitrate(bitrate) //设置录制视频码率
.setEnableFront(isFrontCamera) //设置录制视频码率
.setEnableBeautify(canBeautiy) //设置是否启用美颜
.setEnableBeautify(canBeautiy) //设置是否启用美颜
.setBeauitifyLevel(level) //设置美颜级别
.setEnableFrontMirror(enableFrontMirror) //设置录制时是否镜像
.setEnableAutoFocus(true) //设置是否自动对焦
.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图片本地路径
*/
* 保存当前画面回调
* @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);
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;
或者
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 获取视频缩略图
mVirtualVideo.build(mVideoPlayer);
} catch (InvalidStateException e) {
}
方式1:虚拟视频对象获取缩略图
虚拟视频添加场景后调用build(Context context)函数加载所有媒体,
如:
try {
mVirtualVideo.build(mContext);
} catch (InvalidStateException e) {
e.printStackTrace();
}
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
* 添加音乐资源
*
* @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)
* 添加水印
*
* @param watermark 水印对象
*/
public VirtualVideo addWatermark(Watermark watermark)
其中Watermark对象
//创建一个水印对象
Watermark watermark = new Watermark();
//设置水平路径(图片路径)
watermark.setPath(watermarkPath);
watermark.setPath(watermarkPath);
//设置水印显示区域(RectF 其中上下左右用0-1)
watermark.setShowRect(watermarkShowRectF);
watermark.setShowRect(watermarkShowRectF);
//设置开始时间(单位秒)
watermark.setStartTime(startTIme);
watermark.setStartTime(startTIme);
//设置结束时间 (单位秒)
watermark.setEndTime(endTime);
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
* 视频倒序
*
* @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
* 快速倒序(原视频必须每帧都为关键帧)
*
* @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());
}
mVirtualVideo.setMV(mMVFragment.getCurrentMVId());
}
//是否移除MV中的声音(切换配乐时可以移除声音,防止两种声音吵杂)
mVirtualVideo.removeMVMusic(bRemoveMVMusic);
mVirtualVideo.removeMVMusic(bRemoveMVMusic);
2.5.9 完成编辑导出视频
/**
* 导出视频
* @param context 上下文
* @param filePath 保存路径
* @param videoConfig 导出配置
* @param listener 导出回调
*/
public VirtualVideo export(Context context, String filePath, VideoConfig videoConfig,
* 导出视频
* @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);
}
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使用硬件编码
当前名称:Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API
转载源于:http://scgulin.cn/article/jopeid.html
转载源于:http://scgulin.cn/article/jopeid.html