Android視頻編輯SDK--RDVECore來自銳動的無UI,高度抽象化API

RDVECore功能概述

RDVECore是銳動推出的無UI,高度抽象化API的視頻編輯SDK,支持以下功能:

1.1 豐富的編輯功能

RDVECore包含了豐富的基礎功能,對于編輯中的視頻、圖片、音樂有各種處理方式,并且可以根據實際的業務需求,進行搭配組合,所有處理都可以精確到毫秒級,達到最專業的的要求,主要功能如下:

MV?MV根據配置資源進行混合以及動畫,增強短視頻效果

濾鏡?RDVEUISdk本身提供豐富的濾鏡效果讓開發者進行選擇,同時用戶還可以根據自己的需求進行濾鏡擴展。

字幕特效?字幕特效支持在指定位置,指定時間段顯示;實時預覽效果

配音、配樂?支持指定時間段添加配音; 支持配音、配樂與視頻原音比例調節; 支持本地添加更多配樂

截取、分割?支持毫秒級截取、分割視頻; 支持快速預覽截取、分割后視頻

調速?調整視頻的播放速度,快放或者慢放

轉場?支持多種轉場; 支持隨機轉場、指定轉場時長等擴展設置

其它編輯功能?支持多種比例裁剪; 支持90、180、270度旋轉視頻畫面;支持左右鏡像、上下鏡像;支持輸出比例調整;

完善的視頻拍攝功能

實時美顏?可以在拍攝過程中實時人臉美膚,提亮、美白等效果,達到人臉美化,同時支持美化程度的調節

人臉貼紙/掛件?支持人臉識別及貼紙/掛件顯示

拍攝自由定義?RDVECore在拍攝過程中,可以根據具體的錄制需求,進行自由化的設定,擁有更佳優異的拍攝錄制效果。

多段拍攝?一個視頻可以分多段次拍攝

攝像頭切換?前、后攝像頭自由切換,中間無卡頓

多比例支持?支持1:1 、9:16、16:9多個比例錄制

變焦、對焦?通過相應手勢可以縮放攝像頭采集畫面及清晰度(依賴硬件支持)

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

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

RDVECore架構圖:

RDVECore簡要流程圖:

2 集成步驟

2.1?運行環境

Android 4.3(api 18)以上;

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

推薦四核1.2GHz以上CPU

內存: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”


關于集成NDK SO庫引發沖突解決辦法如下:

步驟一:sdk library模塊過濾

步驟二:application模塊中過濾

編輯SDKNDK包含以下架構的SO庫:

[if !supportLists]·[endif]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

在集成NDKSO庫時,請注意只保留支持的架構SO庫,參考截圖配置

關于gradle插件

gradle插件請使用版本2.3.x

可參考demo中使用的版本

[if !supportLists]2.3.2[endif]準備AndroidManifest.xml ?(權限)

添加權限:

[if !supportLists]2.3.3[endif]調用初始化API

RdVECore.initialize(context, rootPath, appKey, appSecret, debuggable);

Parameters:

context應用上下文

rootPath自定義的工作目錄

appkey在平臺申請的Appkey

appScrect在平臺申請的appScrect

debuggable是否調試

[if !supportLists]2.4[endif]錄制視頻

[if !supportLists]2.4.1[endif]錄制初始化參數

//畫面打開之前配置錄制參數(可包含攝像頭、輸出尺寸、幀碼率、是否美顏等)

//通過此方法設置攝像頭方向、是否美顏只在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);//設置配置

[if !supportLists]2.4.2[endif]初始化錄制界面

/**

* 準備錄制

*

*@paramparentLayout

* ???????????用于顯示攝像頭的父布局

*@paramlistener

*錄制回調消息Listener

*/

RecorderCore.onPrepare(parentLayout,IRecorderCallBackShotlistener);

一般用在Activity.onStart()中

[if !supportLists]2.4.3[endif]關于錄制結束時的釋放清理操作

用于響應Activity.onDestroy()

RecorderCore.onExit(this);

[if !supportLists]2.4.4[endif]錄制

//開始錄制

RecorderCore.startRecord(localSaveMp4File);

//結束錄制

RecorderCore.stopRecord();

//是否正在錄制...

RecorderCore.isRecording();

[if !supportLists]2.4.5[endif]關于回調接口

/*

*打開攝像頭成功并且開始預覽界面

* @paramresult

*返回值>={@link ResultConstants#SUCCESS}代表成功,否則為失敗

* @paramresultInfo

*具體返回消息

*/

IRecorderCallBackShot.onPrepared(intresult, StringresultInfo);

/*

*響應錄制開始

* @paramresult

*返回值>={@link ResultConstants#SUCCESS}代表成功,否則為失敗

* @paramresultInfo

*具體返回消息

*/

IRecorderCallBackShot.onRecordBegin(intresult, StringresultInfo);

/*

* 響應獲取已錄制信息

*@paramposition 已錄制時間 (ms)

*@paramrecordFPS錄制幀率

*@paramdelayed延遲時間

*/

IRecorderCallBackShot.onGetRecordStatus(intposition, intrecordFPS, int delayed);

/**

* 響應直播結束

*@paramresult

* ???????????返回值 >={@link ResultConstants#SUCCESS}代表成功,否則為失敗

*@paramresultInfo

*/

IRecorderCallBackShot.onRecordEnd(intresult, StringresultInfo);

/**

* 錄制出現錯誤

*@paramresult

* ???????????返回值

*@paramresultInfo

* ???????????具體返回消息

*/

IRecorderCallBackShot.onRecordFailed(intresult, StringresultInfo);

/**

* 響應攝像頭打開信息

*@paramnResult

* ???????????返回值 >={@link ResultConstants#SUCCESS}代表成功,否則為失敗

*@paramstrResultInfo

* ???????????具體返回消息

*/

IRecorderCallBackShot.onCamera(intresult, StringresultInfo);

/***保存當前畫面回調* @param nResult =ResultConstants.SUCCESS* @parampicturePath圖片本地路徑*/

IRecorderCallBackShot.onScreenShot(int result,String picturePath);

[if !supportLists]2.4.6[endif]攝像頭相關(必須在onprepare回調之后才有效)

//聚焦

RecorderCore.cameraAutoFocus();

//是否為前攝像像頭

RecorderCore.isFaceFront();

//切換攝像頭

RecorderCore.switchCamera();

[if !supportLists]2.4.7[endif]閃光燈(必須在onprepare回調之后才有效)

//獲取閃光燈狀態

RecorderCore.getFlashMode();

//打開閃光燈

RecorderCore.setFlashMode(boolean enable);

[if !supportLists]2.4.8[endif]美顏

//是否支持美顏

RecorderCore.isBeautifyEnabled();

//打開或關閉美顏RecorderCore.enableBeautify(booleanenableBeautify);

[if !supportLists]2.4.9[endif]截圖(必須在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);

[if !supportLists]2.4.10[endif]靜音

RecorderCore.setMute(isMute);

[if !supportLists]2.4.11[endif]濾鏡

//獲取支持的濾鏡 在listener.onprepared()回調成功之后才能獲取支持的濾鏡

effects = RecorderCore.getSupportedColorEffects();

//設置濾鏡

RecorderCore.setColorEffect(color);

[if !supportLists]2.4.12[endif]水印相關

//判斷水印是否注冊

RecorderCore.isOsded();

//開啟水印

RecorderCore.registerOSD(osd);

//關閉水印

RecorderCore.registerOSD(null);

public class CameraWatermarkBuilder extends VEOSDBuilder{

//設置水印位置

setOSDGravity(int nGravity);

//刷新水印內容

protected void onRefreshOSDView(View vOSD) {}

}

[if !supportLists]2.4.13[endif]水印相關橫豎屏錄制

說明:輸出視頻的錄制方向,內部通過獲取屏幕方向得到

//開始直播錄制

第一步:鎖定屏幕當前的方向(固定輸出方向)

第二步:錄制前通過設置屏幕方向的旋轉角度(獲取當前屏幕的方向0、90、180、270 )辨別是否橫屏錄制。

RecorderCore.setOrientation(nOrientation);

[if !supportLists]2.4.14[endif]混音播放器

(只支持播放本地音樂,支持的音頻格式mp3、mp2、aac、wma、wmv、ac3、ogg)

此播放器支持混音功能.場景:插上耳機,傳輸一路音頻流到看直播端

player.setOnPreparedListener(listener);

player.setOnInfoListener(infolistener);

player.setOnCompletionListener(completlistener);

player.setOnErrorListener(onErrorListener);

player.prepareAsync();

[if !supportLists]2.4.15[endif]是否開啟混音功能

//設置是否開啟混音

RecorderCore.enableMixAudio(enable);

//獲取當前是否開啟混音

RecorderCore.isEnableMixAudio();

[if !supportLists]2.4.16[endif]設置混音占比

//設置混音占比0-100

RecorderCore.setMixFactor(factor);

//獲取當前混音占比

RecorderCore.getMixFactor();

[if !supportLists]2.5[endif]編輯視頻

[if !supportLists]2.5.1[endif]添加播放器

布局里面添加播放器

代碼里面用

@BindView(R2.id.epv_player)VirtualVideoView mVideoPlayer;

或者

VirtualVideoView mVideoPlayer;

mVideoPlayer = (VirtualVideoView) findViewById(R.id.epv_player);

獲取mVideoPlayer播放器對象

[if !supportLists]2.5.2[endif]構造虛擬視頻并添加到播放器

//構造虛擬視頻

VirtualVideo mVirtualVideo

mVirtualVideo = new VirtualVideo();

//構造一個場景

Scene scene = VirtualVideo.createScene();

//給場景添加媒體(傳媒體路徑)并返回媒體對象

MediaObject mediaObject = scene.addMedia(mediaPath);

//將場景添加到虛擬視頻

mVirtualVideo.addScene(scene);

//將虛擬視頻添加到播放器

try {mVirtualVideo.build(mVideoPlayer);} catch (InvalidStateException e) {}

[if !supportLists]2.5.3[endif]獲取視頻縮略圖

方式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)//是否為快速定位

[if !supportLists]2.5.4[endif]添加濾鏡特效

//在虛擬視頻對象添加濾鏡特效

mVirtualVideo.addEffect(

EffectType,//特效類型

startTime,//開始位置(單位秒)

endTime,//結束位置(單位秒)

arg);//其他參數(例如倒序需要傳一個倒序視頻路徑)

//添加完成后更新特效

mVirtualVideo.updateEffects(videoView);

[if !supportLists]2.5.5[endif]添加音樂

//在虛擬視頻添加音樂

方式一:

/***添加音樂資源** @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);

[if !supportLists]2.5.6[endif]添加水印

/***添加水印** @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);

[if !supportLists]2.5.7[endif]視頻倒序

/***視頻倒序** @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)

[if !supportLists]2.5.8[endif]MV

第一步:注冊MV,得到MVId

MVInfo temp = RdVECore.registerMV(localPath);

第二步:設置MV

if (null != mMVFragment) {mVirtualVideo.setMV(mMVFragment.getCurrentMVId());}

//是否移除MV中的聲音(切換配樂時可以移除聲音,防止兩種聲音吵雜)mVirtualVideo.removeMVMusic(bRemoveMVMusic);

[if !supportLists]2.5.9[endif]完成編輯導出視頻

/***導出視頻* @param context上下文* @param filePath保存路徑* @param videoConfig導出配置* @param listener導出回調*/public VirtualVideo export(Context context, String filePath, VideoConfig videoConfig,

ExportListener listener)

其中ExportListener為導出Listenerpublic 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)

/*** 設置音頻編碼參數**@paramnumChannels聲音數*@paramsampleRate采樣率*@parambitRate碼率(bps)*/public voidsetAudioEncodingParameters(intnumChannels,intsampleRate,intbitRate)

[if !supportLists]2.6[endif]打包混淆

需要在proguard.cfg文件中添加如下配置項:

-dontwarn ?com.rd.**

-keep class com.rd.** { *; }

#水印

-keepclassmembers class * extends com.rd.recorder.OSDBuilder{ ?* ;}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容