本文主要介紹短視頻SDK在Android端的使用問題。
SDK集成
安卓指令集的兼容情況如何?
如果項目只接入armeabi,則需要將SDK包中的armeabi_v7a文件內的so文件拷貝到項目的armeabi文件夾內。
集成SDK后,Debug版本可以正常運行,但是Release版本啟動就崩潰,該怎么解決?
問題現象:集成SDK后,Debug版本可以正常運行,但是Release版本啟動就崩潰。
可能原因:混淆配置錯誤
- 先檢查崩潰的log是否是報JNI找不到對應的Java類。
- 如果是的話,一般來說就是混淆導致的,因為JNI調用Java類用的是反射,所以如果混淆把SDK內部與JNI有關的類混淆了,則JNI加載時將無法找到對應的Java類,就會加載失敗。
- 如果不是,則可以填寫宜搭信息申請,獲取阿里云技術支持。
- 把Demo中的混淆配置拷貝到開發者工程的混淆配置中。
如何添加硬編黑名單,硬解白名單?
- 添加硬編碼黑名單
/** * 添加硬編碼黑名單,model和versions的順序必須對應起來 * 黑名單內的機型將使用軟編,黑名單外的機型都使用硬編 * @param models 機型Model信息列表{@link Build#MODEL} * @param versions 系統版本號列表{@link Build.VERSION#SDK_INT},如果不需要適配版本號,填寫0即可 */NativeAdaptiveUtil.encoderAdaptiveList(String[] models,int[] versions);
- 添加硬解碼白名單
/** * 添加硬解碼器白名單,model和versions的順序必須對應起來 * 如果開啟硬解碼了,則白名單中的機型將使用硬解碼,白名單外的機型將使用軟解碼 * @param models 機型Model信息列表{@link Build#MODEL} * @param versions 系統版本號列表{@link Build.VERSION#SDK_INT},如果不需要適配版本號,填寫0即可 * @see #setHWDecoderEnable(boolean) */ NativeAdaptiveUtil.decoderAdaptiveList(String[] models, int[] versions);
Android基礎版本提示java.lang.NoSuchFieldError: No field height of type I in class Lcom/aliyun/snap/snap_core/R$id; or its superclasses (declaration of ‘com.aliyun.snap.snap_core.R$id’ appears in /data/app/com.rablive.jwrablive-2/base.apk:classes2.dex),該如何解決?
問題現象:Android基礎版本提示java.lang.NoSuchFieldError: No field height of type I in class Lcom/aliyun/snap/snap_core/R$id; or its superclasses (declaration of ‘com.aliyun.snap.snap_core.R$id’ appears in /data/app/com.rablive.jwrablive-2/base.apk:classes2.dex)。
可能原因:出現這個錯誤是因為在開發者的工程中存在和AAR(SDK)一樣的xml,于是導致沖突。
解決方案:找到出現沖突的xml,開發者自行加前綴。目前發現容易沖突的xml包括:activity_setting.xml
和activity_video_play.xml
。
Android基礎版提示java.lang.NoSuchFieldError: No static field notification_template_lines of type I in class Lcom/aliyun/snap/snap_core/R$layout; or its superclasses (declaration of ‘com.aliyun.snap.snap_core.R$layout’ appears/data/app/com.Aliyun.AliyunVideoSDK.VodSaaSDemo_android-1/base.apk) ,該如何解決?
//重要:如果工程中引入第三方庫也引入了support包,也必須要保證第三方的包版本對應,建議以源碼引入第三方庫
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1'
但是有時第三方庫帶support包修改起來比較麻煩,且可能有些第三方包并不是源碼引入的,此時建議在Application里面的gradle文件中配置。configurations.all {
resolutionStrategy {
force 'com.android.support:appcompat-v7:24.2.1'
force 'com.android.support:design:24.2.1'
}
}
Demo使用時提示Please invoke the FileDownloader#init in Application#onCreate first,該怎么解決?
需要在Application OnCreate中調用DownloaderManager.getInstance().init(Context context);。
SDK內部是否有獲取視頻封面的接口?
Android短視頻SDK目前專業版提供了AliyunIThumbnailFetcher接口,可以獲取非關鍵幀的圖片,其他版本建議使用系統函數取幀。
視頻錄制
錄制如何添加普通動圖?
添加普通動圖需要使用AliyunIRecorder#addPaster(EffectPaster effectPaster,float sx,float sy,float sw,float sh,float rotation,boolean flip)接口,并且在EffectPaster對象中填入信息,EffectPaster的isTrack一定要設置為false,否則貼圖將作為人臉貼圖處理,跟隨人臉變化,如果沒有人臉,貼圖會不顯示。另外該接口必須在RecordCallback#OnInitReady()回調之后調用,否則將不會顯示貼圖。
如何設置錄制角度?
目前設置錄制角度有setRotation和setRecordRotation兩個接口,setRotation接口是一個自適應接口,只要nin把手機角度傳感器返回的角度值傳給這個接口,就可以得到正確的錄制角度和人臉角度。setRecordRotation接口是自定義的視頻角度接口,可以根據您的需求定制任意角度值。
如何實現橫屏錄制?
- 您如果需要默認橫屏只需要將界面UI元素旋轉引導橫屏拍攝視頻,不需要設置界面橫屏,讓界面固定豎屏即可。
android:screenOrientation="portrait"
- 橫屏拍攝的視頻錄制完成合成的視頻是會帶旋轉角度的,旋轉角度以錄制的第一段為準。
- 如果是專業版,在編輯之后調用合成接口合成的視頻將會輸出一個不帶角度的視頻。比如原始視頻為360/640,角度:270變為640 /*360,由于基礎版和標準版只有錄制功能,如果橫屏拍攝會得到一個帶旋轉角度的視頻,這個視頻是以拍攝時第一段的角度為準的。專業版錄制時的行為同基礎版和標準版,合成完成后視頻不帶角度,轉換為一個角度為0,寬高變換的視頻。
/**
* 設置視頻旋轉角度值
* @param rotation
*/
void setRotation(int rotation);
接口調用條件:設置旋轉角度需要在初始化完成之后設置,且需要保證錄制第一段之前調用。
- 設置界面豎屏,讓界面的UI元素旋轉,引導您拍攝橫屏的視頻。
- 同普通錄制的初始化。
- 在調用開始錄制前調用,注意旋轉角度需要您自己獲取,可以參考Demo使用OrientationDetector來獲取方向。
mRecorder.setRotation(int rotation);
- 繼續錄制步驟,注意每次調用startRecording前都需要設置旋轉角度以此來確定每段視頻的旋轉角度。
拍攝添加背景音樂,完成后調用finishRecordForEditor,音樂沒有合成進去,是什么原因?
- finishRecording有兩個作用,一是錄制多段的時候,調用該接口可以將多段拼接成一個mp4,也就是錄制指定的輸出文件,二是添加了背景音樂后,調用該接口會把背景音樂合成進這個輸出mp4中,無論是多段還是單段都可以。
- finishRecordForEditor不會拼接多段視頻,也不會將背景音樂合成到輸出mp4文件中,而是僅僅將錄制的片段(startRecording > stopRecording之后就會生成一個片段),按照指定的格式配置到project.json文件中(創建Editor時傳入的Uri就是該文件的Uri)。
先調用finishRecording將視頻拼接成輸出地址的mp4,然后將該mp4用AliyunIImport接口導入到編輯界面。
錄制界面添加普通動圖顯示效果不完整,該怎么解決?
AliyunIRecorder#addPaster(EffectPaster effectPaster,float sx,float sy,float sw,float sh,float rotation,boolean flip)
其中sw和sh參數需要符合素材寬高和屏幕寬高的比列。例如:素材的寬高分別為200、300,屏幕的寬高分別為540、720。則sw = (float)200/540, sh = (float)300/720
。sx、sy是歸一化的屏幕比例參數,坐標是以資源的中心點作為錨點的。
視頻編輯
編輯時添加特效,使用AliyunICompose.compose合成出來的視頻不帶特效,是什么原因?
V3.5.0及以前的版本,要把編輯預覽的特效持久化到本地的配置文件中,需要調用AliyunIEditor.onPause接口,如果沒有調用,則特效配置不會持久化到本地文件中,那么通過AliyunICompose接口反序列化生成的Project就不帶特效,也就導致合成出來的視頻不帶特效。
編輯時,調用applyMusic。添加音樂后,設置了startTime,為什么每次音樂流都從0開始播,而不是從startTime開始?
查看接口文檔EffectBean類里對startTime的解釋,startTime指的是特效在主流上的作用時間,并不是指素材流的起始時間,在V3.6.0版本之后增加了一個streamStartTime參數,這個參數是表示素材流的起始時間,即有這種需求的開發者,在V3.6.0及以后的版本中可以通過接口參數配置實現,但是V3.6.0之前的版本,只能由開發者先對素材流做裁剪,然后用裁剪的音樂去做背景音樂。
如何添加gif作為主體流?
V3.7.0以下版本,gif格式的文件是作為圖片類型導入;V3.7.0及以上版本,gif格式的文件如果作為視頻類型導入,則當做視頻播放gif所有幀,如果作為圖片類型導入,則作為圖片播放第一幀。
為什么設置完轉場或者applySourceChange之后,視頻卡住不動了?
需要您在進行這些操作之后調用mAliyunIEditor.play()接口。