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本身提供丰富的滤镜效果让开发者进行选择,同时用户还可以根据自己的需求进行滤镜扩展。

· 照片 当前摄像头画面保存到图片

RDVECore架构图:

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{ * ;}

---恢复内容结束---

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{ * ;}

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

  1. android视频编辑sdk官网,LanSoEditor_common ---android平台的视频编辑SDK

    android平台短视频技术之 视频编辑的经验分享. android平台短视频技术之 视频编辑的经验分享. 提示一: 各位看官,这里分享的是视频编辑,即剪切/拼接/分离/合并/涂鸦/标记/叠加/滤镜等 ...

  2. Android视频编辑SDK免费版,Android视频编辑SDK

    android视频编辑sdk是一款视频编辑软件,用户可以看到视频配音配乐.添加字幕.添加滤镜.视频转场等各种功能,并可以快速的植入到软件中进行编辑,编辑的过程中支持用户进行智能的硬件解码,选择视频时不 ...

  3. iOS/Android 视频编辑SDK

    锐动天地为开发者提供短视频编辑.视频直播.特效.录屏.编解码.视频转换,等多种解决方案,涵盖PC.iOS.Android多平台.以市场为导向,不断打磨并创新技术,在稳定性,兼容性,硬件设备效率优化上千 ...

  4. android视频编辑sdk!Android动态换肤实现原理解析,灵魂拷问

    " 对于程序员来说,如果哪一天开始他停止了学习,那么他的职业生涯便开始宣告消亡." 高薪的IT行业是众多年轻人的职业梦想,然而,一旦身入其中却发觉没有想像中那么美好.被称为IT蓝领 ...

  5. Android/iOS视频编辑SDK开发记

    开发移动端的视频编辑SDK已经三个月了,因为之前有过在PC上做实时视频合成的经验,所以乐观预期最短两个月就够了,因为主要的开发难点只在于Android和iOS移动平台相关的模块,以及视频合成的时间线控 ...

  6. android sdk build-tools_从零开始仿写一个抖音App——视频编辑SDK开发(一)

    本文首发于微信公众号--世界上有意思的事,搬运转载请注明出处,否则将追究版权责任.交流qq群:859640274. 大家好久不见,又有一个多月没有发文章了.不知道还有哪些读者记得我的 从零开始仿写抖音 ...

  7. android 直播sdk 抖音,从零开始仿写一个抖音App——跨平台视频编辑SDK项目搭建

    不知不觉已经到了2019年,本系列的文章也更新到了8篇.很庆幸笔者能坚持下来,从我司的代码中学习到了很多东西.当然更庆幸的是收获了众多读者的鼓励和支持.从本篇文章开始,我们将接触短视频 app 中比较 ...

  8. android 视频直播SDK

    通过android移动端实时采集视频,同时在拍摄过程中支持多种实时滤镜效果,只要调用视频直播接口,通过3G.4G.WIFI等网络,推流发送给云端流媒体直播系统处理,并通过CDN视频加速分发做现场直播播 ...

  9. 蓝松视频编辑SDK使用说明

    蓝松视频编辑SDK–新版本API使用说明 合成容器:ConcatComposition 字面意思是:拼接合成. 是以图片和视频的拼接的总时长作为最终导出视频的时长, 容器有3大层, 分别是:背景图层 ...

最新文章

  1. 使用Nautilus脚本增加新功能
  2. CocosEditor 1.0Final-IDEA13.0和1.5-IDEA13.1 发布–2014.03.25
  3. 枚举IHTMLDocument2中所有IFRAME的内容
  4. XSD(Schema)教程
  5. hyperv的安装与使用
  6. 【直播预告】创享未来 2016微软开发者峰会
  7. python Box-Cox数据变化与逆变化
  8. Hdmi 和vga 接口有什么区别?
  9. Android 免root 备份数据,教你安卓手机免Root恢复手机数据的三种方法
  10. 六月集训(第21天) —— 堆(优先队列)
  11. Cz工具集使用介绍 - 规范Git提交说明
  12. 领域分类的问题_别人的问题领域
  13. AI顶级期刊 IEEE T-PAMI 2020最新论文解读 | Deep Partial Multi-View Learning
  14. php【websocket】
  15. 控制系统设计专题(四)——控制分配矩阵的求解及相关问题
  16. 第四章 JavaWeb CSS入门 核心基础 基础形式 + 选择器
  17. JS中的深拷贝与浅拷贝
  18. SCC(四):Palette mode
  19. Unity Shader - 切线空间的法线贴图应用(T2W W2T)
  20. 不能更新,数据库或对象为只读

热门文章

  1. 水果千禧果/圣女果/小番茄发圈文案,配水果千禧果/圣女果/小番茄的朋友圈文案
  2. 如何用计算机看三维电影,用电脑看3D影片的步骤 电脑怎么设置看3D电影
  3. Maven多模块项目编译失败:程序包xxx不存在
  4. cisp-pte考试复盘及常考题型总结
  5. Latex学习笔记(七)参考文献模板
  6. 面经八之牛客网面经整理
  7. 【91数据恢复】服务器感染了.halo勒索病毒,如何确保数据100%恢复?
  8. Git 操作遇到 Found a swap file by the name “~/xxxx/.git/. COMMIT_EDI_TMSG. Swp“
  9. 如何远程访问共享盘?远程访问共享盘是否安全?
  10. 两台windows内网之间快速复制大量(上百万个)小文件(可用于两台服务器之间)...