藍松短視頻SDK開發手冊

一、藍松SDK組成

  1. 藍松SDK包含了視頻編輯SDK和AE模版SDK
  2. 此文檔基于藍松SDK4.5.8版本編輯
  3. 文檔更新說明:
序號 文檔更新內容 時間
1 更新Android、IOS的API說明 20210114
2 更新人像分割SDK庫說明 20210519
3 增加Android端錯誤代碼解釋 20210716

二、SDK集成和單位說明

2.1、Android端

  1. 我們的SDK以module的形式提供, 在你的項目中點擊File/import midule導入,并在您主module中的build.gradle中增加implementation project(':LanSongSDK')(如果是更新SDK, 則先刪除當前的module,,并屏蔽build.gradle中的字段, 然后在import導入,再打開屏蔽)
  2. LanSongSDK module下的assets下有LanSongIFxxx開頭濾鏡用到的各種圖片資源, 如您項目沒有用到LanSongIFxxx開頭的濾鏡,則可以刪除。
  3. 其他的代碼,各種資源,各種視頻素材等均為演示所用,不屬于sdk的一部分。
  4. 代碼使用
1. LanSoEditor.initSDK(getApplicationContext(), null); 
// 初始化SDK.[必須] (null,APP名字一定是我們demo名字)
2. LanSoEditor.setTempFileDir();
//設置SDK處理過程中的臨時文件緩存路徑,也是我們容器最終生成視頻的路徑, 您可以設置生成視頻名字的前后綴. 此代碼是公開的, 您點擊后會看到更多注釋 [可選]
3. LanSoEditor.setSDKLogOutListener 
//設置日志輸出監聽 [可選].

2.2、IOS端

  1. 拖動LanSongEditorFramework.framework到你的項目中, 并在工程的Build Phases標簽頁的Link Binary With Libraries中把我們的framework放到最上面.
  2. 在Build Phases的<Link Binary With Libraries>中增加libz.tbd , libbz2.tbd, libc++.tbd, libiconv.tbd
  3. 在你代碼中包括頭文件: #import <LanSongEditorFramework/ LanSongEditor.h>
  4. LanSongEditorBundle.bundle 是我們sdk中 以LanSongIFxxx開頭用到的一些濾鏡圖片,如果沒用到LanSongIFxxx開頭的濾鏡,則不用增加此文件。如用到則把LanSongEditorBundle.bundle 拖動到你項目的 copy Bundle Resources中
  5. 其他的代碼,各種資源,各種視頻素材等均為演示所用,不屬于sdk的一部分。
  6. 代碼使用
初始化
 1. 增加頭文件
   #import <LanSongEditorFramework/LanSongEditor.h>
 2. 在您程序剛開始的地方初始化我們的SDK:
       [LanSongEditor initSDK:nil]
       //初始化SDK [必須] (nil,APP名字一定是我們demo名字)

2.3、時間單位

Android

IOS


三、視頻編輯SDK

3.1、SDK中用到的名字解釋

1.composition: 合成, 是一個容器, 用來存放各種素材的容器, 縮寫是: compXXX, 比如compDurationUs, 則表示合成的時長,單位是微秒(Us)

2.original: 原始的, cut:時間裁剪; duration:時長;

3.2、合成容器:ConcatComposition

  1. 字面意思是:拼接合成.是以圖片和視頻的拼接的總時長作為最終導出視頻的時長, 容器有3大層, 分別是:背景圖層 , 拼接類圖層 , 疊加類圖層.
  2. 背景層: 給容器整體增加一個背景圖層, 支持:顏色背景, 圖片背景, 如果你要給不同的圖層設置不同的背景,則可以用圖層的畫布/背景功能來分別設置.
  3. 拼接層: 把用戶選中的圖片和視頻前后拼接在一起,是前后疊加. 可以在開始前增加, 也可以做預覽過程中插入, 可以指定時間點插入, 可復制, 可刪除, 可調節每個圖層的前后位置, 支持手勢調節, 支持圖層的各種方法.
  4. 疊加類圖層: 在拼接層上面,疊加多個其他圖層, 是上下疊加. 比如疊加水印, 疊加文字, 疊加動畫等等這些稱之為疊加類型的圖層, 圖層可調節上下位置, 可設置顯示開始時間點, 可設置顯示時長;可疊加, 可刪除, 支持手勢,旋轉移動縮放濾鏡馬賽克等等, 可執行父類圖層的所有方法.
  5. 這些API 的關鍵詞是: 在LSOConcatCompositionView中;, 拼接:(concat), 疊加:(overLay), 背景(backGround).

3.3、視頻和圖片的混合編輯

  1. 當前大部分視頻編輯是拼接編輯, 比如您選中了幾個視頻和幾個圖片, 則是視頻和圖片混合的前后拼接合成的編輯.
  2. 可以是單個視頻, 也可以是多個視頻, 也可以是一張圖片或多種圖片, 或者圖片和視頻混合編輯.
  3. 視頻增加后,當前默認是整個視頻時長增加進去, 增加后, 你可以設置視頻時長, 容器的總時長會改變, 得到圖層對象,可執行圖層的各種方法.
  4. 圖片增加后, 默認每張圖片顯示3秒, 可調節顯示時長, 可復制,刪除,插入圖片, 拼接圖片不可以循環, 得到圖層對象,可執行圖層的各種方法.
  5. 如果設置了轉場,則前一個層和后一層有部分畫面是重疊, 重疊時間可設置. 設置轉場后,
  6. 最終容器的總長度是各個圖片和視頻的長度之和 ,如果有轉場或視頻變速,則對應的時長會改變.

3.4、圖層之--時間調節

  1. 素材本身的的時長. 比如視頻時長,聲音時長, 圖片在放入后, 默認是顯示3秒; 圖片序列和gif等是其本身的時長; 這個時長是素材本身的, 我們稱之為AssetDuration 是資源時長, 只能讀取,不能修改, 但你可以修改素材在容器中的顯示時間和從什么時間點開始顯示;
  2. 可以修改的有: 素材在容器中的顯示時間點, 是否循環, 顯示時長, 如果循環,則會從顯示時間點開始, 一直循環到整個容器尾部, 時間可以實時設置, 實時調節, 實時獲取,當顯示時長改變后, 如果你要獲取對應的縮略圖,則縮略圖中圖片數組也會相應的改變;
  3. 如果是視頻素材, 則支持裁剪視頻長度, 兩個方法是: setCutStartTime和 setCutEndTime,從視頻的什么時間開始裁剪,和裁剪到什么地方; 視頻裁剪當前沒有約束, 但建議你最小裁剪值是1秒;
  4. 這些API的名字是:資源時長(assetDuration), 當前圖層的顯示時長( displayDuration), 從容器的什么時間點開始顯示:(startTimeOfComp);

3.5、圖層之--手勢 + 移動/縮放/旋轉

  1. 容器在創建時設置了寬度和高度, 素材增加進去后, 會默認放到容器的中間, 即容器的寬度/2和高度/2.
  2. 每增加一個素材, 會得到一個圖層對象, 圖層都支持用手指直接操作屏幕 來完成 移動縮放旋轉的touch事件,, 你可以單指移動, 雙指縮放和旋轉; 當選中一個圖層時, 它的周邊會出現一個紅色的方框, 表示選中當前圖層, 為了避免在操作時誤觸別的圖層, 你可以把別的圖層鎖定, 我們提供豐富的API讓你設置或獲取相關的坐標, 我們甚至定義了一個類LSORect來讓你獲取相對應當前預覽窗的相對坐標 和 相對于容器中的絕對坐標.
  3. 我們另外定義了各種常見的枚舉類型, 比如4種縮放類型, 和上/下/左/右/中/左上/左下/右上/右下這9個位置點供您選擇; 提供縮放系數, 縮放到實際大小,設置具體位置, 相對屏幕位置等.
  4. 如果你要用代碼的形式設置, 則設置的位置是當前圖層中心點的位置. 可以縮放到指定大小, 旋轉則0度則是正上方為0點, 角度是任意角度, 比如設置為-100度, -400度, 或370度, 540度等等.
  5. 這些API的關鍵詞是: 縮放大小(scaleSize), 縮放類型(scaleType) , 縮放系數(scaleFactor), 位置類型( positionType) , 位置中心點(centerPoint), 位置相對預覽窗口坐標(positionInView), 旋轉 (rotation), setTouchEnable , xxxInView( 是以當前預覽為單位的寬高和位置;)

3.6、圖層之--貼紙/水印/文字

  1. 貼紙, 水印, 文字, 在我們圖層處理架構里, 是以圖像的形式呈現的, 因為手機GPU處理的是圖像, 貼紙, 水印, 文字在底層是一個意思, 認為是一個圖像或一組連續的圖像做處理.
  2. 文字在SDK內部會各種轉換方法, 讓你方便的以文字圖層操作, 操作完畢后底層會轉換為圖像來處理,如果我們提供的繪制文字不夠詳細, 你也可以自己繪制,然后轉換為圖片或圖片數組,設置到容器中.
  3. 貼紙和水印是一個意思,我們提供了單個圖片的圖層,多張聯系圖片組成的圖層, Gif圖層等, 這些你可以方便的設置, 可以設置一個,也可以設置多個.
  4. 圖層的增加是通過容器Composition的方法實現的, 增加后, 得到對應的圖層對象;
  5. 這些API 的關鍵詞是: android的圖片圖層(BitmapLayer) , android的圖片序列圖層(BitmapListLayer), ios的圖片圖層(ImageLayer), ios的圖片序列圖層(ImageListLayer), Gif圖層.

3.7、圖層之--顏色調節/濾鏡/美顏

  1. 濾鏡是對圖層的畫面做調節, 和圖層的縮放移動一樣是圖層的一個屬性, 顏色調節和濾鏡和美顏, 都是濾鏡的不同效果. 當前我們的美顏是僅對整體畫面做磨皮和美白處理,沒有做臉識別后的各種功能.
  2. 當前支持的顏色調節包括: 亮度/ 對比度/ 飽和度/ 銳化/色溫/白平衡/色調/曝光度
  3. 當前支持80種濾鏡, 包括常見的17種濾鏡,當前建議你使用這17種濾鏡, 這些濾鏡在我們demo里可以看到.
  4. 這些API 的關鍵詞是: 設置濾鏡(setFilter,設置會把上一個替換掉),增加濾鏡(addFilter), 移出濾鏡(removeFilter),刪除所有濾鏡(removeAllFilter);

3.8、圖層之--轉場設置

  1. 轉場是兩個素材前后拼接時播放時的一種過渡效果, 比如上一段淡淡的消失, 下一段逐漸出現等.
  2. 當前的轉場是AE設計師在PC端用after Effect 設置好的, 然后按照我們的格式,導出為json文檔,SDK還原出來在PC端設計的效果. 這樣的好處是: 開發人員不用自己用代碼實現各種效果,只需要根據不同的效果,把對應的json送到SDK中, SDK就實現了這樣的效果, 簡單高效, 并可以做到Android和ios的統一.
  3. PC端用Ae軟件制作規范: 用一張小于等于544x960的圖片創建一個合成, 然后對其做旋轉縮放透明處理, 形成動畫; 或對其做mask遮罩處理,形成動畫; 當前不支持同時做旋轉縮放透明+ mask的效果; 合成的分辨率應小于等于544x960, 時長建議不大于3秒, 以實際效果為準;
  4. 當前支持各種遮罩轉場和基礎的移動旋轉縮放轉場; 轉場設置是通過每個具體的圖層設置的, 比如有圖層ABC3個, 要在AB之前增加轉場,則設置A的transition; 要給BC之間加轉場,則設置B的transition;
  5. 轉場的時間可以設置,默認在是設置路徑后, 會默認是1秒鐘, 最大可設置為5秒鐘; 當前僅支持遮罩轉場, 即各種形式的透明.
  6. 這些API 的關鍵詞是:轉場(transition); 設置轉場時間:(transitionDuration) , 播放轉場(playTransition), 取消(cancelTransition);
  7. 執行步驟是: 你需要先設置轉場路徑, 設置后,默認轉場時間是1秒鐘, 如需預覽,則playtransition; 調用cancelTransition取消轉場; 在設置路徑后, 你可以設置轉場時間; 設置后, 如需要播放則playTransition; 如果你要應用到全局,則需要把一個json文件循環設置到每個圖層對象; 我們內部會共用同一個json內容;

3.9、圖層之--入場動畫/出場動畫/指定時間點動畫

  1. 入場動畫, 出場動畫, 和轉場一樣, 也是Ae設計師在PC端設計好后, 導出為json,送入到SDK中. SDK解析還原出對應的效果.
  2. PC端用Ae軟件制作動畫規范: 用一張小于等于544x960的圖片創建一個合成, 然后對其做旋轉縮放透明處理, 形成動畫; 或對其做mask遮罩處理,形成動畫; 合成的分辨率應小于等于544x960, 時長建議不大于3秒, , 以實際效果為準; 如果是旋轉縮放透明則幀率建議是40, 若是mask遮罩,則幀率建議25.
  3. 因入場動畫和出場動畫從技術上講,僅僅是插入到圖層的時間點不同,SDK可以設置開始從圖層的哪個時間點開始, 當前入場動畫默認是0, 出場動畫默認最后json的時間時長; 你可以調節這個出入場的持續時間, 持續時間調節后, 會把調節后的時長作為整個動畫走完的時間, 如果你設置的短,則動畫走的快; 如果設置的長,則動畫走的慢; 入場動畫和出場動畫是setXXX的方式, 每次設置后, 會把之前的動畫移出;同一時刻只能有一個入場或出場動畫.
  4. 指定時間點動畫, 是你可以指定一個時間點增加動畫, 可以實時設置開始時間點,也可以設置動畫時長, 可以增加多個, 每個素材最大支持20個動畫。在每次設置后, 可預覽或移除.
  5. 這些API的關鍵詞是: 動畫:(Animation) ; 入場動畫/出場動畫:(setAnimationAtLayerHead/End), 指定時間點動畫:(addAnimationAtCompTimeUs)預覽動畫 playAnimation; 移除removeAnimation.
  6. 執行步驟是: 增加json文件, 會得到LSOAnimation對象,用這個對象可以playAnimation來預覽; removeAnimation刪除; 對象里有設置開始時間點和播放時長的方法;. 等要刪除時,用removeAnimation; 當一個圖層從容器中釋放后, 我們會銷毀里面的所有的對象.

3.10、圖層之--特效

  1. 和動畫一樣的制作步驟, 唯一不同的是: 動畫是從開始播放到結束, 如果設置的時長不等于json中的默認時長,動畫平均分配不同的動畫快慢來達到設置的長度; 而特效的效果時間是固定的, 如果設置的時長json中的默認時長,則會循環播放特效.
  2. 特效可設置當前圖層的任意時刻點開始,我們舉例了從頭(head) 和尾(end)的兩種方式.
  3. 這些API的關鍵詞是: 特效:(Effect), 指定時間點增加特效:(addEffectAtCompTimeUs); 預覽特效(playEffect), 移除特效:(removeEffect).
  4. 執行步驟, 和動畫步驟一致.

3.11、圖層之--畫布(背景)/去水印/透明/鏡像

  1. 畫布是對當前每個圖層做的操作, 是無論圖層縮放多少, 畫布都會鋪滿整個容器, 畫布可以是顏色, 圖片, 或畫面的虛化做背景;
  2. 去水印當前支持馬賽克去水印, 我們在圖層類中舉例了最大4個去水印的API, 可以設置位置,設置大小,設置馬賽克像素的大小; 如果你有更多個馬賽克的需求,還是用LanSongMosaicRectFilter自行增加;
  3. 透明我們描述為:不透明度, 這樣更好理解一些, 和調節RGB一樣,可以直接設置; 參數1.0是完全不透明, 0.0是完全透明;
  4. 鏡像:是把整個畫面的左邊鏡像到右邊, 把右邊鏡像到左邊; 如果你打算把左邊的一半鏡像到右邊,則用我們的LanSongMirrorFilter濾鏡;
  5. 這些API的關鍵詞是: 背景(backGround), 去水印(mosaicRect), 不透明度(opacityPercent) , 鏡像(mirror).

3.12、圖層之--獲取縮略圖

  1. 縮略圖是每秒鐘一幀, 大小是192x192的圖片對象;
  2. 用getDisplayThumbnailList 獲取到每張圖片大小是192x192, 每個圖層最后獲取到的圖片寬度總和等于圖層的縮略圖顯示時長(秒為單位)*192;
  3. 我們有合成總時長改變回調(DurationChanged): 當原視頻時長裁剪, 變速,倒序,增加轉場,都會觸發此回調,建議在這里重新刷新所有的拼接層的時長, 因為一個圖片或視頻的時長改變了, 別的圖片和視頻的開始顯示點等都會改變;
  4. 我們的demo演示, 是在durationChanged的時候刷新所有的拼接層的所有圖層縮略圖;

3.13、圖層之--關鍵幀動畫

  1. 關鍵幀動畫是指:在兩個不同時間點分別對視頻或圖片做動作, 然后SDK就會自動從一個時間點平滑過渡到另一個時間點狀態的動畫, 稱之為關鍵幀動畫;
  2. 比如你在時間A點把視頻縮小一倍, 在B點把視頻放大一倍, 則預覽時SDK就會自動的從A點平滑的一點一點的放大視頻,直到B點放大完畢,從而形成動畫.
  3. 當前關鍵幀動畫支持 移動旋轉縮放透明;
  4. 關鍵幀的優先級最低, 如果在同一時間段設置了關鍵幀和動畫/特效/轉場等json時, 則動畫/特效/轉場有效果, 關鍵幀無效;

3.14、圖層之--調速

  1. 視頻支持調速, 調速可設置0.1倍到10.0倍
  2. 0.1倍是放慢10倍, 畫面顯示時長等于原來的10倍, 10.0倍是加快10倍, 畫面時長等于原來的1/10; 1.0 倍是原來的速度, 可以很細小的調節,比如0.1, 0.2, 0.3等;
  3. 當前在調速時, 暫時不支持聲音變速; 聲音默認是靜音的; 調速后,會觸發容器的durationChanged回調, 建議你在回調中去刷新所有縮略圖;
  4. 對應的API 是: setVideoSpeed, getVideoSpeed;

3.15、聲音圖層

  1. 外界輸入的各種音效, 無論是wav格式的音效, 還是mp3,m4a, 或者錄音 或者帶有聲音的視頻, 我們統稱為聲音. 這些聲音是同一個API輸入到SDK中, 然后得到對應的聲音圖層.
  2. 聲音圖層, 可以指定時間點增加, 可以設置循環, 設置把聲音的那一段裁剪后增加, 設置音量大小, 設置淡入淡出效果
  3. 聲音音量范圍是0---5.0 , 1.0是默認聲音. 0.0是關閉聲音; 5.0是放大5倍; 聲音裁剪最小是300毫秒, 最大是聲音的原始長度;
  4. 這些API的關鍵詞是: 音頻圖層:(LSOAudioLayer); 裁剪時長(setCutStartTime/setCutEndTime) 音量:(volume)

3.16、API介紹


3.16.1 Android視頻編輯SDK概述:

  1. 我們把視頻編輯抽象為兩個類, 一個是編輯預覽類LSOEditPlayer, 一個圖層類LSOLayer。
  2. 播放預覽類LSOEditPlayer, 是一個素材容器, 也是一個view,可布局到xml中,當設置寬高比例時,會自動適配并等比例布局播放畫面,以監聽返回. 可完成素材的:插入或刪除,替換,拼接,疊加,定位,播放/暫停等實時容器預覽的功能。
  3. 圖層類LSOLayer: 圖片/視頻/文本/特效/GIF等增加到播放器中后,我們把他處理成一層畫面 ,增加一個, 就是增加一層畫面;增加時會返回LSOLayer對象,用這個對象可以設置:時間點,位置,寬高,角度,鏡像,倒序,濾鏡,調節,美顏,動畫,轉場,特效等功能。
  4. 調用流程是:在Activity的onCreate/onPause/onResume/onDestroy生命周期中, 分別增加LSOEditPlayer對應的同名方法即可。
  5. 素材增加的形式有兩種, 一種是前后拼接, 一種是上下疊加, 示意圖如下:

image

1、Android視頻播放LSOEditPlayer類說明
  1. public void onCreateAsync(LSORatioType ratio, OnCreateListener listener)
功能:
? 設置播放容器寬高比;
? Activity onCreate中調用,設置播放容器的寬高比, 設置后, 會根據寬高比等比例縮放到當前view所在layout;
  也可以在播放暫停時, 重寫布局此播放容器(relayout);
參數:
? ratio 寬高比;
? listener 重新布局后, 適配到layout后的回調;
  1. public void onCreateAsync(List<LSOAsset> arrays, OnCreateListener listener)
 功能:
 ? 設置播放容器的資源
 參數:
 ? arrays 容器資源數組, 支持圖片和視頻.
 ? listener 默認會以第一個圖片或視頻的寬度為參考,等比例縮放當前播放容器后回調;
  1. public void onCreateAsync(List<LSOAsset> arrays,int width, int height, OnCreateListener listener)
 功能:
 ? 設置播放容器資源, 并設置寬度和高度
 參數:
 ? arrays 輸入的圖片或視頻資源;
 ? width 播放容器的寬度
 ? height 播放容器的高度
 ? listener 根據設置的高度和寬度, 重新等比例布局當前view, 布局后返回監聽;
  1. public void onCreateAsync(int width,int height, OnCreateListener listener)
 功能:
 ? 設置容器的寬度和高度, 在播放設置, 不可以用來初始化播放器;
 ? 在第一次之后設置
 參數:
 ? width 寬度
 ? height 高度
 ? listener 適配當前view后的監聽;
  1. public void onResumeAsync(OnResumeListener listener)
 功能:
 ? Activity onResume中調用, 用來執行activity的返回事件;
 參數:
 ? listener 異步回調;
  1. public void onPause()
 功能:
 ? Activity中的onPause中調用;
  1. public void onDestroy()
 功能:
 ? ActivityonDestroy中調用
  1. public void prepareConcatAssets(OnAddAssetProgressListener listener)
 功能:
 ? 在當前View布局完畢后, 準備當前播放器;
 參數:
 ? listener 內部會開啟一個線程, 內部開啟完畢后的回調;
  1. public void insertConcatAssetAtCurrentTime(List<LSOAsset> assetArray, OnAddAssetProgressListener listener1)
 功能:
 ? 在當前時間點插入圖片或視頻
 參數:
 ? assetArray 插入的圖片或視頻數組
 ? listener1 插入完畢后的回調;
  1. public void insertConcatAssetWithTime(List<LSOAsset> assetArray, long atCompUs, OnAddAssetProgressListener listener1)
 功能: 
 ? 在指定的時間點插入圖片或視頻.
 ? 內部流程是:
 ? 先找指定時間點 在某個圖層時間段內.
 ? 找到圖層后, 如果時間點在圖層前半部分,則向前插入; 如后半部分,則向后插入;
 參數:
 ? assetArray 插入的圖片或視頻數組
 ? atCompUs 在指定的時間點
 ? listener1 異步插入完畢后的回調;
  1. public void replaceConcatLayerAsync(LSOAsset asset, LSOLayer replaceLayer, OnAddAssetProgressListener listener)
 功能: 
 ? 替換拼接圖層;
 參數:
 ? asset        資源
 ? replaceLayer 被替換的圖層
 ? listener     異步替換;
  1. public LSOLayer getCurrentConcatLayerByTime(long compUs)
 功能:  
 ? 獲取指定時間點的拼接圖層
 參數:
 ? compUs  指定時間點, 單位微秒; 1=1000*1000微秒
 ? @return 返回圖層對象
  1. public void addAssetAsync(LSOAsset asset, long atCompUs,OnAddAssetProgressListener listener1)
 功能: 
 ? 在拼接層上疊加一個資源;
 參數:
 ? asset 圖片或視頻資源
 ? atCompUs 指定時間點
 ? listener1 異步增加完畢后的回調監聽;
  1. public void addVideoEffectAsync(LSOAsset asset, long atCompUs, boolean preview, OnAddAssetProgressListener listener1)
 功能: 
 ? 在指定時間點增加一個視頻特效, 增加后, 通過異步返回一個LSOLayer對象;
 參數:
 ? asset 一個color和一個mask組成的透明視頻動畫資源, 寬高:最大720p, 時長:最大5秒鐘;
 ? atCompUs  在指定時間點
 ? preview   插入后, 是否預覽
 ? listener1 插入完畢后的回調,回調中
  1. public LSOLayer addBitmapLayer(String path, long atCompUs)
 功能: 
 ? 在拼接層上疊加一個圖片圖層

 參數:
 ? path 圖片的完整路徑
 ? atCompUs 在指定時間點增加, 單位微秒
  1. public LSOLayer addBitmapLayer(Bitmap bmp, long atCompUs)
 功能: 
 ? 增加圖片圖層,
 參數:
 ? bmp 圖片對象;
 ? atCompUs 在指定時間點增加,單位微秒;
  1. public LSOLayer addGifLayer(String gifPath, long atCompUs)
 功能: 
 ? 在拼接層上, 增加一個Gif圖層
 參數:
 ? gifPath gif圖層路徑
 ? atCompUs 在指定時間點增加,單位微秒;
  1. public LSOLayer addGifLayer(LSOAsset asset, long atCompUs)
 功能: 
 ? 在拼接層上, 增加一個Gif圖層
 參數:
 ? asset gif文件的路徑
 ? atCompUs 在指定時間點增加,單位微秒;
 ? @return 返回LSOLayer圖層對象. 此對象可設置圖層的移動旋轉縮放等功能.
  1. public LSOAudioLayer addAudioLayer(String path, long startTimeOfComp)
 功能: 
 ? 增加聲音圖層;
 參數:
 ? path            聲音的完整路徑;
 ? startTimeOfComp 從合成的什么位置開始增加;
 ? @return 返回聲音對象, 可以設置聲音的音量, 循環等功能;
  1. public void removeLayerAsync(LSOLayer layer)
 功能: 
 ? 異步刪除圖層;
 ? 刪除成功后, 會觸發容器時長回調, 在回調中你可以重新布局時間軸
 參數:
 ? layer 圖層對象;
  1. public void removeAllOverlayLayersAsync()
功能: 
 ? 刪除所有的疊加圖層.
 ? 疊加圖層有:圖片圖層, gif圖層, 圖片序列圖層等;
  1. public void removeAudioLayerAsync(LSOAudioLayer layer)
 功能: 
 ? 刪除聲音圖層
 參數:
 ? layer
  1. public void removeALLAudioLayer()
 功能: 
 ? 刪除所有的增加的聲音圖層;
  1. public boolean isPlaying()
 功能: 
 ? 畫面是否在播放
 參數:
 ? @return 是否在播放
  1. public boolean isRunning()
 功能: 
 ? 當前播放器是否在運行.
 ? 合成是一個線程, 此返回的是當前線程是否在運行,
 ? 線程運行不一定畫面在播放,有可能畫面暫停;
 參數:
 ? @return 線程是否在運行
  1. public boolean isExporting()
 功能: 
 ? 是否在導出;
 參數:
 ? @return 
  1. public long getCurrentPositionUs()
 功能: 
 ? 獲取當前播放器的時間.
 參數:
 ? @return 當前時間, 單位微秒
  1. public List<LSOLayer> getAllConcatLayers()
 功能: 
 ? 獲取播放器的所有拼接圖層;
 參數:
 ? @return 圖層list 拼接圖層;
  1. public List<LSOLayer> getAllOverLayLayers()
 功能: 
 ? 獲取播放器中的所有疊加層
 參數:
 ? @return 圖層數組, 疊加的圖層;
  1. public List<LSOAudioLayer> getAllAudioLayers()
功能: 
 ? 獲取播放器中的所有聲音圖層
  1. public void setOnBeforeRenderFrameListener(OnLanSongSDKBeforeRenderFrameListener listener)
 功能: 
 ? 在每一幀繪制前的回調, 里面沒有經過handler, 你增加的代碼, 在我們render線程中執行,
 參數:
 ? listener 返回的是時間戳, 單位us;
  1. public void setOnDurationChangedListener(OnLanSongSDKDurationChangedListener listener)
 功能: 
 ? 容器的總時長改變監聽;播放器會在拼接層裁剪, 設置顯示時間, 轉場,變速等場合下, 時長改變;
 ? 返回的是當前總時長;
 參數:
 ? listener 總時長改變監聽, 返回的long類型改變后的當前總時長
  1. public void setOnLanSongSDKPlayProgressListener(OnLanSongSDKPlayProgressListener listener)
 功能: 
 ? 播放進度回調
 ? 監聽中的兩個參數是: onLanSongSDKExportProgress(long ptsUs, int percent);
 ? 分別對應 當前處理的時間戳 和百分比;
 ? seekpause的時候,此監聽不調用;
 參數:
 ? listener
  1. public void setOnTimeChangedListener(OnLanSongSDKTimeChangedListener listener)
 功能: 
 ? 容器的當前播放時間改變回調;
 ? 只要是改變了, 不管是seek的改變,還是自動播放的改變,都執行這里;
 參數:
 ? listener 時間改變監聽 long類型是當前時間戳, int類型是當前時間戳占總時長的百分比;
  1. public void setOnPlayCompletedListener(OnLanSongSDKPlayCompletedListener listener)
 功能: 
 ? 視頻播放完成進度;
 參數:
 ? listener 播放完成監聽
  1. public void setOnExportProgressListener(OnLanSongSDKExportProgressListener listener)
 功能: 
 ? 導出進度回調;
 ? 監聽中的兩個參數是: onLanSongSDKExportProgress(long ptsUs, int percent);
 ? 分別對應 當前處理的時間戳 和百分比;
 參數:
 ? listener 導出進度監聽, long類型是當前正在處理的時間戳, int類型是進度百分比;
  1. public void setOnExportCompletedListener(OnLanSongSDKExportCompletedListener listener)
 功能: 
 ? 導出完成回調;
 ? 完成后,  void onLanSongSDKExportCompleted(String dstVideo);
 ? 對應的是:返回完成后的目標視頻路徑;
 參數:
 ? listener  導出完成監聽, 返回String類型的導出視頻完整路徑;
  1. public void setOnErrorListener(OnLanSongSDKErrorListener listener)
 功能: 
 ? 錯誤監聽
  1. public boolean start()
 功能: 
 ? 開始播放/恢復播放;
  1. public void startExport(LSOExportType type)
 功能: 
 ? 開始導出
 參數:
 ? type 導出枚舉類型
  1. public void seekToTimeUs(long timeUs)
 功能: 
 ? 定位到某個位置.
 參數:
 ? timeUs 時間, 單位微秒;
  1. public void pause()
功能: 
 ? 播放預覽暫停
  1. public long getDurationUs()
功能: 
 ? 獲取當前播放器的總時長;
參數:
@return 時間, 單位微秒;
  1. public void setLooping(boolean is)
 功能: 
 ? 設置容器循環播放;
 參數:
 ? is 是否循環;
  1. public void cancelExport()
功能: 
 ? 取消導出
  1. public void cancel()
功能: 
 ? 取消當前合成.
 ? 取消后, 會把內部線程全部退出, 所有增加的圖層都會釋放;
  1. public void setFrameRate(int frameRate)
功能: 
 ? 設置導出幀率
 ? 不建議使用

 參數:
 ? frameRate 幀率最小20,最大是60
  1. public void setExportBitRate(int bitRate)
 功能: 
 ? 設置導出時的碼率,
 ? 不建議使用
 參數:
 ? bitRate 碼率, 最小是300K,不建議使用;

2、Android視頻編輯圖層LSOLayer類說明
  1. public String getOriginalPath()
 功能: 
 ? 獲取原視頻/圖片的路徑
 參數:
 ? @return
  1. public long getOriginalDurationUs()
 功能: 
 ? 獲取視頻/圖片的原始時長
 參數:
 ? @return
  1. public int getOriginalWidth()
 功能: 
 ? 獲取原始寬度
 參數:
 ? @return
  1. public int getOriginalHeight()
 功能: 
 ? 獲取原始高度
 參數:
 ? @return
  1. public long getDisplayDurationUs()
 功能: 
 ? 獲取顯示時長;
 ? 如果播放器中只有一個視頻或圖片, 則此時長等于播放器的時長;
 參數:
 ? @return
  1. public long getThumbnailDurationUs()
 功能: 
 ? 獲取縮略圖的顯示時間;
 ? : 因轉場等功能,拼接層可能有重疊區域. 因此顯示時長不等于縮略圖的時長;

 參數:
 ? @return
  1. public void setDisplayDurationUs(long durationUs)
 功能: 
 ? 設置顯示時長;
 參數:
 ? durationUs
  1. public long getStartTimeOfComp()
 功能:
 ? 獲取當前圖層在播放器中的開始時間
 參數:
 ? @return
  1. public void setCutDurationUs(long startUs, long endUs)
 功能: 
 ? 設置視頻的裁剪時長
 參數:
 ? startUs 開始裁剪時間
 ? endUs 結束裁剪時間
  1. public long getCutStartTimeUs()
 功能:
 ? 獲取裁剪開始時間
 參數:
 ? @return
  1. public long getCutEndTimeUs()
 功能:
 ? 獲取裁剪結束時間

 參數:
 ? @return
  1. public void setCropRect(LSORect rect)
 功能:
 ? 設置裁剪區域;
 參數:
 ? @param rect
  1. public void setCropRectToOriginal()
 功能:
 ? 恢復到不裁剪
  1. public void setCropRectPercent(float x, float y, float width, float height)
 功能:
 ? 設置裁剪百分比.整個畫面從左到右是0.0--1.0; 從上到下是0.0--1.0;
 參數:
 ? x  寬度的開始比例
 ? y  裁剪高的開始比例
 ? width 裁剪寬度的比例
 ? height 裁剪高度的比例
  1. public void setLooping(boolean is)
 功能:
 ? 疊加層設置循環
 參數:
 ?  is
  1. public void setStartTimeOfComp(long atCompUs)
 功能:
 ? 設置當前圖層在播放器中的開始時間點;

 參數:
 ? atCompUs
  1. public void setVisibility(boolean is)
 功能:
 ? 設置是否顯示
 參數:
 ? is
  1. public void setVisibility(int visibility)
 功能:
 ? 設置是否顯示
 ? 類型是 LSOLayer.VISIBLE  LSOLayer.INVISIBLE
 參數:
 ? visibility 
  1. public int getVisibility()
 功能:
 ? 獲取是否顯示
 參數:
 ? @return
  1. public void resetScaleSize()
 功能:
 ? 恢復到縮放前的大小
  1. public void setScaleType(LSOScaleType type)
 功能:
 ? 設置縮放枚舉類型.
 ? NONE: 無縮放形式.則內部會根據不同的素材,采用默認形式;
 ? ORIGINAL: 原始大小,直接放入, 不做任意處理;
 ? FILL_COMPOSITION, 忽略百分比,把寬度等于容器的寬度, 高度等于容器的高度,填滿整個容器,這樣有些畫面可能會變形;
 ? CROP_FILL_COMPOSITION: 裁剪填滿 放入到容器中;把視頻的中心點放到容器的中心點,然后 把畫面等比例提填滿整個容器,把多的部分裁剪掉.
 ? VIDEO_SCALE_TYPE:視頻縮放模式,如果視頻寬度大于高度, 則寬度和容器對齊, 然后等比例調整高度;如果高度大于寬度, 則反之.
 參數:
 ? type
  1. public void setScaledValue(float width, float height)
 功能:
 ? 縮放到的實際值
 參數:
 ? width
 ? height
  1. public float getScaleWidth()
 功能:
 ? 獲取縮放的寬度
 參數:
 ? @return
  1. public float getScaleHeight()
 功能:
 ? 獲取縮放的高度
 參數:
 ? @return
  1. public float getRotation()
 功能:
 ? 獲取旋轉角度.
 參數:
 ? @return
  1. public void setRotation(float angle)
 功能:
 ? 設置旋轉角度
 參數:
 ? angle
  1. public void setLayerMirror(boolean flipHorizontal, boolean flipVertical)
 功能:
 ? 設置圖層是否鏡像, 上下鏡像, 左右鏡像.
 參數:
 ? flipHorizontal 水平鏡像
 ? flipVertical 垂直鏡像
  1. public void cancelLayerMirror()
 功能:
 ? 取消鏡像
  1. public boolean isMirrorX()
 功能:
 ? 水平是否鏡像
 參數:
 ? @return
  1. public boolean isMirrorY()
 功能:
 ? 垂直是否鏡像
 參數:
 ? @return
  1. public void setPosition(float xPos, float yPos)
 功能:
 ? 設置當前圖層中心點的坐標, xPosX軸的坐標,yPos是設置Y軸的坐標.  
 ? 此坐標是以播放容器的大小為參考, 比如容器的大小是1280x720, 您設置了640,360 ,則圖層在播放器中居中顯示
 參數:
 ? xPos
 ? yPos
  1. public void setPosition(LSOLayerPosition position)
 功能:
 ? 設置圖層的枚舉位置;
 ? 枚舉類型有: 左上/左下/右上/右下/居中////
  1. public float getPositionX()
 功能:
 ? 獲取當前圖層中心點的位置X
 參數:
 ? @return  橫向坐標中心點, 相對于播放容器本身而言;
  1. public float getPositionY()
 功能:
 ? 獲取當前圖層中心點的位置Y
 參數:
 ? @return 豎向坐標中心點, 相對于播放容器本身而言
  1. public void setOpacityPercent(float percent)
 功能:
 ? 設置透明百分比;
 參數:
 ? percent 百分比 范圍從0--1.0;
  1. public void setBrightnessPercent2X(float percent2X)
 功能:
 ? 調節當前圖層畫面的亮度
 參數:
 ? percent2X 范圍是0--2.0; 1.0為默認值;
  1. public void setContrastFilterPercent2X(float percent2X)
 功能:
 ? 調節當前圖層畫面的對比度
 參數:
 ? percent2X 范圍是0--2.0; 1.0為默認值;
  1. public void setSaturationFilterPercent2X(float percent2X)
 功能:
 ? 調節畫面的飽和度;
 參數:
 ? percent2X 范圍是0--2.0; 1.0為默認值;
  1. public void setWhiteBalanceFilterPercent2X(float percent2X)
 功能:
 ? 調節畫面的白平衡
 參數:
 ? percent2X 范圍是0--2.0; 1.0為默認值;
  1. public void setHueFilterPercent2X(float percent2X)
 功能:
 ? 調節畫面的色度

 參數:
 ? percent2X 范圍是0--2.0; 1.0為默認值;
  1. public void setExposurePercent2X(float percent2X)
 功能:
 ? 調節畫面的曝光度
 參數:
 ? percent2X 范圍是0--2.0; 1.0為默認值;
  1. public void setBeautyLevel(float level)
 功能:
 ? 設置畫面的磨皮級別 0.0--1.0;
 參數:
 ? level 等級 0.0是不磨皮, 1.0是最高磨皮
  1. public void setFilter(LanSongFilter filter)
 功能:
 ? 設置濾鏡, 設置時, 會把上一次設置的濾鏡刪除; 如果不想刪除則用addFilter;
 參數:
 ? filter 濾鏡對象, 此對象不可同時設置為多個圖層中.
  1. public void removeFilter(LanSongFilter filter)
 功能:
 ? 移出濾鏡
 參數:
 ? filter 增加的濾鏡對象
  1. public void addFilter(LanSongFilter filter)
 功能:
 ? 增加濾鏡,如增加多個, 則多個濾鏡是級聯的關系, 即畫面把執行上一個濾鏡的結果, 作為下一個濾鏡的輸入;
 參數:
 ? filter 濾鏡對象
  1. public void removeAllFilter()
 功能:
 ? 刪除所有濾鏡
  1. public void setVideoSpeed(float speed)
 功能:
 ? 設置視頻速度.
 參數:
 ? speed 視頻速度值, 范圍0.1--10.0;
  1. public float getVideoSpeed()
 功能:
 ? 獲取視頻速度;
 參數:
 ? @return 返回速度值
  1. public void setVideoReverseAsync(boolean reverse, OnVideoReverseListener listener)
 功能:
 ? 異步設置視頻倒序
 參數:
 ? reverse 是否倒序
 ? listener 倒序后的監聽;
  1. public boolean isVideoReverse()
 功能:
 ? 當前視頻是否倒序
 參數:
 ? @return 是否倒序
  1. public LSOEffect addEffectAtCompTimeUs(String jsonPath, long compUs)
 功能:
 ? json的形式增加特效
 參數:
 ? jsonPath 增加一個特效json路徑
 ? compUs 從播放器的什么時間點開始增加
 ? @return 增加后, 返回特效對象, 可設置開始時間和播放時長;
  1. public LSOEffect addEffectAtLayerHead(String jsonPath)
 功能:
 ? 在圖層的頭部增加一個特效
 參數:
 ? jsonPath json路徑
 ? @return 增加后, 返回特效對象, 可設置播放時長;
  1. public LSOEffect addEffectAtLayerEnd(String jsonPath)
 功能:
 ? 在圖層的尾部增加一個特效
 參數:
 ? jsonPath 特效路徑
 ? @return 增加后, 返回特效對象, 可設置播放時長;
  1. public List<LSOEffect> getAllEffectList()
 功能:
 ? 獲取增加的所有特效
 參數:
 ? @return 所有特效數組
  1. public void removeAllEffectList()
 功能:
 ? 移出當前圖層的所有特效
  1. public void removeEffect(LSOEffect effect)
 功能:
 ? 移出指定的特效
 參數:
 ? effect
  1. public void playEffect(LSOEffect effect)
 功能:
 ? 播放預覽特效
 參數:
 ? effect 指定播放的特效對象,播放后會回到播放前的位置
  1. public LSOAnimation addAnimationAtCompTimeUs(String jsonPath, long compUs)
 功能:
 ? 增加動畫
 參數:
 ? jsonPath json格式的路徑
 ? compUs 從播放器的時間點增加
 ? @return 返回動畫對象, 可設置開始時間和播放時長
  1. public LSOAnimation setAnimationAtLayerHead(String jsonPath)
 功能:
 ? 在圖層的頭部增加一個動畫
 參數:
 ? jsonPath json動畫路徑
 ? @return 返回動畫對象, 可設置播放時長
  1. public LSOAnimation setAnimationAtLayerEnd(String jsonPath)
 功能:
 ? 在圖層的尾部增加一個動畫
 參數:
 ? jsonPath 動畫路徑
 ? @return 返回動畫對象, 可設置播放時長
  1. public List<LSOAnimation> getAllAnimationList()
 功能:
 ? 獲取所有動畫
 參數:
 ? @return 所有動畫對象
  1. public void removeAllAnimationList()
 功能:
 ? 移出所有動畫
  1. public void removeAnimation(LSOAnimation animation)
 功能:
 ? 移出指定動畫
 參數:
 ? animation 指定動畫對象
  1. public void playAnimation(LSOAnimation animation)
 功能:
 ? 播放動畫
 參數:
 ? animation 動畫對象
  1. public boolean setTransitionMaskPath(String maskJsonPath)
 功能:
 ? 設置轉場路徑
 參數:
 ? maskJsonPath 遮罩轉場路徑
 ? @return 可以設置返回true; 否則返回false
  1. public void setTransitionDurationUs(long duration)
 功能:
 ? 設置轉場時長
 參數:
 ? duration 時長,范圍100*100---3*1000*1000;
  1. public void playTransition()
 功能:
 ? 開始播放轉場
  1. public void cancelTransition()
 功能:
 ? 取消轉場
  1. protected long getTransitionDurationUs()
 功能:
 ? 獲取轉場時長;
 參數:
 ? @return
  1. public long getTransitionStartTimeOfComp()
 功能:
 ? 獲取從合成的開始時間;
 參數:
 ? @return
  1. public LSOMosaicRect getMosaicRect1()
 功能:
 ? 獲取一個馬賽克區域, 返回馬賽克對象,
 ? 可設置馬賽克區域, 是否禁止,馬賽克像素點的寬度;

 參數:
 ? @return 馬賽克對象
  1. public void setAudioVolume(float volume)
 功能:
 ? 設置音頻音量
  1. public float getAudioVolume()
 功能:
 ? 獲取音頻音量
  1. public void setBackGroundBlurLevel(float level)
 功能:
 ? 設置背景模糊級別
 ? 1.0是輕微模糊,毛玻璃模糊. 8.0f是完全,深度模糊;   0.0是刪除模糊效果;
 參數:
 ? level
  1. public void setBackGroundBitmap(String bitmapPath)
 功能:
 ? 設置背景圖片
 參數:
 ?  bitmapPath
  1. public void setBackGroundColor(int color)
 功能:
 ? 設置背景顏色
 參數:
 ? color
  1. public float getMaxBlurLevel()
 功能:
 ? 獲取最大模糊系數, 當前返回的是8.0;
  1. public void getThumbnailAsync(OnLanSongSDKThumbnailBitmapListener listener)
 功能:
 ? 異步獲取縮略圖
 參數:
 ? listener
  1. public List<Bitmap> getThumbnailListWithCount(int count)
 功能:
 ? 獲取縮略圖個數, 此方法一定在getThumbnailAsync完成后設置
 參數:
 ? count 獲取的圖片張數
 ? @return 返回bitmap數組;

3.16.2 IOS視頻編輯SDK概述:

  1. 我們把視頻編輯抽象為兩個類, 一個是編輯預覽類LSOEditPlayer, 一個圖層類LSOLayer。
  2. 播放預覽類LSOEditPlayer,和AVPlayer類似, 需要一個播放窗口UIView,本質是一個編輯播放器,可完成素材的:插入或刪除,替換,復制,分割,拼接,疊加,定位,播放/暫停等實時容器預覽的功能。
  3. 圖層類LSOLayer: 圖片/視頻/文本/特效/GIF等增加到播放器中后,我們把他處理成一層畫面 ,增加一個, 就是增加一層畫面;增加時會返回LSOLayer對象,用這個對象可以設置:時間點,位置,寬高,角度,鏡像,倒序,濾鏡,調節,美顏,動畫,轉場,特效等功能。
  4. 調用流程是: 創建LSOEditPlayer對象, init時可輸入圖片或視頻的url路徑和播放器比例,得到播放器容器的寬高,根據寬高創建LSODispLayView作為播放器的顯示窗口, 之后正常播放即可.
  5. 素材增加的形式有兩種, 一種是前后拼接, 一種是上下疊加, 示意圖如下:

image

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)

 功能:
 ? 適配ios13export類問題

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; 則返回的縮略圖是 6192x192的圖片和一張 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

 功能:
 ? AEjson形式增加一個動畫
 參數:
 ? 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

 功能:
 ? AEjson文件形式在指定時間點增加一個特效
 參數:
 ? 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的人像分割用到的庫

庫:

模型:

需要依賴系統的庫:

調用

唯一類: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:

  1. assets下的tenlinev2.model
  2. jniLibs/arm64-v8a下的libTenLineJni.so
  3. jniLibs/armeabi-v7a下的libTenLineJni.so

IOS:

  1. tnn.framework
  2. TenLineSegmnetFramework.framework
  3. tnn.metallib
  4. TEN_LINE_IOS.MODEL
  5. TEN_LINE_IOS.MODEOPROTO
  6. TenLineFast_ios.MODEL
  7. 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錯誤.
常見為:沒有設置surfacesurface已經被釋放

6.7、錯誤碼:1206

容器寬高設置過低的錯誤.
分辨率設置小于320x320,則會拋出此錯誤信息

6.8、錯誤碼:1207

當前圖層錯誤.
建議拿到錯誤信息日志后,分析是哪里的問題.

<sup id="6sgqq"></sup><option id="6sgqq"><code id="6sgqq"></code></option>
<sup id="6sgqq"><menu id="6sgqq"></menu></sup><rt id="6sgqq"><center id="6sgqq"></center></rt>
<rt id="6sgqq"><code id="6sgqq"></code></rt>
<sup id="6sgqq"><option id="6sgqq"></option></sup>
<noscript id="6sgqq"></noscript>
<optgroup id="6sgqq"><wbr id="6sgqq"></wbr></optgroup>
  • 黑色极品JK撕破丝袜自慰喷白浆
    <sup id="6sgqq"></sup><option id="6sgqq"><code id="6sgqq"></code></option>
    <sup id="6sgqq"><menu id="6sgqq"></menu></sup><rt id="6sgqq"><center id="6sgqq"></center></rt>
    <rt id="6sgqq"><code id="6sgqq"></code></rt>
    <sup id="6sgqq"><option id="6sgqq"></option></sup>
    <noscript id="6sgqq"></noscript>
    <optgroup id="6sgqq"><wbr id="6sgqq"></wbr></optgroup>
  • <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>