藍松短視頻SDK開發手冊
-
- 一、藍松SDK組成
- 二、SDK集成和單位說明
- 三、視頻編輯SDK
- 四、AE模版SDK
- 五、人像分割SDK
- 六、Android端錯誤代碼
一、藍松SDK組成
- 藍松SDK包含了視頻編輯SDK和AE模版SDK
- 此文檔基于藍松SDK4.5.8版本編輯
- 文檔更新說明:
序號 | 文檔更新內容 | 時間 |
---|---|---|
1 | 更新Android、IOS的API說明 | 20210114 |
2 | 更新人像分割SDK庫說明 | 20210519 |
3 | 增加Android端錯誤代碼解釋 | 20210716 |
二、SDK集成和單位說明
2.1、Android端
- 我們的SDK以module的形式提供, 在你的項目中點擊File/import midule導入,并在您主module中的build.gradle中增加implementation project(':LanSongSDK')(如果是更新SDK, 則先刪除當前的module,,并屏蔽build.gradle中的字段, 然后在import導入,再打開屏蔽)
- LanSongSDK module下的assets下有LanSongIFxxx開頭濾鏡用到的各種圖片資源, 如您項目沒有用到LanSongIFxxx開頭的濾鏡,則可以刪除。
- 其他的代碼,各種資源,各種視頻素材等均為演示所用,不屬于sdk的一部分。
- 代碼使用
1. LanSoEditor.initSDK(getApplicationContext(), null);
// 初始化SDK.[必須] (null時,APP名字一定是我們demo名字)
2. LanSoEditor.setTempFileDir();
//設置SDK處理過程中的臨時文件緩存路徑,也是我們容器最終生成視頻的路徑, 您可以設置生成視頻名字的前后綴. 此代碼是公開的, 您點擊后會看到更多注釋 [可選]
3. LanSoEditor.setSDKLogOutListener
//設置日志輸出監聽 [可選].
2.2、IOS端
- 拖動LanSongEditorFramework.framework到你的項目中, 并在工程的Build Phases標簽頁的Link Binary With Libraries中把我們的framework放到最上面.
- 在Build Phases的<Link Binary With Libraries>中增加libz.tbd , libbz2.tbd, libc++.tbd, libiconv.tbd
- 在你代碼中包括頭文件: #import <LanSongEditorFramework/ LanSongEditor.h>
- LanSongEditorBundle.bundle 是我們sdk中 以LanSongIFxxx開頭用到的一些濾鏡圖片,如果沒用到LanSongIFxxx開頭的濾鏡,則不用增加此文件。如用到則把LanSongEditorBundle.bundle 拖動到你項目的 copy Bundle Resources中
- 其他的代碼,各種資源,各種視頻素材等均為演示所用,不屬于sdk的一部分。
- 代碼使用
初始化
1. 增加頭文件
#import <LanSongEditorFramework/LanSongEditor.h>
2. 在您程序剛開始的地方初始化我們的SDK:
[LanSongEditor initSDK:nil]
//初始化SDK [必須] (nil時,APP名字一定是我們demo名字)
2.3、時間單位
Android
- 用到兩種時間單位:float類型和long類型;
- float類型是秒,long類型是微秒,
- 1秒等于1000*1000微秒;所有時間參數是float類型,即為秒;所有時間參數是long類型,則是微秒;
- 我們的一個容器類在執行的時候,有進度回調OnLanSongSDKProgressListener 和OnLanSongSDKThreadProgressListener, 其中ThreaProgress是工作在內部線程中,直接調用監聽給你, 沒有經過handle+message機制, 監聽的兩個參數分別是(long currentPtsUs, int percnet); 其中 currentPtsUs:是當前即將處理的幀的時間戳, percent是當前處理的百分比;
IOS
- ios用到一種單位:CGFloat類型, 浮點類型,單位秒;
- 視頻在編碼中, 我們默認是一秒鐘一個IDR幀;
三、視頻編輯SDK
3.1、SDK中用到的名字解釋
1.composition: 合成, 是一個容器, 用來存放各種素材的容器, 縮寫是: compXXX, 比如compDurationUs, 則表示合成的時長,單位是微秒(Us)
2.original: 原始的, cut:時間裁剪; duration:時長;
3.2、合成容器:ConcatComposition
- 字面意思是:拼接合成.是以圖片和視頻的拼接的總時長作為最終導出視頻的時長, 容器有3大層, 分別是:背景圖層 , 拼接類圖層 , 疊加類圖層.
- 背景層: 給容器整體增加一個背景圖層, 支持:顏色背景, 圖片背景, 如果你要給不同的圖層設置不同的背景,則可以用圖層的畫布/背景功能來分別設置.
- 拼接層: 把用戶選中的圖片和視頻前后拼接在一起,是前后疊加. 可以在開始前增加, 也可以做預覽過程中插入, 可以指定時間點插入, 可復制, 可刪除, 可調節每個圖層的前后位置, 支持手勢調節, 支持圖層的各種方法.
- 疊加類圖層: 在拼接層上面,疊加多個其他圖層, 是上下疊加. 比如疊加水印, 疊加文字, 疊加動畫等等這些稱之為疊加類型的圖層, 圖層可調節上下位置, 可設置顯示開始時間點, 可設置顯示時長;可疊加, 可刪除, 支持手勢,旋轉移動縮放濾鏡馬賽克等等, 可執行父類圖層的所有方法.
- 這些API 的關鍵詞是: 在LSOConcatCompositionView中;, 拼接:(concat), 疊加:(overLay), 背景(backGround).
3.3、視頻和圖片的混合編輯
- 當前大部分視頻編輯是拼接編輯, 比如您選中了幾個視頻和幾個圖片, 則是視頻和圖片混合的前后拼接合成的編輯.
- 可以是單個視頻, 也可以是多個視頻, 也可以是一張圖片或多種圖片, 或者圖片和視頻混合編輯.
- 視頻增加后,當前默認是整個視頻時長增加進去, 增加后, 你可以設置視頻時長, 容器的總時長會改變, 得到圖層對象,可執行圖層的各種方法.
- 圖片增加后, 默認每張圖片顯示3秒, 可調節顯示時長, 可復制,刪除,插入圖片, 拼接圖片不可以循環, 得到圖層對象,可執行圖層的各種方法.
- 如果設置了轉場,則前一個層和后一層有部分畫面是重疊, 重疊時間可設置. 設置轉場后,
- 最終容器的總長度是各個圖片和視頻的長度之和 ,如果有轉場或視頻變速,則對應的時長會改變.
3.4、圖層之--時間調節
- 素材本身的的時長. 比如視頻時長,聲音時長, 圖片在放入后, 默認是顯示3秒; 圖片序列和gif等是其本身的時長; 這個時長是素材本身的, 我們稱之為AssetDuration 是資源時長, 只能讀取,不能修改, 但你可以修改素材在容器中的顯示時間和從什么時間點開始顯示;
- 可以修改的有: 素材在容器中的顯示時間點, 是否循環, 顯示時長, 如果循環,則會從顯示時間點開始, 一直循環到整個容器尾部, 時間可以實時設置, 實時調節, 實時獲取,當顯示時長改變后, 如果你要獲取對應的縮略圖,則縮略圖中圖片數組也會相應的改變;
- 如果是視頻素材, 則支持裁剪視頻長度, 兩個方法是: setCutStartTime和 setCutEndTime,從視頻的什么時間開始裁剪,和裁剪到什么地方; 視頻裁剪當前沒有約束, 但建議你最小裁剪值是1秒;
- 這些API的名字是:資源時長(assetDuration), 當前圖層的顯示時長( displayDuration), 從容器的什么時間點開始顯示:(startTimeOfComp);
3.5、圖層之--手勢 + 移動/縮放/旋轉
- 容器在創建時設置了寬度和高度, 素材增加進去后, 會默認放到容器的中間, 即容器的寬度/2和高度/2.
- 每增加一個素材, 會得到一個圖層對象, 圖層都支持用手指直接操作屏幕 來完成 移動縮放旋轉的touch事件,, 你可以單指移動, 雙指縮放和旋轉; 當選中一個圖層時, 它的周邊會出現一個紅色的方框, 表示選中當前圖層, 為了避免在操作時誤觸別的圖層, 你可以把別的圖層鎖定, 我們提供豐富的API讓你設置或獲取相關的坐標, 我們甚至定義了一個類LSORect來讓你獲取相對應當前預覽窗的相對坐標 和 相對于容器中的絕對坐標.
- 我們另外定義了各種常見的枚舉類型, 比如4種縮放類型, 和上/下/左/右/中/左上/左下/右上/右下這9個位置點供您選擇; 提供縮放系數, 縮放到實際大小,設置具體位置, 相對屏幕位置等.
- 如果你要用代碼的形式設置, 則設置的位置是當前圖層中心點的位置. 可以縮放到指定大小, 旋轉則0度則是正上方為0點, 角度是任意角度, 比如設置為-100度, -400度, 或370度, 540度等等.
- 這些API的關鍵詞是: 縮放大小(scaleSize), 縮放類型(scaleType) , 縮放系數(scaleFactor), 位置類型( positionType) , 位置中心點(centerPoint), 位置相對預覽窗口坐標(positionInView), 旋轉 (rotation), setTouchEnable , xxxInView( 是以當前預覽為單位的寬高和位置;)
3.6、圖層之--貼紙/水印/文字
- 貼紙, 水印, 文字, 在我們圖層處理架構里, 是以圖像的形式呈現的, 因為手機GPU處理的是圖像, 貼紙, 水印, 文字在底層是一個意思, 認為是一個圖像或一組連續的圖像做處理.
- 文字在SDK內部會各種轉換方法, 讓你方便的以文字圖層操作, 操作完畢后底層會轉換為圖像來處理,如果我們提供的繪制文字不夠詳細, 你也可以自己繪制,然后轉換為圖片或圖片數組,設置到容器中.
- 貼紙和水印是一個意思,我們提供了單個圖片的圖層,多張聯系圖片組成的圖層, Gif圖層等, 這些你可以方便的設置, 可以設置一個,也可以設置多個.
- 圖層的增加是通過容器Composition的方法實現的, 增加后, 得到對應的圖層對象;
- 這些API 的關鍵詞是: android的圖片圖層(BitmapLayer) , android的圖片序列圖層(BitmapListLayer), ios的圖片圖層(ImageLayer), ios的圖片序列圖層(ImageListLayer), Gif圖層.
3.7、圖層之--顏色調節/濾鏡/美顏
- 濾鏡是對圖層的畫面做調節, 和圖層的縮放移動一樣是圖層的一個屬性, 顏色調節和濾鏡和美顏, 都是濾鏡的不同效果. 當前我們的美顏是僅對整體畫面做磨皮和美白處理,沒有做臉識別后的各種功能.
- 當前支持的顏色調節包括: 亮度/ 對比度/ 飽和度/ 銳化/色溫/白平衡/色調/曝光度
- 當前支持80種濾鏡, 包括常見的17種濾鏡,當前建議你使用這17種濾鏡, 這些濾鏡在我們demo里可以看到.
- 這些API 的關鍵詞是: 設置濾鏡(setFilter,設置會把上一個替換掉),增加濾鏡(addFilter), 移出濾鏡(removeFilter),刪除所有濾鏡(removeAllFilter);
3.8、圖層之--轉場設置
- 轉場是兩個素材前后拼接時播放時的一種過渡效果, 比如上一段淡淡的消失, 下一段逐漸出現等.
- 當前的轉場是AE設計師在PC端用after Effect 設置好的, 然后按照我們的格式,導出為json文檔,SDK還原出來在PC端設計的效果. 這樣的好處是: 開發人員不用自己用代碼實現各種效果,只需要根據不同的效果,把對應的json送到SDK中, SDK就實現了這樣的效果, 簡單高效, 并可以做到Android和ios的統一.
- PC端用Ae軟件制作規范: 用一張小于等于544x960的圖片創建一個合成, 然后對其做旋轉縮放透明處理, 形成動畫; 或對其做mask遮罩處理,形成動畫; 當前不支持同時做旋轉縮放透明+ mask的效果; 合成的分辨率應小于等于544x960, 時長建議不大于3秒, 以實際效果為準;
- 當前支持各種遮罩轉場和基礎的移動旋轉縮放轉場; 轉場設置是通過每個具體的圖層設置的, 比如有圖層ABC3個, 要在AB之前增加轉場,則設置A的transition; 要給BC之間加轉場,則設置B的transition;
- 轉場的時間可以設置,默認在是設置路徑后, 會默認是1秒鐘, 最大可設置為5秒鐘; 當前僅支持遮罩轉場, 即各種形式的透明.
- 這些API 的關鍵詞是:轉場(transition); 設置轉場時間:(transitionDuration) , 播放轉場(playTransition), 取消(cancelTransition);
- 執行步驟是: 你需要先設置轉場路徑, 設置后,默認轉場時間是1秒鐘, 如需預覽,則playtransition; 調用cancelTransition取消轉場; 在設置路徑后, 你可以設置轉場時間; 設置后, 如需要播放則playTransition; 如果你要應用到全局,則需要把一個json文件循環設置到每個圖層對象; 我們內部會共用同一個json內容;
3.9、圖層之--入場動畫/出場動畫/指定時間點動畫
- 入場動畫, 出場動畫, 和轉場一樣, 也是Ae設計師在PC端設計好后, 導出為json,送入到SDK中. SDK解析還原出對應的效果.
- PC端用Ae軟件制作動畫規范: 用一張小于等于544x960的圖片創建一個合成, 然后對其做旋轉縮放透明處理, 形成動畫; 或對其做mask遮罩處理,形成動畫; 合成的分辨率應小于等于544x960, 時長建議不大于3秒, , 以實際效果為準; 如果是旋轉縮放透明則幀率建議是40, 若是mask遮罩,則幀率建議25.
- 因入場動畫和出場動畫從技術上講,僅僅是插入到圖層的時間點不同,SDK可以設置開始從圖層的哪個時間點開始, 當前入場動畫默認是0, 出場動畫默認最后json的時間時長; 你可以調節這個出入場的持續時間, 持續時間調節后, 會把調節后的時長作為整個動畫走完的時間, 如果你設置的短,則動畫走的快; 如果設置的長,則動畫走的慢; 入場動畫和出場動畫是setXXX的方式, 每次設置后, 會把之前的動畫移出;同一時刻只能有一個入場或出場動畫.
- 指定時間點動畫, 是你可以指定一個時間點增加動畫, 可以實時設置開始時間點,也可以設置動畫時長, 可以增加多個, 每個素材最大支持20個動畫。在每次設置后, 可預覽或移除.
- 這些API的關鍵詞是: 動畫:(Animation) ; 入場動畫/出場動畫:(setAnimationAtLayerHead/End), 指定時間點動畫:(addAnimationAtCompTimeUs)預覽動畫 playAnimation; 移除removeAnimation.
- 執行步驟是: 增加json文件, 會得到LSOAnimation對象,用這個對象可以playAnimation來預覽; removeAnimation刪除; 對象里有設置開始時間點和播放時長的方法;. 等要刪除時,用removeAnimation; 當一個圖層從容器中釋放后, 我們會銷毀里面的所有的對象.
3.10、圖層之--特效
- 和動畫一樣的制作步驟, 唯一不同的是: 動畫是從開始播放到結束, 如果設置的時長不等于json中的默認時長,動畫平均分配不同的動畫快慢來達到設置的長度; 而特效的效果時間是固定的, 如果設置的時長json中的默認時長,則會循環播放特效.
- 特效可設置當前圖層的任意時刻點開始,我們舉例了從頭(head) 和尾(end)的兩種方式.
- 這些API的關鍵詞是: 特效:(Effect), 指定時間點增加特效:(addEffectAtCompTimeUs); 預覽特效(playEffect), 移除特效:(removeEffect).
- 執行步驟, 和動畫步驟一致.
3.11、圖層之--畫布(背景)/去水印/透明/鏡像
- 畫布是對當前每個圖層做的操作, 是無論圖層縮放多少, 畫布都會鋪滿整個容器, 畫布可以是顏色, 圖片, 或畫面的虛化做背景;
- 去水印當前支持馬賽克去水印, 我們在圖層類中舉例了最大4個去水印的API, 可以設置位置,設置大小,設置馬賽克像素的大小; 如果你有更多個馬賽克的需求,還是用LanSongMosaicRectFilter自行增加;
- 透明我們描述為:不透明度, 這樣更好理解一些, 和調節RGB一樣,可以直接設置; 參數1.0是完全不透明, 0.0是完全透明;
- 鏡像:是把整個畫面的左邊鏡像到右邊, 把右邊鏡像到左邊; 如果你打算把左邊的一半鏡像到右邊,則用我們的LanSongMirrorFilter濾鏡;
- 這些API的關鍵詞是: 背景(backGround), 去水印(mosaicRect), 不透明度(opacityPercent) , 鏡像(mirror).
3.12、圖層之--獲取縮略圖
- 縮略圖是每秒鐘一幀, 大小是192x192的圖片對象;
- 用getDisplayThumbnailList 獲取到每張圖片大小是192x192, 每個圖層最后獲取到的圖片寬度總和等于圖層的縮略圖顯示時長(秒為單位)*192;
- 我們有合成總時長改變回調(DurationChanged): 當原視頻時長裁剪, 變速,倒序,增加轉場,都會觸發此回調,建議在這里重新刷新所有的拼接層的時長, 因為一個圖片或視頻的時長改變了, 別的圖片和視頻的開始顯示點等都會改變;
- 我們的demo演示, 是在durationChanged的時候刷新所有的拼接層的所有圖層縮略圖;
3.13、圖層之--關鍵幀動畫
- 關鍵幀動畫是指:在兩個不同時間點分別對視頻或圖片做動作, 然后SDK就會自動從一個時間點平滑過渡到另一個時間點狀態的動畫, 稱之為關鍵幀動畫;
- 比如你在時間A點把視頻縮小一倍, 在B點把視頻放大一倍, 則預覽時SDK就會自動的從A點平滑的一點一點的放大視頻,直到B點放大完畢,從而形成動畫.
- 當前關鍵幀動畫支持 移動旋轉縮放透明;
- 關鍵幀的優先級最低, 如果在同一時間段設置了關鍵幀和動畫/特效/轉場等json時, 則動畫/特效/轉場有效果, 關鍵幀無效;
3.14、圖層之--調速
- 視頻支持調速, 調速可設置0.1倍到10.0倍
- 0.1倍是放慢10倍, 畫面顯示時長等于原來的10倍, 10.0倍是加快10倍, 畫面時長等于原來的1/10; 1.0 倍是原來的速度, 可以很細小的調節,比如0.1, 0.2, 0.3等;
- 當前在調速時, 暫時不支持聲音變速; 聲音默認是靜音的; 調速后,會觸發容器的durationChanged回調, 建議你在回調中去刷新所有縮略圖;
- 對應的API 是: setVideoSpeed, getVideoSpeed;
3.15、聲音圖層
- 外界輸入的各種音效, 無論是wav格式的音效, 還是mp3,m4a, 或者錄音 或者帶有聲音的視頻, 我們統稱為聲音. 這些聲音是同一個API輸入到SDK中, 然后得到對應的聲音圖層.
- 聲音圖層, 可以指定時間點增加, 可以設置循環, 設置把聲音的那一段裁剪后增加, 設置音量大小, 設置淡入淡出效果
- 聲音音量范圍是0---5.0 , 1.0是默認聲音. 0.0是關閉聲音; 5.0是放大5倍; 聲音裁剪最小是300毫秒, 最大是聲音的原始長度;
- 這些API的關鍵詞是: 音頻圖層:(LSOAudioLayer); 裁剪時長(setCutStartTime/setCutEndTime) 音量:(volume)
3.16、API介紹
3.16.1 Android視頻編輯SDK概述:
- 我們把視頻編輯抽象為兩個類, 一個是編輯預覽類LSOEditPlayer, 一個圖層類LSOLayer。
- 播放預覽類LSOEditPlayer, 是一個素材容器, 也是一個view,可布局到xml中,當設置寬高比例時,會自動適配并等比例布局播放畫面,以監聽返回. 可完成素材的:插入或刪除,替換,拼接,疊加,定位,播放/暫停等實時容器預覽的功能。
- 圖層類LSOLayer: 圖片/視頻/文本/特效/GIF等增加到播放器中后,我們把他處理成一層畫面 ,增加一個, 就是增加一層畫面;增加時會返回LSOLayer對象,用這個對象可以設置:時間點,位置,寬高,角度,鏡像,倒序,濾鏡,調節,美顏,動畫,轉場,特效等功能。
- 調用流程是:在Activity的onCreate/onPause/onResume/onDestroy生命周期中, 分別增加LSOEditPlayer對應的同名方法即可。
- 素材增加的形式有兩種, 一種是前后拼接, 一種是上下疊加, 示意圖如下:
1、Android視頻播放LSOEditPlayer類說明
- public void onCreateAsync(LSORatioType ratio, OnCreateListener listener)
功能:
? 設置播放容器寬高比;
? 在Activity的 onCreate中調用,設置播放容器的寬高比, 設置后, 會根據寬高比等比例縮放到當前view所在layout中;
也可以在播放暫停時, 重寫布局此播放容器(relayout);
參數:
? ratio 寬高比;
? listener 重新布局后, 適配到layout后的回調;
- public void onCreateAsync(List<LSOAsset> arrays, OnCreateListener listener)
功能:
? 設置播放容器的資源
參數:
? arrays 容器資源數組, 支持圖片和視頻.
? listener 默認會以第一個圖片或視頻的寬度為參考,等比例縮放當前播放容器后回調;
- public void onCreateAsync(List<LSOAsset> arrays,int width, int height, OnCreateListener listener)
功能:
? 設置播放容器資源, 并設置寬度和高度
參數:
? arrays 輸入的圖片或視頻資源;
? width 播放容器的寬度
? height 播放容器的高度
? listener 根據設置的高度和寬度, 重新等比例布局當前view, 布局后返回監聽;
- public void onCreateAsync(int width,int height, OnCreateListener listener)
功能:
? 設置容器的寬度和高度, 在播放設置, 不可以用來初始化播放器;
? 在第一次之后設置
參數:
? width 寬度
? height 高度
? listener 適配當前view后的監聽;
- public void onResumeAsync(OnResumeListener listener)
功能:
? 在Activity的 onResume中調用, 用來執行activity的返回事件;
參數:
? listener 異步回調;
- public void onPause()
功能:
? 在Activity中的onPause中調用;
- public void onDestroy()
功能:
? 在Activity的onDestroy中調用
- public void prepareConcatAssets(OnAddAssetProgressListener listener)
功能:
? 在當前View布局完畢后, 準備當前播放器;
參數:
? listener 內部會開啟一個線程, 內部開啟完畢后的回調;
- public void insertConcatAssetAtCurrentTime(List<LSOAsset> assetArray, OnAddAssetProgressListener listener1)
功能:
? 在當前時間點插入圖片或視頻
參數:
? assetArray 插入的圖片或視頻數組
? listener1 插入完畢后的回調;
- public void insertConcatAssetWithTime(List<LSOAsset> assetArray, long atCompUs, OnAddAssetProgressListener listener1)
功能:
? 在指定的時間點插入圖片或視頻.
? 內部流程是:
? 先找指定時間點 在某個圖層時間段內.
? 找到圖層后, 如果時間點在圖層前半部分,則向前插入; 如后半部分,則向后插入;
參數:
? assetArray 插入的圖片或視頻數組
? atCompUs 在指定的時間點
? listener1 異步插入完畢后的回調;
- public void replaceConcatLayerAsync(LSOAsset asset, LSOLayer replaceLayer, OnAddAssetProgressListener listener)
功能:
? 替換拼接圖層;
參數:
? asset 資源
? replaceLayer 被替換的圖層
? listener 異步替換;
- public LSOLayer getCurrentConcatLayerByTime(long compUs)
功能:
? 獲取指定時間點的拼接圖層
參數:
? compUs 指定時間點, 單位微秒; 1秒=1000*1000微秒
? @return 返回圖層對象
- public void addAssetAsync(LSOAsset asset, long atCompUs,OnAddAssetProgressListener listener1)
功能:
? 在拼接層上疊加一個資源;
參數:
? asset 圖片或視頻資源
? atCompUs 指定時間點
? listener1 異步增加完畢后的回調監聽;
- public void addVideoEffectAsync(LSOAsset asset, long atCompUs, boolean preview, OnAddAssetProgressListener listener1)
功能:
? 在指定時間點增加一個視頻特效, 增加后, 通過異步返回一個LSOLayer對象;
參數:
? asset 一個color和一個mask組成的透明視頻動畫資源, 寬高:最大720p, 時長:最大5秒鐘;
? atCompUs 在指定時間點
? preview 插入后, 是否預覽
? listener1 插入完畢后的回調,回調中
- public LSOLayer addBitmapLayer(String path, long atCompUs)
功能:
? 在拼接層上疊加一個圖片圖層
參數:
? path 圖片的完整路徑
? atCompUs 在指定時間點增加, 單位微秒
- public LSOLayer addBitmapLayer(Bitmap bmp, long atCompUs)
功能:
? 增加圖片圖層,
參數:
? bmp 圖片對象;
? atCompUs 在指定時間點增加,單位微秒;
- public LSOLayer addGifLayer(String gifPath, long atCompUs)
功能:
? 在拼接層上, 增加一個Gif圖層
參數:
? gifPath gif圖層路徑
? atCompUs 在指定時間點增加,單位微秒;
- public LSOLayer addGifLayer(LSOAsset asset, long atCompUs)
功能:
? 在拼接層上, 增加一個Gif圖層
參數:
? asset gif文件的路徑
? atCompUs 在指定時間點增加,單位微秒;
? @return 返回LSOLayer圖層對象. 此對象可設置圖層的移動旋轉縮放等功能.
- public LSOAudioLayer addAudioLayer(String path, long startTimeOfComp)
功能:
? 增加聲音圖層;
參數:
? path 聲音的完整路徑;
? startTimeOfComp 從合成的什么位置開始增加;
? @return 返回聲音對象, 可以設置聲音的音量, 循環等功能;
- public void removeLayerAsync(LSOLayer layer)
功能:
? 異步刪除圖層;
? 刪除成功后, 會觸發容器時長回調, 在回調中你可以重新布局時間軸
參數:
? layer 圖層對象;
- public void removeAllOverlayLayersAsync()
功能:
? 刪除所有的疊加圖層.
? 疊加圖層有:圖片圖層, gif圖層, 圖片序列圖層等;
- public void removeAudioLayerAsync(LSOAudioLayer layer)
功能:
? 刪除聲音圖層
參數:
? layer
- public void removeALLAudioLayer()
功能:
? 刪除所有的增加的聲音圖層;
- public boolean isPlaying()
功能:
? 畫面是否在播放
參數:
? @return 是否在播放
- public boolean isRunning()
功能:
? 當前播放器是否在運行.
? 合成是一個線程, 此返回的是當前線程是否在運行,
? 線程運行不一定畫面在播放,有可能畫面暫停;
參數:
? @return 線程是否在運行
- public boolean isExporting()
功能:
? 是否在導出;
參數:
? @return
- public long getCurrentPositionUs()
功能:
? 獲取當前播放器的時間.
參數:
? @return 當前時間, 單位微秒
- public List<LSOLayer> getAllConcatLayers()
功能:
? 獲取播放器的所有拼接圖層;
參數:
? @return 圖層list 拼接圖層;
- public List<LSOLayer> getAllOverLayLayers()
功能:
? 獲取播放器中的所有疊加層
參數:
? @return 圖層數組, 疊加的圖層;
- public List<LSOAudioLayer> getAllAudioLayers()
功能:
? 獲取播放器中的所有聲音圖層
- public void setOnBeforeRenderFrameListener(OnLanSongSDKBeforeRenderFrameListener listener)
功能:
? 在每一幀繪制前的回調, 里面沒有經過handler, 你增加的代碼, 在我們render線程中執行,
參數:
? listener 返回的是時間戳, 單位us;
- public void setOnDurationChangedListener(OnLanSongSDKDurationChangedListener listener)
功能:
? 容器的總時長改變監聽;播放器會在拼接層裁剪, 設置顯示時間, 轉場,變速等場合下, 時長改變;
? 返回的是當前總時長;
參數:
? listener 總時長改變監聽, 返回的long類型改變后的當前總時長
- public void setOnLanSongSDKPlayProgressListener(OnLanSongSDKPlayProgressListener listener)
功能:
? 播放進度回調
? 監聽中的兩個參數是: onLanSongSDKExportProgress(long ptsUs, int percent);
? 分別對應 當前處理的時間戳 和百分比;
? 在seek或pause的時候,此監聽不調用;
參數:
? listener
- public void setOnTimeChangedListener(OnLanSongSDKTimeChangedListener listener)
功能:
? 容器的當前播放時間改變回調;
? 只要是改變了, 不管是seek的改變,還是自動播放的改變,都執行這里;
參數:
? listener 時間改變監聽 long類型是當前時間戳, int類型是當前時間戳占總時長的百分比;
- public void setOnPlayCompletedListener(OnLanSongSDKPlayCompletedListener listener)
功能:
? 視頻播放完成進度;
參數:
? listener 播放完成監聽
- public void setOnExportProgressListener(OnLanSongSDKExportProgressListener listener)
功能:
? 導出進度回調;
? 監聽中的兩個參數是: onLanSongSDKExportProgress(long ptsUs, int percent);
? 分別對應 當前處理的時間戳 和百分比;
參數:
? listener 導出進度監聽, long類型是當前正在處理的時間戳, int類型是進度百分比;
- public void setOnExportCompletedListener(OnLanSongSDKExportCompletedListener listener)
功能:
? 導出完成回調;
? 完成后, 有 void onLanSongSDKExportCompleted(String dstVideo);
? 對應的是:返回完成后的目標視頻路徑;
參數:
? listener 導出完成監聽, 返回String類型的導出視頻完整路徑;
- public void setOnErrorListener(OnLanSongSDKErrorListener listener)
功能:
? 錯誤監聽
- public boolean start()
功能:
? 開始播放/恢復播放;
- public void startExport(LSOExportType type)
功能:
? 開始導出
參數:
? type 導出枚舉類型
- public void seekToTimeUs(long timeUs)
功能:
? 定位到某個位置.
參數:
? timeUs 時間, 單位微秒;
- public void pause()
功能:
? 播放預覽暫停
- public long getDurationUs()
功能:
? 獲取當前播放器的總時長;
參數:
@return 時間, 單位微秒;
- public void setLooping(boolean is)
功能:
? 設置容器循環播放;
參數:
? is 是否循環;
- public void cancelExport()
功能:
? 取消導出
- public void cancel()
功能:
? 取消當前合成.
? 取消后, 會把內部線程全部退出, 所有增加的圖層都會釋放;
- public void setFrameRate(int frameRate)
功能:
? 設置導出幀率
? 不建議使用
參數:
? frameRate 幀率最小20,最大是60
- public void setExportBitRate(int bitRate)
功能:
? 設置導出時的碼率,
? 不建議使用
參數:
? bitRate 碼率, 最小是300K,不建議使用;
2、Android視頻編輯圖層LSOLayer類說明
- public String getOriginalPath()
功能:
? 獲取原視頻/圖片的路徑
參數:
? @return
- public long getOriginalDurationUs()
功能:
? 獲取視頻/圖片的原始時長
參數:
? @return
- public int getOriginalWidth()
功能:
? 獲取原始寬度
參數:
? @return
- public int getOriginalHeight()
功能:
? 獲取原始高度
參數:
? @return
- public long getDisplayDurationUs()
功能:
? 獲取顯示時長;
? 如果播放器中只有一個視頻或圖片, 則此時長等于播放器的時長;
參數:
? @return
- public long getThumbnailDurationUs()
功能:
? 獲取縮略圖的顯示時間;
? 注: 因轉場等功能,拼接層可能有重疊區域. 因此顯示時長不等于縮略圖的時長;
參數:
? @return
- public void setDisplayDurationUs(long durationUs)
功能:
? 設置顯示時長;
參數:
? durationUs
- public long getStartTimeOfComp()
功能:
? 獲取當前圖層在播放器中的開始時間
參數:
? @return
- public void setCutDurationUs(long startUs, long endUs)
功能:
? 設置視頻的裁剪時長
參數:
? startUs 開始裁剪時間
? endUs 結束裁剪時間
- public long getCutStartTimeUs()
功能:
? 獲取裁剪開始時間
參數:
? @return
- public long getCutEndTimeUs()
功能:
? 獲取裁剪結束時間
參數:
? @return
- public void setCropRect(LSORect rect)
功能:
? 設置裁剪區域;
參數:
? @param rect
- public void setCropRectToOriginal()
功能:
? 恢復到不裁剪
- public void setCropRectPercent(float x, float y, float width, float height)
功能:
? 設置裁剪百分比.整個畫面從左到右是0.0--1.0; 從上到下是0.0--1.0;
參數:
? x 寬度的開始比例
? y 裁剪高的開始比例
? width 裁剪寬度的比例
? height 裁剪高度的比例
- public void setLooping(boolean is)
功能:
? 疊加層設置循環
參數:
? is
- public void setStartTimeOfComp(long atCompUs)
功能:
? 設置當前圖層在播放器中的開始時間點;
參數:
? atCompUs
- public void setVisibility(boolean is)
功能:
? 設置是否顯示
參數:
? is
- public void setVisibility(int visibility)
功能:
? 設置是否顯示
? 類型是 LSOLayer.VISIBLE 和 LSOLayer.INVISIBLE
參數:
? visibility
- public int getVisibility()
功能:
? 獲取是否顯示
參數:
? @return
- public void resetScaleSize()
功能:
? 恢復到縮放前的大小
- public void setScaleType(LSOScaleType type)
功能:
? 設置縮放枚舉類型.
? NONE: 無縮放形式.則內部會根據不同的素材,采用默認形式;
? ORIGINAL: 原始大小,直接放入, 不做任意處理;
? FILL_COMPOSITION, 忽略百分比,把寬度等于容器的寬度, 高度等于容器的高度,填滿整個容器,這樣有些畫面可能會變形;
? CROP_FILL_COMPOSITION: 裁剪填滿 放入到容器中;把視頻的中心點放到容器的中心點,然后 把畫面等比例提填滿整個容器,把多的部分裁剪掉.
? VIDEO_SCALE_TYPE:視頻縮放模式,如果視頻寬度大于高度, 則寬度和容器對齊, 然后等比例調整高度;如果高度大于寬度, 則反之.
參數:
? type
- public void setScaledValue(float width, float height)
功能:
? 縮放到的實際值
參數:
? width
? height
- public float getScaleWidth()
功能:
? 獲取縮放的寬度
參數:
? @return
- public float getScaleHeight()
功能:
? 獲取縮放的高度
參數:
? @return
- public float getRotation()
功能:
? 獲取旋轉角度.
參數:
? @return
- public void setRotation(float angle)
功能:
? 設置旋轉角度
參數:
? angle
- public void setLayerMirror(boolean flipHorizontal, boolean flipVertical)
功能:
? 設置圖層是否鏡像, 上下鏡像, 左右鏡像.
參數:
? flipHorizontal 水平鏡像
? flipVertical 垂直鏡像
- public void cancelLayerMirror()
功能:
? 取消鏡像
- public boolean isMirrorX()
功能:
? 水平是否鏡像
參數:
? @return
- public boolean isMirrorY()
功能:
? 垂直是否鏡像
參數:
? @return
- public void setPosition(float xPos, float yPos)
功能:
? 設置當前圖層中心點的坐標, xPos是X軸的坐標,yPos是設置Y軸的坐標.
? 此坐標是以播放容器的大小為參考, 比如容器的大小是1280x720, 您設置了640,360 ,則圖層在播放器中居中顯示
參數:
? xPos
? yPos
- public void setPosition(LSOLayerPosition position)
功能:
? 設置圖層的枚舉位置;
? 枚舉類型有: 左上/左下/右上/右下/居中/上/下/左/右
- public float getPositionX()
功能:
? 獲取當前圖層中心點的位置X
參數:
? @return 橫向坐標中心點, 相對于播放容器本身而言;
- public float getPositionY()
功能:
? 獲取當前圖層中心點的位置Y
參數:
? @return 豎向坐標中心點, 相對于播放容器本身而言
- public void setOpacityPercent(float percent)
功能:
? 設置透明百分比;
參數:
? percent 百分比 范圍從0--1.0;
- public void setBrightnessPercent2X(float percent2X)
功能:
? 調節當前圖層畫面的亮度
參數:
? percent2X 范圍是0--2.0; 1.0為默認值;
- public void setContrastFilterPercent2X(float percent2X)
功能:
? 調節當前圖層畫面的對比度
參數:
? percent2X 范圍是0--2.0; 1.0為默認值;
- public void setSaturationFilterPercent2X(float percent2X)
功能:
? 調節畫面的飽和度;
參數:
? percent2X 范圍是0--2.0; 1.0為默認值;
- public void setWhiteBalanceFilterPercent2X(float percent2X)
功能:
? 調節畫面的白平衡
參數:
? percent2X 范圍是0--2.0; 1.0為默認值;
- public void setHueFilterPercent2X(float percent2X)
功能:
? 調節畫面的色度
參數:
? percent2X 范圍是0--2.0; 1.0為默認值;
- public void setExposurePercent2X(float percent2X)
功能:
? 調節畫面的曝光度
參數:
? percent2X 范圍是0--2.0; 1.0為默認值;
- public void setBeautyLevel(float level)
功能:
? 設置畫面的磨皮級別 0.0--1.0;
參數:
? level 等級 0.0是不磨皮, 1.0是最高磨皮
- public void setFilter(LanSongFilter filter)
功能:
? 設置濾鏡, 設置時, 會把上一次設置的濾鏡刪除; 如果不想刪除則用addFilter;
參數:
? filter 濾鏡對象, 此對象不可同時設置為多個圖層中.
- public void removeFilter(LanSongFilter filter)
功能:
? 移出濾鏡
參數:
? filter 增加的濾鏡對象
- public void addFilter(LanSongFilter filter)
功能:
? 增加濾鏡,如增加多個, 則多個濾鏡是級聯的關系, 即畫面把執行上一個濾鏡的結果, 作為下一個濾鏡的輸入;
參數:
? filter 濾鏡對象
- public void removeAllFilter()
功能:
? 刪除所有濾鏡
- public void setVideoSpeed(float speed)
功能:
? 設置視頻速度.
參數:
? speed 視頻速度值, 范圍0.1--10.0;
- public float getVideoSpeed()
功能:
? 獲取視頻速度;
參數:
? @return 返回速度值
- public void setVideoReverseAsync(boolean reverse, OnVideoReverseListener listener)
功能:
? 異步設置視頻倒序
參數:
? reverse 是否倒序
? listener 倒序后的監聽;
- public boolean isVideoReverse()
功能:
? 當前視頻是否倒序
參數:
? @return 是否倒序
- public LSOEffect addEffectAtCompTimeUs(String jsonPath, long compUs)
功能:
? 用json的形式增加特效
參數:
? jsonPath 增加一個特效json路徑
? compUs 從播放器的什么時間點開始增加
? @return 增加后, 返回特效對象, 可設置開始時間和播放時長;
- public LSOEffect addEffectAtLayerHead(String jsonPath)
功能:
? 在圖層的頭部增加一個特效
參數:
? jsonPath json路徑
? @return 增加后, 返回特效對象, 可設置播放時長;
- public LSOEffect addEffectAtLayerEnd(String jsonPath)
功能:
? 在圖層的尾部增加一個特效
參數:
? jsonPath 特效路徑
? @return 增加后, 返回特效對象, 可設置播放時長;
- public List<LSOEffect> getAllEffectList()
功能:
? 獲取增加的所有特效
參數:
? @return 所有特效數組
- public void removeAllEffectList()
功能:
? 移出當前圖層的所有特效
- public void removeEffect(LSOEffect effect)
功能:
? 移出指定的特效
參數:
? effect
- public void playEffect(LSOEffect effect)
功能:
? 播放預覽特效
參數:
? effect 指定播放的特效對象,播放后會回到播放前的位置
- public LSOAnimation addAnimationAtCompTimeUs(String jsonPath, long compUs)
功能:
? 增加動畫
參數:
? jsonPath json格式的路徑
? compUs 從播放器的時間點增加
? @return 返回動畫對象, 可設置開始時間和播放時長
- public LSOAnimation setAnimationAtLayerHead(String jsonPath)
功能:
? 在圖層的頭部增加一個動畫
參數:
? jsonPath json動畫路徑
? @return 返回動畫對象, 可設置播放時長
- public LSOAnimation setAnimationAtLayerEnd(String jsonPath)
功能:
? 在圖層的尾部增加一個動畫
參數:
? jsonPath 動畫路徑
? @return 返回動畫對象, 可設置播放時長
- public List<LSOAnimation> getAllAnimationList()
功能:
? 獲取所有動畫
參數:
? @return 所有動畫對象
- public void removeAllAnimationList()
功能:
? 移出所有動畫
- public void removeAnimation(LSOAnimation animation)
功能:
? 移出指定動畫
參數:
? animation 指定動畫對象
- public void playAnimation(LSOAnimation animation)
功能:
? 播放動畫
參數:
? animation 動畫對象
- public boolean setTransitionMaskPath(String maskJsonPath)
功能:
? 設置轉場路徑
參數:
? maskJsonPath 遮罩轉場路徑
? @return 可以設置返回true; 否則返回false
- public void setTransitionDurationUs(long duration)
功能:
? 設置轉場時長
參數:
? duration 時長,范圍100*100---3*1000*1000;
- public void playTransition()
功能:
? 開始播放轉場
- public void cancelTransition()
功能:
? 取消轉場
- protected long getTransitionDurationUs()
功能:
? 獲取轉場時長;
參數:
? @return
- public long getTransitionStartTimeOfComp()
功能:
? 獲取從合成的開始時間;
參數:
? @return
- public LSOMosaicRect getMosaicRect1()
功能:
? 獲取一個馬賽克區域, 返回馬賽克對象,
? 可設置馬賽克區域, 是否禁止,馬賽克像素點的寬度;
參數:
? @return 馬賽克對象
- public void setAudioVolume(float volume)
功能:
? 設置音頻音量
- public float getAudioVolume()
功能:
? 獲取音頻音量
- public void setBackGroundBlurLevel(float level)
功能:
? 設置背景模糊級別
? 1.0是輕微模糊,毛玻璃模糊. 8.0f是完全,深度模糊; 0.0是刪除模糊效果;
參數:
? level
- public void setBackGroundBitmap(String bitmapPath)
功能:
? 設置背景圖片
參數:
? bitmapPath
- public void setBackGroundColor(int color)
功能:
? 設置背景顏色
參數:
? color
- public float getMaxBlurLevel()
功能:
? 獲取最大模糊系數, 當前返回的是8.0;
- public void getThumbnailAsync(OnLanSongSDKThumbnailBitmapListener listener)
功能:
? 異步獲取縮略圖
參數:
? listener
- public List<Bitmap> getThumbnailListWithCount(int count)
功能:
? 獲取縮略圖個數, 此方法一定在getThumbnailAsync完成后設置
參數:
? count 獲取的圖片張數
? @return 返回bitmap數組;
3.16.2 IOS視頻編輯SDK概述:
- 我們把視頻編輯抽象為兩個類, 一個是編輯預覽類LSOEditPlayer, 一個圖層類LSOLayer。
- 播放預覽類LSOEditPlayer,和AVPlayer類似, 需要一個播放窗口UIView,本質是一個編輯播放器,可完成素材的:插入或刪除,替換,復制,分割,拼接,疊加,定位,播放/暫停等實時容器預覽的功能。
- 圖層類LSOLayer: 圖片/視頻/文本/特效/GIF等增加到播放器中后,我們把他處理成一層畫面 ,增加一個, 就是增加一層畫面;增加時會返回LSOLayer對象,用這個對象可以設置:時間點,位置,寬高,角度,鏡像,倒序,濾鏡,調節,美顏,動畫,轉場,特效等功能。
- 調用流程是: 創建LSOEditPlayer對象, init時可輸入圖片或視頻的url路徑和播放器比例,得到播放器容器的寬高,根據寬高創建LSODispLayView作為播放器的顯示窗口, 之后正常播放即可.
- 素材增加的形式有兩種, 一種是前后拼接, 一種是上下疊加, 示意圖如下:
1、IOS視頻播放LSOEditPlayer類說明
1. - (id)initWithUrlArray:(NSArray<NSURL *> *)urlArray ratio:(LSOSizeRatio)ratio
功能:
? 初始化這個類, 可以是一個圖片或一個視頻, 也可以是多個視頻. 可以設置這個播放器的寬高比例, 當比例是原始時, 默認用數組中第一個url的寬高為默認寬高;
? 當初始化失敗后, 返回nil, 大部分是沒有授權文件時會失敗;
參數:
? urlArray 用戶選中的視頻/圖片
? ratio 容器的比例, 如果原始比例, 則填入LSOSizeRatio_ORIGINAL,比例系數;
2. - (void)setCompositionView:(LSODisplayView *)view;
功能:
? 增加預覽的顯示窗口;
? 和AVPlayer類似, 視頻播放器和播放view是分開的, 你在創建好此對象后, 需要拿到對象的compositionSize,然后布局LSODisplayView, 再設置到此.
? LSODisplayView 繼承自UIView,是一個顯示控件,顯示窗口一定要和合成(容器)的寬高成比例, 可以不相等. 我們提供最簡單的集成方法, 方便您參考;
參數:
? view 顯示窗口
3. @property(readonly,atomic) CGFloat compDurationS
功能:
? 當前播放器的總時長.單位秒;
(當你設置每個圖層的時長后, 此屬性會改變. 只讀, 不可寫入)
4. @property (nonatomic,readonly) CGSize compositionSize
功能:
? 您在init的時候, 設置的合成寬高. 或設置的比例;
? 當在運行中, 調整播放器的比例后, 此寬高是調整后的寬高
5. @property (nonatomic,assign) CGFloat frameRate
功能:
? 設置幀率,
? [可選],范圍是10--60
6. @property (nonatomic,assign) int exportBitRate
功能:
? 設置碼率, 單位字節,
? [可選],最低是300*1024
7. @property(nonatomic, readonly) CGFloat currentTimeS
功能:
? 獲取,當前播放的時間點,單位秒
8. @property (strong,atomic, readonly) NSMutableArray *overlayLayerArray
功能:
? 當前內部有多少個疊加層;
? 如果你獲取使用此變量, 則會拷貝一份新的NSMutableArray返回.
? 注意: 請不要一直拷貝
9. @property (strong,atomic, readonly) NSMutableArray *concatLayerArray
功能:
當前內部有多少個拼接層;
如果你獲取使用此變量, 則會拷貝一份新的NSMutableArray返回.
注意: 請不要一直拷貝
10. @property (strong,atomic, readonly) NSMutableArray *audioLayerArray
功能:
? 當前有多少個音頻層;
? 如果你獲取使用此變量, 則會拷貝一份新的NSMutableArray
? 注意: 請不要一直拷貝
11. @property (nonatomic, readwrite) LSOLayer *selectedLayer
功能:
? 設置一個圖層為選中狀態;
? 當用戶通過界面點擊別的圖層時,這個狀態會被改變;
? 可以設置, 如果設置不選中, 則設置為nil
12. - (void)setBackGroundVideoLayerWithURL:(NSURL *)url completedHandler:(void (^)(LSOLayer *videoLayer))handler
功能:
? 設置一個背景視頻,背景視頻默認循環;
參數:
? url 背景視頻的路徑
? handler 背景視頻設置完成時的回調
13. - (LSOLayer *)setBackGroundImageLayerWithImage:(UIImage *)image
功能:
? 設置一個背景圖片
14. - (void)removeBackGroundLayer
功能:
? 刪除背景圖層
15. - (LSOLayer *)addVideoLayerWithURL:(NSURL *)url atTime:(CGFloat)startTimeS
功能:
? 增加一個視頻疊加層. 疊加層是在拼接層的上面;
參數:
? url 視頻的Url路徑;
? startTimeS atStartTime 在合成的指定時間開始增加
16. - (LSOLayer *)addImageLayerWithImage:(UIImage *)image atTime:(CGFloat)startTimeS
功能:
? 疊加一張圖片圖層;
參數:
? image 圖片對象
? startTimeS 在播放器中的開始疊加時間
17. - (LSOLayer *)addGifLayerWithURL:(NSURL *)url atTime:(CGFloat)startTimeS
功能:
? 疊加一個gif圖層
參數:
? url gif的完整url路徑
? startTimeS 在播放器中的開始疊加時間
18. - (LSOLayer *)addMVWithColorURL:(NSURL *)colorUrl maskUrl:(NSURL *) maskUrl atTime:(CGFloat)startTimeS
功能:
? 疊加一個透明動畫視頻, 我們的透明動畫是兩個視頻合并而成的. 一個是彩色視頻/一個是黑白視頻;
參數:
? colorUrl 透明動畫視頻中的彩色視頻
? maskUrl 透明動畫視頻中的黑白視頻
? startTimeS 從播放器中的開始疊加時間
19. - (LSOAudioLayer *)addAudioLayerWithURL:(NSURL *)url atTime:(CGFloat)startTimeS
功能:
? 增加一個聲音圖層;
參數:
? url url路徑
? startTimeS 開始時間
20. - (void)removeAudioLayer:(LSOAudioLayer *)audioLayer
功能:
? 刪除聲音圖層
參數:
? audioLayer 聲音圖層對象
21. -(BOOL)setOverlayerLayerPosition:(LSOLayer *)layer index:(int)index
功能:
? 設置疊加層的位置
參數:
? layer 圖層對象
? index 位置, 最里層是0
22. -(BOOL)setConcatLayerPosition:(LSOLayer *)layer index:(int)index
功能:
? 設置拼接層的位置.
參數:
? layer 拼接的圖層
? index 圖層的index, 從前到后, 第一個層是0; 最后面的是: _concatLayerArray.count-1;
23. - (CGSize)updateCompositionRatio:(LSOSizeRatio)ratio
功能:
? 設置合成的比例
參數:
? ratio 設置的比例
24. - (void)prepareConcatLayerAsync:(void (^)(NSArray *layerAray))handler
功能:
? 調用流程是, 在init創建好此對象后, 在需要播放時,調用prepare內部會根據輸入的圖片和視頻數量, 創建好對應的圖層對象, 在這個handler中返回;
25. - (void)insertConcatLayerWithImageArray:(NSArray<UIImage *> *)imageArray completedHandler:(void (^)(NSArray *layerAray))handler
功能:
? 增加拼接圖片圖層; 可以是一張圖片, 或多張圖片
參數:
? imageArray <#imageArray description#>
? handler 返回的layerAray :是當前新增加的圖層對象數組
26. - (void)insertConcatLayerWithArray:(NSArray<NSURL *> *)urlArray atTime:(CGFloat)compTimeS completedHandler:(void (^)(NSArray *layerArray,BOOL insertBefore))handler;
功能:
? 在容器的指定位置增加資源
? 在容器的指定時間點插入, 時間點在圖層前半部分,插入圖層前,反之插入到圖層后
參數:
? urlArray url數組
? compTimeS 在容器的指定時間點插入,
? handle 完成后的回調,是當前新增加的圖層對象數組
27. - (void)insertConcatLayerWitImageArray:(NSArray<UIImage *> *)imageArray atTime:(CGFloat)compTimeS completedHandler:(void (^)(NSArray *layerArray,BOOL insertBefore))handler
功能:
? 在容器的指定位置增加圖片數組
參數:
? imageArray 圖片數組
? compTimeS 指定時間點插入
? handler 完成后的回調,是當前新增加的圖層對象數組
28. - (void)replaceConcatLayerWithLayer:(LSOLayer *)currentLayer replaceUrl:(NSURL *)url completedHandler:(void (^)(LSOLayer *replacedLayer))handler
功能:
? 替換一個圖層
參數:
? currentLayer 當前要替換的圖層
? url 要替換的路徑 NSURL 格式
? handler 替換完成后的回調
29. -(void)splitConcatLayerByTime:(CGFloat)compTimeS layer:(LSOLayer *)layer
功能:
? 分割圖層
參數:
? compTimeS 從容器的相對時間點開始分割
? layer 要分割的圖層對象, 分割后的圖層, 會放到到拼接圖層數組中, 分離后需要更新時間軸
30. -(void)copyConcatLayerByLayer:(LSOLayer *)layer complete:(void(^)(void))completeBlock
功能:
? 復制一個拼接圖層
參數:
? layer 要復制的圖層
? completeBlock 復制完畢后的回調; 復制后的圖層會放到到拼接圖層數組中, 分離后需要更新時間軸
31. -(LSOLayer *)copyVideoLayerByLayer:(LSOLayer *)layer
功能:
? 復制一個圖層
參數:
? layer 復制的圖層對象
32. - (BOOL)removeLayer:(nullable LSOLayer *)layer
功能:
? 刪除一個圖層.
33. - (void)removeLayerArray:(nullable NSArray<LSOLayer *> *)layers
功能:
? 刪除一組圖層
參數:
? layers 圖層數組
34. - (BOOL)removeLayerByCompTime:(CGFloat )compTimeS
功能:
? 根據合成中的一個時間點, 刪除對應的圖層
參數:
? compTimeS 在合成中的時間,單位秒
35. -(LSOLayer *)getCurrentConcatLayerByTime:(CGFloat)compTimeS
功能:
? 根據當前在合成中的時間點, 來獲取一個圖層對象;
? 當前返回的是 LSOLayer對象
36. - (void)applicationDidEnterBackground
功能:
? APP 進入后臺時的回調;
? 當用戶從下向上滑動, 讓整個APP進入后臺的時候,
? 你可以調用整個方法, 讓合成線程進入后臺
37. - (void)applicationDidBecomeActive
功能:
? APP 從后臺恢復時的回調;
? 當用戶從 后臺的狀態下, 恢復到當前界面, 則調用這個APP,恢復合成的運行
38. @property(nullable, nonatomic,copy) UIColor *backgroundColor
功能:
? 設置合成容器的背景顏色
? 當前暫時導出無用
39. -(BOOL)startPreview
功能:
? 播放預覽
40. -(void)pause
功能:
? 暫停
41. -(void)resume
功能:
? 恢復播放
42. - (void)seekToTimeS:(CGFloat)timeS
功能:
? 定位到具體的時間戳;
? 在調用后, 會暫停當前界面的執行;
? 你需要在完成seek后, 調用resume來播放
? 預覽有效
43. @property (readonly) BOOL isRunning
功能:
? 當前是否在運行
44. @property (readonly) BOOL isPausing
功能:
? 是否暫停
45. -(void)startExportWithRatio:(LSOExportSize)ratioType
功能:
? 開始導出
46. @property (readonly) BOOL isExporting
功能:
? 當前是否正在導出
47. -(void)cancel
功能:
? 取消整個合成線程
? 包括預覽和導出, 都取消
48. @property(nonatomic, copy) void(^playProgressBlock)(CGFloat progress,CGFloat percent)
功能:
? 進度回調,
? 當在編碼的時候, 等于當前視頻圖層的視頻播放進度 時間單位是秒;;
? 工作在其他線程,
? 如要工作在主線程,請使用:
progress: 當前正在播放總合成的時間點,單位秒;
percent: 當前總合成的時間點對應轉換為的百分比;
? 進度則是: progress/_duration;
dispatch_async(dispatch_get_main_queue(), ^{
});
49. @property(nonatomic, copy) NSString *_Nullable(^mergeAVBlock)(NSString *video, NSString *audio)
功能:
? 適配ios13的export類問題
50. @property(nonatomic, copy) void(^playCompletionBlock)(void)
功能:
? 在異步線程執行此block; 請用一下代碼后調用;
dispatch_async(dispatch_get_main_queue(), ^{
});
51. @property(nonatomic, copy) void(^exportProgressBlock)(CGFloat progress,CGFloat percent)
功能:
? 導出進度回調;
? 在異步線程執行此block; 請用一下代碼后調用;
dispatch_async(dispatch_get_main_queue(), ^{
});
52. @property(nonatomic, copy) void(^exportCompletionBlock)(NSString *_Nullable dstPath)
功能:
? 編碼完成回調, 完成后返回生成的視頻路徑;
? 注意:生成的dstPath目標文件, 我們不會刪除.
? 在異步線程執行此block; 請用一下代碼后調用;
dispatch_async(dispatch_get_main_queue(), ^{
});
53. @property(nonatomic, copy) void(^userSelectedLayerBlock)(LSOLayer *layer)
功能:
? 當前用戶選中的圖層回調;
? 在異步線程執行此block; 請用一下代碼后調用;
dispatch_async(dispatch_get_main_queue(), ^{
});
54. @property(nonatomic, copy) void(^ _Nullable userTouchDownLayerBlock)(LSOLayer * _Nullable layer)
功能:
? 用戶點擊事件,用戶手指按下.
? 中間不需要增加 dispatch_async(dispatch_get_main_queue()
55.@property(nonatomic, copy) void(^ _Nullable userTouchMoveLayerBlock)(CGPoint point)
功能:
? 用戶移動圖層
56. @property(nonatomic, copy) void(^ _Nullable userTouchScaleLayerBlock)(CGSize size)
功能:
? 用戶縮放圖層事件
57. @property(nonatomic, copy) void(^ _Nullable userTouchRotationLayerBlock)(CGFloat rotation)
功能:
? 用戶旋轉圖層
58. @property(nonatomic, copy) void(^ _Nullable userTouchUpLayerBlock)(void)
功能:
? 用戶手指抬起
59. @property(nonatomic, copy) void(^compositionDurationChangedBlock)(CGFloat durationS)
功能:
? 合成容器時間改變回調;
? 當整個容器的合成時間改變了, 則觸發回調;
? 比如你對視頻做裁剪,則會觸發這里.
? 在異步線程執行此block; 請用一下代碼后調用;
dispatch_async(dispatch_get_main_queue(), ^{
});
60. @property (nonatomic, assign) BOOL disableTouchEvent
功能:
? 禁止圖層的touch事件
2、IOS視頻編輯圖層LSOLayer類說明
1. @property (readonly,assign)CGFloat originalDurationS
功能:
? 素材的原始時長.
? 比如視頻本身的長度, 只讀.不會改變
2. @property (readwrite,assign) CGFloat displayDurationS
功能:
? 當前圖層的顯示時長;
? 在沒有裁剪時后變速等操作時, 等于原始時長
3. @property (nonatomic,readonly) CGSize originalSize
功能:
? 輸入資源的原始大小
4. @property (nonatomic,readonly) CGSize layerSize
功能:
? 圖層在容器中的大小.
? 視頻放到容器中后, 默認是對齊到邊緣的,故圖層大小會變;
? 視頻默認對齊到播放器的邊緣. 圖片居中顯示
5. @property (readwrite,assign) BOOL looping
功能:
? 疊加圖層是否循環播放;
? 拼接圖層設置后無效
6. @property(getter=isHidden) BOOL hidden
功能:
? 當前圖層是否隱藏,
? 可以用這個在新創建的圖層做隱藏/顯示的效果, 類似閃爍, 或創建好,暫時不顯示等效果
7. @property (readwrite, nonatomic) CGFloat rotateAngle
功能:
? 角度值0--360度. 默認為0.0
? 順時針旋轉
8. @property (readwrite, nonatomic) CGPoint centerPoint
功能:
? 設置或讀取 <當前圖層的中心點>在容器中的坐標;
? 容器坐標的左上角是左上角為0,0. 從上到下 是Y軸, 從左到右是X軸;
? 當一個圖層增加到容器中, 則默認是:
positionX=drawPadSize.width/2;
positionY=drawPadSize.height/2;
9. @property (readwrite,nonatomic) LSOPositionType positionType
功能:
? 設置當前位置,枚舉類型.
? 我們舉例了常見的位置枚舉類型:
? 上下左右/左上/左下/右上/右下/居中, 如果這些類型不滿足您的需求, 可以通過centerPoint來設置每個素材的位置
10. @property (readwrite,nonatomic) LSOScaleType scaleType
功能:
? 縮放的枚舉類型;
? kLSOScaleNONE: 無縮放形式.則內部會根據不同的素材,采用默認形式;
? kLSOScaleOriginal: 原始大小 直接放入, 不做任意處理;
? kLSOScaleFillComposition: 忽略百分比,把寬度等于容器的寬度, 高度等于容器的高度,填滿整個容器.
? kLSOScaleCropFillComposition: 匹配放入到容器中,等比例填滿整個容器, 把多的部分顯示到容器的外面去;
? kLSOScaleVideoScale:視頻縮放模式,如果視頻寬度大于高度, 則寬度和容器對齊, 然后等比例調整高度,反之亦然
? 如果以上不滿足您的需求, 則可以 scaleSize 設置具體縮放到的大小
11. @property (readwrite, nonatomic) CGSize scaleSize
功能:
? 把圖層縮放到指定的大小;
? 以像素為單位
12. @property (readwrite, nonatomic) CGSize scaleSizeInView
功能:
? 以顯示窗口為單位, 縮放大小, 此寬高是相對于LSODisplayView而言;
? 預覽時有效
13. @property (readonly, nonatomic) CGSize layerSizeInView
功能:
? 以顯示窗口為單位, 獲取圖層的寬高;
? 預覽時有效
14. @property (readonly, nonatomic) BOOL isConcatImageLayer
功能:
? 是否是拼接圖片層
15. @property (readonly, nonatomic) BOOL isConcatVideoLayer
功能:
? 是否拼接視頻層
16. @property (readonly, nonatomic) BOOL isVideoLayer
功能:
? 是否是疊加的視頻層
17. @property (readonly, nonatomic) BOOL isMVLayer
功能:
? 是否是疊加的mv透明動畫層
18. @property (readonly, nonatomic) BOOL isImageLayer
功能:
? 是否是圖片層
19. @property (readonly, nonatomic) BOOL isGifLayer
功能:
? 是否是Gif圖層
20. @property (readonly, nonatomic) BOOL isImageArrayLayer
功能:
? 是否是圖片數組圖層
21. @property(readwrite,assign) CGFloat startTimeOfComp
功能:
? 在播放器中的開始時間, 只工作在疊加的一些圖層,比如疊加的圖片/視頻等
22. @property (readwrite, nonatomic) BOOL isConvertScalePosition
功能:
? 是否把縮放和位置的參數轉換;
? 默認是不轉換
23. @property (nonatomic,assign)BOOL mirrorDrawX
功能:
? 在繪制的時候, 橫向圖像鏡像, 左邊的在右邊, 右邊的在左邊
24. @property (nonatomic,assign)BOOL mirrorDrawY
功能:
? 豎向圖像鏡像, 上面的放下面, 下面的放上面. 默認不調整
25. @property(readwrite, nonatomic) CGFloat opacityPercent
功能:
? 不透明度.
? 默認是1.0; 完全透明是0.0
26. @property (readwrite,assign) CGFloat cutStartTimeS
功能:
? 裁剪時長的開始時間
? 相對于原視頻的時間而言;
? 僅對視頻有效
27. @property (readwrite,assign) CGFloat cutEndTimeS
功能:
? 裁剪時長的結束時間;
? 僅對視頻有效
28. -(void)addKeyFrameAtCompTime:(CGFloat)compTimeS
功能:
? 添加關鍵幀
29. -(void)removeKeyFrameWithCompTime:(CGFloat)compTimeS
功能:
? 刪除關鍵幀
30. -(void)removeAllKeyframe
功能:
? 刪除所有關鍵幀
31. @property (readwrite, assign) CGFloat brightnessPercent
功能:
? 調節亮度的百分比.
? 這里的百分比是兩倍的關系,范圍是 0--2.0; 其中 1.0 是默認值,
? 0---1.0是調小;
? 1.0 是默認,
? 1.0---2.0 是調大;
? 如要關閉,則調整為 1.0.默認是關閉
32. @property (readwrite, assign) CGFloat contrastFilterPercent
功能:
? 調節對比度的百分比.
? 這里的百分比是兩倍的關系,范圍是 0--2.0; 其中 1.0 是默認值,
? 0---1.0是調小;
? 1.0 是默認,
? 1.0---2.0 是調大;
? 如要關閉,則調整為 1.0.默認是關閉
33. @property (readwrite, assign) CGFloat saturationFilterPercent
功能:
? 調節飽和度的百分比.
? 這里的百分比是兩倍的關系,范圍是 0--2.0; 其中 1.0 是默認值,
? 0---1.0是調小;
? 1.0 是默認
? 1.0---2.0 是調大;
? 如要關閉,則調整為 1.0.默認是關閉
34. @property (readwrite, assign) CGFloat sharpFilterPercent
功能:
? 調節銳化的百分比.
? 這里的百分比是兩倍的關系,范圍是 0--2.0; 其中 1.0 是默認值,
? 0---1.0是調小;
? 1.0 是默認,
? 1.0---2.0 是調大;
? 如要關閉,則調整為 1.0.默認是關閉;
35. @property (readwrite, assign) CGFloat whiteBalanceFilterPercent
功能:
? 調節色溫的百分比.
? 這里的百分比是兩倍的關系,范圍是 0--2.0; 其中 1.0 是默認值,
? 0---1.0是調小;
? 1.0 是默認,
? 1.0---2.0 是調大;
? 如要關閉,則調整為 1.0.默認是關閉
36. @property (readwrite, assign) CGFloat hueFilterPercent
功能:
? 調節色調的百分比.
? 這里的百分比是兩倍的關系,范圍是 0--2.0; 其中 1.0 是默認值,
? 0---1.0是調小;
? 1.0 是默認,
? 1.0---2.0 是調大;
? 如要關閉,則調整為 1.0.默認是關閉
37. @property (readwrite, assign) CGFloat exposurePercent
功能:
? 調節曝光度的百分比.
? 這里的百分比是兩倍的關系,范圍是 0--2.0; 其中 1.0 是默認值,
? 0---1.0是調小;
? 1.0 是默認,
? 1.0---2.0 是調大;
? 如要關閉,則調整為 1.0.默認是關閉
38. @property(readwrite, nonatomic) CGRect mosaicRect1InView
功能:
? 馬賽克區域:
? xy以左上角開始, 左上角是0.0,0.0;
? 寬度是一個百分比, 最大是 1.0;
? 高度是 一個百分比. 最大是1.0;
? 你實時傳遞過來的寬高和坐標, 除以當前圖層的寬高,轉換為百分比后設置過來,
? 寬高坐標可以通過getCurrentRectInView 獲取到當前圖層在compositionView中的位置;
? 我們舉例最大4個馬賽克區域;如果你需要更多的馬賽克區域, 則用LSOMosaicRectFilter執行增加;
? 預覽時有效
39. @property (readwrite,nonatomic) CGFloat beautyLevel
功能:
? 設置美顏,
? 范圍是0.0---1.0; 0.0是關閉美顏; 默認是0.0;
40. @property (nonatomic,nullable, copy)LanSongFilter *filter
功能:
? 設置一個濾鏡, 設置后, 之前增加的濾鏡將全面清空.
? 類似濾鏡一個一個的切換.新設置一個, 會覆蓋上一個濾鏡.
? 如果濾鏡是無, 或清除之前的濾鏡, 這里填nil;
41. -(void)addFilter:(nullable LanSongFilter *)filter
功能:
? 增加一個濾鏡,
? 增加后, 會在上一個濾鏡的后面增加一個新的濾鏡.
? 是級聯的效果
? 源圖像--->濾鏡1--->濾鏡2--->濾鏡3--->移動旋轉縮放透明遮罩處理--->與別的圖層做混合;
42. -(void)removeFilter:(nullable LanSongFilter *)filter
功能:
? 刪除一個濾鏡
43. -(void)removeAllFilter
功能:
? 刪除所有濾鏡
44. @property (nonatomic, assign)CGFloat audioVolume
功能:
? 調節素材中的音頻音量.
? 如果素材有音量,則設置, 如果沒有音量,則無效;
? 范圍是0.0---8.0;
? 1.0是原始音量; 大于1.0,是放大; 小于1.0是減低, 如果降低建議是0.1;
? 如果是0.0則無聲,
45. @property (readwrite, assign) CGFloat volumeFadeOutDurationS
功能:
? 音量淡出時長設置/獲取;
? 默認是0.0,無淡出效果;
? 最大為當前有效時長的1/3;
46. @property (readwrite, assign) CGFloat volumeFadeInDurationS
功能:
? 音量淡入時長設置/獲取;
? 默認是0.0,無淡入效果;
? 最大為當前有效時長的1/3;
47. @property (nonatomic, assign)CGFloat videoSpeed
功能:
? 視頻的播放速度;
? 范圍是 0.1---10.0
? 默認1.0; 正常播放;
? 建議的設置參數是:
? 變慢: 0.1, 0.2, 0.4, 0.6,0.8
? 變快: 2.0, 3.0, 4.0, 6.0,8.0;
? 當前僅是畫面變速, 變速過程中暫時無聲音;
48. -(void)setVideoReverseAsync:(BOOL)isReverse asyncHandler:(void (^)(CGFloat percent, BOOL finish))handler
功能:
? 給視頻圖層設置倒序
? 異步是因為: 在視頻第一次倒序的時候, 有一個異步預處理的過程;
? percent:預處理百分比: 0---1.0;
? 當前暫時不支持聲音倒序. 在倒序時, 默認音量為0;
? 調用此方法,會先觸發容器暫停;
? 在異步線程執行此block; 請在一下代碼里調用;
dispatch_async(dispatch_get_main_queue(), ^{
});
49. - (void)cancelVideoReverse
功能:
? 取消正在執行的視頻倒序功能
50. @property(nonatomic, readonly)BOOL isReverse
功能:
? 當前是否在倒序狀態
51. - (void)getThumbnailAsyncWithHandler:(void (^)(UIImage *image, BOOL finish))handler
功能:
? 異步獲取當前縮略圖;
? 當前是每秒鐘獲取一幀;, 一幀寬高最大是100x100;
參數:
? image 是獲取到的每一張縮略圖;
? finish是 是否獲取完畢;
? 獲取的縮略圖的高度是192像素,高度是192,返回所有圖片的寬度總和是 當前要顯示時長乘以192;
? 比如當前圖層顯示時長是6.2秒; 則返回的縮略圖是 6張192x192的圖片和一張 38x192 (38=192*0.2);
52. - (void)getOriginalThumbnailAsyncwithCount:(int)count handler:(void (^)(UIImage *image, BOOL finish))handler
功能:
? 獲取原視頻的縮略圖;
? 從原視頻的 第0秒,到最后; 返回的所有圖片都是192x192像素大小;
參數:
? count 要獲取的張數 , 如果不清楚獲取幾張圖片, 則用(int)originalDurationS;
? handler 獲取的異步回調;
53. - (void)getThumbnailAsyncWithDuration:(CGFloat)durationS handler:(void (^)(UIImage *image, BOOL finish))handler
功能:
? 獲取指定時長的縮略圖;
? 從當前裁剪的開始時間,計算, 每秒鐘返回一幀, 一幀的寬高是192
參數:
? durationS 要的時長
? handler 異步回調;
54. @property (readonly,assign) CGFloat thumbnailDisplayTimeS
功能:
? 縮略圖的顯示時間
55. @property(nonatomic, readwrite) NSMutableArray<UIImage *> *thumbImageArray
功能:
? 在你第一次調用過getThumbnailAsyncWithHandler后. 內部會保存到這個屬性中.
? 在下次獲取的時候, 則可以直接讀取;
56. @property (nonatomic, assign)BOOL touchEnable
功能:
? 當前圖層是否需要touch事件;
? 默認是需要的;
57. @property (nonatomic, assign) CGFloat backGroundBlurLevel
功能:
? 背景虛化值.
? 設置為0,取消背景;
58. - (void)resetLayerLayout
功能:
? 把圖層恢復到剛增加時的位置和大小
59. -(BOOL)isDisplay
功能:
? 當前圖層是否在顯示狀態
60. - (LSOAnimation *) addAnimationWithJsonPath:(NSString *)jsonPath atCompS:(CGFloat) atCompS
功能:
? 用AE的json形式增加一個動畫
參數:
? jsonPath 動畫文件
? atCompS 從播放器的什么位置增加
61. - (LSOAnimation *) setAnimationAtLayerHead:(NSString *)jsonPath
功能:
? 在圖層的頭部增加一個動畫
參數:
? jsonPath 動畫文件,json格式
62. - (LSOAnimation *) setAnimationAtLayerEnd:(NSString *)jsonPath
功能:
? 在圖層的尾部增加一個動畫
參數:
? jsonPath 動畫文件, json格式
63. - (void)removeAnimation:(LSOAnimation *)animation
功能:
? 刪除一個動畫
參數:
? animation 動畫對象,在addAnimation的時候增加的
64. - (void)removeAllAnimationArray
功能:
? 刪除所有動畫
65. - (NSMutableArray *)getAllAnimationArray
功能:
? 獲取所有的動畫對象數組
66. -(BOOL) playAnimation:(LSOAnimation *)animation
功能:
? 預覽一個動畫
參數:
? animation 預覽會從動畫的開始時間點,播放到結束時間點
67. - (LSOEffect *) addEffectWithJsonPath:(NSString *)jsonPath atCompS:(CGFloat) atCompS
功能:
? 用AE的json文件形式在指定時間點增加一個特效
參數:
? jsonPath 特效的json
? atCompS 從容器的指定時間點
68. - (LSOEffect *) addEffectWithJsonAtLayerHead:(NSString *)jsonPath
功能:
? 在圖層的頭部增加一個特效
參數:
? jsonPath 特效的json文件
69. - (LSOEffect *) addEffectWithJsonAtLayerEnd:(NSString *)jsonPath
功能:
? 在圖層的尾部增加一個特效
參數:
? jsonPath 特效的json文件
70. - (void)removeEffect:(LSOEffect *)effec
功能:
? 刪除一個特效,
參數:
? effect 特效對象,從addEffectXXX得到的特效對象
71. - (void)removeAllEffectArray
功能:
? 刪除所有的特效
72. -(BOOL) playEffect:(LSOEffect *)effect
功能:
? 預覽一個特效
參數:
? effect 預覽會從特效的開始時間點,播放到結束時間點
73. - (NSMutableArray *)getAllEffectArray
功能:
? 獲取所有的特效對象數組
74. @property(readwrite, assign)NSURL *transitionJsonUrl
功能:
? 設置轉場的動畫路徑, json格式;
? 可通過這個獲取是否設置了轉場; 如果要取消轉場;則這里等于nil;
? 設置后, 默認轉場時間為1秒;
75. - (void)setMGTransitionWithColorUrl:(NSURL *)colorUrl maskUrl:(NSURL *)maskUrl
功能:
? 增加mg轉場動畫
76. @property(readwrite, assign)CGFloat transitionDurationS
功能:
? 設置或獲取轉場時間
? 在設置轉場后有效;
? 時間范圍是0---5.0秒;
? 如轉場時間 大于圖層時間, 則等于圖層時間;
? 可以通過轉場時間,判斷當前圖層是否有轉場功能;
77. @property(readonly, nonatomic)CGFloat transitionMaxDurationS
功能:
? 轉場可設置的最大值;
? 只能獲取;
? 最大值等于, 當前圖層的1/3 和下一個圖層時長的1/3 和3秒 的最小值;
78. @property(readonly, nonatomic)BOOL isAddTransition
功能:
? 是否增加了轉場
79. - (BOOL)playTransition
功能:
? 預覽轉場;
? 你需要在設置轉場后調用才有效;
80. - (void)cancelTransition
功能:
? 取消轉場
81. @property (nonatomic, readonly) CGFloat transitionStartTimeOfCompS
功能:
? 轉場相對于播放器的開始時間
82. @property (readwrite,nonatomic)NSURL *videoURL
功能:
? 如果是拼接的是視頻, 或疊加的是視頻, 則可以獲取到videoURL路徑
83. @property (readwrite,nonatomic)UIImage *uiImage
功能:
? 拼接或疊加一張圖片時, 增加的圖片對象
84. @property (readonly, nonatomic, nullable) NSURL *reverseVideoUrl
功能:
? 獲取倒序的視頻路徑;
? 在設置倒序,并倒序完成后獲取;
? 在容器釋放或 圖層釋放后, 內部會刪除;
四、AE模版SDK
4.1、模板素材類:LSOAexAeModule 和LSOAexImage
LSOAexModule類是用來設置一個模板的各種素材,比如一個模板在導出時會導出背景視頻文件,透明mv視頻, 聲音等其他素材,加載后你會得到這個模板的寬度,高度, 可替換圖片數量,以及每張圖片的開始時間和 圖片顯示時長。 lsoaeximage就是圖片類,我們已經在解析時,對每張圖片按照時間出現的先后順序做了排序,你獲取的第1個索引,就是最先顯示的圖片,你要替換視頻圖片為視頻或圖片則調用updapath,你可以在開始時間調用,也可以在模板加入到預覽播放器中調用; 替換時有一個option選項,當前支持設置縮放形式和開始時間,option的枚舉縮放,支持裁剪到全屏、完整縮放, 視頻類型縮放;updatePath替換返回布爾類型,表示替換成功或失敗。 可多次調用。 如果是視頻則可以通過getThumbnailAsync異步獲取需要的縮略圖。
4.2、AE播放類:LSOAexplayerView
用來播放一個AE模板(LSOAexModule), 支持播放進度回調、播放完成回調,導出進度回調,導出完畢回調、定位到時間,定位到AexImage, 暫停pause、恢復resume,開始播放,開始導出, 有執行錯誤回調, 播放的AexImage改變回調,并支持手勢,當點擊播放畫面時,會返回用戶當前點擊了哪個LSOAexImage。當用戶在播放過程中要替換素材時, 可通過AexImage的updatePath方法替換, iOS需要在調用updateWithUrl后另外再執行aexComposition的updateAexImage;我們內部檢查到你替換后,會顯示替換后的畫面,并渲染到當前module中。 iOS版本的API 是:LSOAexComposition和LSOAexDisplayView兩個類組成, 一個是合成,一個是播放窗口。
4.3、手勢說明:
在播放中,當用戶手指點擊畫面時,播放器會暫停,并返回給你用戶選中的AexImage對象,可直接更改AexImage中的視頻或圖片,更改后,播放器會相應的播放替換后的視頻或圖片。 當用戶圖片或視頻寬高不等于AE模板中的圖片寬高時, 在替換時,默認會根據option的縮放類型做縮放,并從畫面中心顯示; 在用戶點擊播放畫面時, 可單指移動調整要顯示畫面的哪部分,也可以雙指縮放和旋轉來調整顯示的畫面, 調整后的畫面就是最終要生成的畫面。如果你兩個圖片在AE制作時是重疊的, 有可能點擊圖片的時候, 會選中另一張圖片,而非你要的圖片,建議在制作時不要重疊(下一個版本會做進一步的優化)。
4.4、AexImage的改變回調方法說明:
我們內部是查找哪個aexImage的開始時間點 和當前時間的差值最小, 而返回哪個aexImage, 如果你多個圖片在時間點上是重疊的, 有可能返回的aexImage不是你要的結果,這是正常情況,可和AE設計師商量如何避免
五、人像分割SDK
5.1、IOS的人像分割用到的庫
庫:
- tnn.framework
- TenLineSegmnetFramework.framework
- 說明: 拖動到Build Phases的 Link Binary中.
模型:
- 模型文件:TEN_LINE_IOS.MODEL
- 協議文件: TEN_LINE_IOS.MODEOPROTO
- TNN : tnn.metallib
- 說明: 拖動到工程里,在Build Phases中可以找到即可.
需要依賴系統的庫:
- Accelerate.framework (重要)
- CoreML.framework (重要)
- Metal.framework (重要)
- CoreMedia.framework
- CoreGraphics.framework
- libc++.tbd
- UIKit.framework
- AVFoundation.framework
- Foundation.framework
- 說明:以上庫加入一次即可.、
調用
- 三個方法:
唯一類:TLAPISegment
/// 初始化模型
/// @param modelPath model的路徑
/// @param protoPath 協議的路徑
- (instancetype)initWithModelPath:(NSString *)modelPath protoPath:(NSString *)protoPath;
/// 分割一幀畫面
/// @param image_buffer 原始的數據,
/// @param callback 分割完畢后的回調, 回調工作在UI線程;
- (void)segmentPixelBuffer:(CVPixelBufferRef)image_buffer callback:(segmentCallback2)callback;
/// 釋放模型
- (void)relaseLSO;
5.2、不用人像分割,可刪除的文件
Android:
- assets下的tenlinev2.model
- jniLibs/arm64-v8a下的libTenLineJni.so
- jniLibs/armeabi-v7a下的libTenLineJni.so
IOS:
- tnn.framework
- TenLineSegmnetFramework.framework
- tnn.metallib
- TEN_LINE_IOS.MODEL
- TEN_LINE_IOS.MODEOPROTO
- TenLineFast_ios.MODEL
- TenLineFast_ios.MODELPROTO
六、Android端錯誤代碼
6.1、錯誤碼:1200
編碼配置錯誤.
一般是當前設備不支持編碼分辨率,或編碼碼率導致.
SDK內部用的是MediaCodec編碼,
如果分辨率設置超過了MediaCodec的范圍, 則拋出此錯誤信息.
6.2、錯誤碼:1201
編碼配置錯誤.
一般是當前設備不支持編碼分辨率,或編碼碼率導致. SDK內部用的是MediaCodec編碼, 如果分辨率設置超過了MediaCodec的范圍,則拋出此錯誤信息.
6.3、錯誤碼:1202
GPU執行錯誤.
6.4、錯誤碼:1203
編碼器在編碼一幀完成后的, 引出數據時發生錯誤.
6.5、錯誤碼:1204
SDK的授權文件錯誤.
可能是SDK過期, 或applicationID 和授權文件中的不一致, 或超出了使用時間.
6.6、錯誤碼:1205
渲染的surface錯誤.
常見為:沒有設置surface或surface已經被釋放
6.7、錯誤碼:1206
容器寬高設置過低的錯誤.
分辨率設置小于320x320,則會拋出此錯誤信息
6.8、錯誤碼:1207
當前圖層錯誤.
建議拿到錯誤信息日志后,分析是哪里的問題.