Android影片編輯SDK--RDVECore來自銳動的無UI,高度抽象化API
1 RDVECore功能概述
1.1 豐富的編輯功能
1.2 完善的影片拍攝功能
RDVECore簡要流程圖:
2 整合步驟2.1 執行環境
2.3 下載並匯入SDK
2.3.1 Android Studio 匯入rdVECore模組
之後點選File--->Project Structure,選擇你自己工程的Module,在Flavors選項卡中設定Min Sdk Version 不低於18
然後切換到Dependencies選項卡並點選右側“+”號在彈出的下拉選單選擇Module Dependency點選。
彈出的小視窗中選擇SDK相關的Modules,“OK”
新增成功後點選Project Structure設定介面的“OK”完成匯入工作。
關於整合NDK SO庫引發衝突解決辦法如下:
關於gradle外掛
2.3.3 呼叫初始化API
2.4 錄製影片
2.4.1 錄製初始化引數
2.4.2 初始化錄製介面
2.4.3 關於錄製結束時的釋放清理操作
2.4.4 錄製
2.4.5 關於回撥介面
2.4.6 攝像頭相關(必須在onprepare回撥之後才有效)
2.4.7 閃光燈(必須在onprepare回撥之後才有效)
2.4.8 美顏
2.4.9 截圖 (必須在listener.onPrepared回撥之後才有效)
2.4.10 靜音
2.4.11 濾鏡
2.4.12 水印相關
2.4.13 水印相關橫豎屏錄製
2.4.14 混音播放器
2.4.15 是否開啟混音功能
2.4.16 設定混音佔比
2.5 編輯影片2.5.1 新增播放器
2.5.2 構造虛擬影片並新增到播放器
2.5.3 獲取影片縮圖
2.5.4 新增濾鏡特效
2.5.5 新增音樂
//清除音樂
2.5.6 新增水印
2.5.7 影片倒序
2.5.8 MV
2.5.9 完成編輯匯出影片
2.6 打包混淆
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 整合步驟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、 登入 註冊使用者
2、 登入註冊好的使用者
3、 進入影片雲管理 點選(新增)獲取應用的 appkey 、appsecret
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.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) //設定錄製影片幀率
.setVideoFrameRate(frameRate) //設定錄製影片幀率
.setVideoBitrate(bitrate) //設定錄製影片位元速率
.setEnableFront(isFrontCamera) //設定錄製影片位元速率
.setEnableBeautify(canBeautiy) //設定是否啟用美顏
.setEnableBeautify(canBeautiy) //設定是否啟用美顏
.setBeauitifyLevel(level) //設定美顏級別
.setEnableFrontMirror(enableFrontMirror) //設定錄製時是否映象
.setEnableAutoFocus(true) //設定是否自動對焦
.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圖片本地路徑
*/
* 儲存當前畫面回撥
* @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);
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);
(只支援播放本地音樂,支援的音訊格式mp3、mp2、 aac、 wma、 wmv、 ac3、 ogg)
此播放器支援混音功能.場景:插上耳機,傳輸一路音訊流到看直播端
player.setOnPreparedListener(listener);
player.setOnInfoListener(infolistener);
player.setOnCompletionListener(completlistener);
player.setOnErrorListener(onErrorListener);
player.prepareAsync();
//設定是否開啟混音
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;
或者
VirtualVideoView mVideoPlayer;
mVideoPlayer = (VirtualVideoView) findViewById(R.id.epv_player);
獲取mVideoPlayer 播放器物件
//構造虛擬影片
VirtualVideo mVirtualVideo
mVirtualVideo = new VirtualVideo();
//構造一個場景
Scene scene = VirtualVideo.createScene();
//給場景新增媒體(傳媒體路徑)並返回媒體物件
MediaObject mediaObject = scene.addMedia(mediaPath);
//將場景新增到虛擬影片
mVirtualVideo.addScene(scene);
//將虛擬影片新增到播放器
try {
mVirtualVideo.build(mVideoPlayer);
} catch (InvalidStateException e) {
}
mVirtualVideo.build(mVideoPlayer);
} catch (InvalidStateException e) {
}
方式1:虛擬影片物件獲取縮圖
虛擬影片新增場景後呼叫build(Context context)函式載入所有媒體,
如:
try {
mVirtualVideo.build(mContext);
} catch (InvalidStateException e) {
e.printStackTrace();
}
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
* 新增音樂資源
*
* @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)
* 新增水印
*
* @param watermark 水印物件
*/
public VirtualVideo addWatermark(Watermark watermark)
其中Watermark物件
//建立一個水印物件
Watermark watermark = new Watermark();
//設定水平路徑(圖片路徑)
watermark.setPath(watermarkPath);
watermark.setPath(watermarkPath);
//設定水印顯示區域(RectF 其中上下左右用0-1)
watermark.setShowRect(watermarkShowRectF);
watermark.setShowRect(watermarkShowRectF);
//設定開始時間(單位秒)
watermark.setStartTime(startTIme);
watermark.setStartTime(startTIme);
//設定結束時間 (單位秒)
watermark.setEndTime(endTime);
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
* 影片倒序
*
* @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
* 快速倒序(原影片必須每幀都為關鍵幀)
*
* @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());
}
mVirtualVideo.setMV(mMVFragment.getCurrentMVId());
}
//是否移除MV中的聲音(切換配樂時可以移除聲音,防止兩種聲音吵雜)
mVirtualVideo.removeMVMusic(bRemoveMVMusic);
mVirtualVideo.removeMVMusic(bRemoveMVMusic);
2.5.9 完成編輯匯出影片
/**
* 匯出影片
* @param context 上下文
* @param filePath 儲存路徑
* @param videoConfig 匯出配置
* @param listener 匯出回撥
*/
public VirtualVideo export(Context context, String filePath, VideoConfig videoConfig,
* 匯出影片
* @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);
}
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)
* 設定音訊編碼引數
*
* @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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS/Android 影片編輯SDKiOSAndroid
- 來自銳動天地的直播ios SDKiOS
- Final Cut Pro:創意無限的影片編輯工具
- UITableViewCell 自動高度UIView
- Mac——免費的音樂編輯軟、影片編輯軟體。Mac
- 請問對於富文字編輯器如何進行 UI 自動化測試?UI
- Mitti for Mac(影片編輯工具)MITMac
- 移動端短影片SDK,企業級影片編輯解決方案
- 自動載入的iframe高度自適應
- 編輯cron實現自動執行
- Android手機QQ的UI自動化實踐AndroidUI
- iMovie 入門教程:影片編輯的利器
- 大一統影片編輯框架:浙大&微軟推出UniEdit,無須訓練、支援多種編輯場景框架微軟
- Linux中編輯影片字幕Linux
- 美攝影片剪輯SDK:企業級影片編輯解決方案
- iOS初級開發學習筆記:一個頁面中自動計算cell的高度來自適應tableView的高度iOS筆記View
- 超棒的 15 款 Bootstrap UI 編輯器bootUI
- 15 個很棒的 Bootstrap UI 介面編輯器bootUI
- Android API相容,其他API,UI適配(3)AndroidAPIUI
- Android API相容,其他API,UI適配(2)AndroidAPIUI
- android 5個自動化測試Ui框架AndroidUI框架
- element-ui table 行內編輯UI
- Write on Video for Mac影片編輯工具IDEMac
- Compressor for Mac(影片編輯軟體)Mac
- Python音影片編輯庫:moviepyPython
- SAP CRM WebClient UI Text 可編輯與否的控制邏輯WebclientUI
- 閒來無事,做了個簡單的線上編輯的mock服務Mock
- 華為影片編輯服務(Video Editor Kit),助力開發者高效構建應用影片編輯能力IDE
- 自媒體(6)-短影片剪輯
- 微影片剪輯編輯器是一款簡單實用的短影片剪輯製作工具
- Android API相容,其他API,UI適配(------ 分割線 -----)AndroidAPIUI
- UI Avatars 拿來即用的頭像生成ApiUIAPI
- Android使用Espresso進行UI自動化測試AndroidEspressoUI
- Android UI控制元件系列:AutoCompleteTextView(自動提示)AndroidUI控制元件TextView
- Android UI 自動化測試實現過程AndroidUI
- VideoPad for Mac(強大的影片編輯器)IDEMac
- ant指令碼實現的Android自動編譯指令碼Android編譯
- Mac影片編輯應用——Videoloupe for MacMacIDE