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

菱綠發表於2018-05-22
RDVECore功能概述
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.1 執行環境
l Android 4.3api 18)以上;
處理器:雙核 1GHz以上CPU(目前只支援ARM CPU, X86MIPS暫不支援)推薦四核1.2GHz以上CPU
記憶體:1 GB以上;

2.2 註冊申請AppKeyAPPSECRET

1、 登入 註冊使用者
2、 登入註冊好的使用者
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.3 呼叫初始化API
RdVECore.initialize(context, rootPath, appKey, appSecret, debuggable);
Parameters:
context 應用上下文
rootPath 自定義的工作目錄
appkey 在平臺申請的Appkey
appScrect 在平臺申請的appScrect
debuggable是否除錯
初始化成功後才能正常使用其他功能介面,還要注意系統許可權的申請,否則SDK在系統api級別 >= 23android 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 水印相關橫豎屏錄製
說明:輸出影片的錄製方向,內部透過獲取螢幕方向得到
//開始直播錄製
第一步:鎖定螢幕當前的方向(固定輸出方向)



第二步:錄製前透過設定螢幕方向的旋轉角度(獲取當前螢幕的方向090180270 ) 辨別是否橫屏錄製。
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{  * ;}



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31444340/viewspace-2154914/,如需轉載,請註明出處,否則將追究法律責任。

相關文章