MyException - 我的异常网
当前位置:我的异常网» Android » Android视频编者SDK-RDVECore来自锐动的无UI,高度抽

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

www.MyException.Cn  网友分享于:2013-12-24  浏览:0次
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API
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{  * ;}

文章评论

Java程序员必看电影
Java程序员必看电影
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
旅行,写作,编程
旅行,写作,编程
鲜为人知的编程真相
鲜为人知的编程真相
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
总结2014中国互联网十大段子
总结2014中国互联网十大段子
编程语言是女人
编程语言是女人
我的丈夫是个程序员
我的丈夫是个程序员
老程序员的下场
老程序员的下场
中美印日四国程序员比较
中美印日四国程序员比较
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员应该关注的一些事儿
程序员应该关注的一些事儿
 程序员的样子
程序员的样子
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
每天工作4小时的程序员
每天工作4小时的程序员
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员必看的十大电影
程序员必看的十大电影
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
那些争议最大的编程观点
那些争议最大的编程观点
代码女神横空出世
代码女神横空出世
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
我是如何打败拖延症的
我是如何打败拖延症的
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
如何成为一名黑客
如何成为一名黑客
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员和编码员之间的区别
程序员和编码员之间的区别
漫画:程序员的工作
漫画:程序员的工作
10个调试和排错的小建议
10个调试和排错的小建议
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员都该阅读的书
程序员都该阅读的书
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有