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:1六、16:9多個比例錄製

變焦、對焦 經過相應手勢能夠縮放攝像頭採集畫面及清晰度(依賴硬件支持)

· 濾鏡 在拍攝過程當中,除了實時美顏,同時還能夠實時添加濾鏡效果,RDVEUISdk自己提供豐富的濾鏡效果讓開發者進行選擇,同時用戶還能夠根據本身的需求進行濾鏡擴展。

· 照片 當前攝像頭畫面保存到圖片


RDRDVECore架構圖:



RDVECore簡要流程圖:




2 集成步驟


2.1 運行環境

l Android 4.3(api 18)以上;

l 處理器:雙核 1GHz以上CPU(目前只支持ARM CPU, X8六、MIPS暫不支持);

推薦四核1.2GHz以上CPU

l 內存:1 GB以上;

2.2 註冊申請AppKey和APPSECRET

一、 登陸http://www.rdsdk.com 註冊用戶

二、 登陸註冊好的用戶

三、 進入視頻雲管理 點擊(新增)獲取應用的 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 混音播放器





(只支持播放本地音樂,支持的音頻格式mp三、mp二、 aac、 wma、 wmv、 ac三、 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{ * ;} 
相關文章
相關標籤/搜索