全部產品
Search
文件中心

ApsaraVideo VOD:Android端短視頻SDK常見問題

更新時間:Jan 24, 2026

本文主要介紹短視頻SDK在Android端的使用問題。

SDK整合

安卓指令集的相容情況如何?

如果專案只接入armeabi,則需要將SDK包中的armeabi_v7a檔案內的so檔案拷貝到專案的armeabi檔案夾內。

整合SDK後,Debug版本可以正常運行,但是Release版本啟動就崩潰,該怎麼解決?

問題現象:整合SDK後,Debug版本可以正常運行,但是Release版本啟動就崩潰。

可能原因:混淆配置錯誤

解決方案:

  1. 先檢查崩潰的log是否是報JNI找不到對應的Java類。

    • 如果是的話,一般來說就是混淆導致的,因為JNI調用Java類用的是反射,所以如果混淆把SDK內部與JNI有關的類混淆了,則JNI載入時將無法找到對應的Java類,就會載入失敗。

    • 如果不是,則可以提交工單,擷取阿里雲支援人員。

  2. 把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.xmlactivity_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) ,該如何解決?

目前主要原因是基礎版SDK的UI不開源,所以內部是引用了support包的,但是打成AAR時是沒有將support包打入的,這就導致ID不對應的情況。目前需要您將support版本包對應,如下:

//重要:如果工程中引入第三方庫也引入了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()回調之後調用,否則將不會顯示貼圖。

如何設定錄製角度?

目前設定錄製角度有setRotationsetRecordRotation兩個介面,setRotation介面是一個自適應介面,只要nin把手機角度感應器返回的角度值傳給這個介面,就可以得到正確的錄製角度和人臉角度。setRecordRotation介面是自訂的視頻角度介面,可以根據您的需求定製任意角度值。

如何?橫屏錄製?

  • 您如果需要預設橫屏只需要將介面UI元素旋轉引導橫屏拍攝視頻,不需要設定介面橫屏,讓介面固定豎屏即可。

    android:screenOrientation="portrait"
  • 橫屏拍攝的視頻錄製完成合成的視頻是會帶旋轉角度的,旋轉角度以錄製的第一段為準。

  • 如果是專業版,在編輯之後調用合成介面合成的視頻將會輸出一個不帶角度的視頻。比如原始視頻為360/640,角度:270變為640 /*360,由於基礎版和標準版只有錄製功能,如果橫屏拍攝會得到一個帶旋轉角度的視頻,這個視頻是以拍攝時第一段的角度為準的。專業版錄製時的行為同基礎版和標準版,合成完成後視頻不帶角度,轉換為一個角度為0,寬高變換的視頻。

關鍵介面函數:

/**
* 設定視頻旋轉角度值
* @param rotation
*/
void setRotation(int rotation);

介面調用條件:設定旋轉角度需要在初始化完成之後設定,且需要保證錄製第一段之前調用。

叫用作業步驟:讓介面固定豎屏,然後設定旋轉角度即可。

  1. 設定介面豎屏,讓介面的UI元素旋轉,引導您拍攝橫屏的視頻。

  2. 同普通錄製的初始化。

  3. 在調用開始錄製前調用,注意旋轉角度需要您自己擷取,可以參考Demo使用OrientationDetector來擷取方向。

    mRecorder.setRotation(int rotation);
  4. 繼續錄製步驟,注意每次調用startRecording前都需要設定旋轉角度以此來確定每段視頻的旋轉角度。

拍攝添加背景音樂,完成後調用finishRecordForEditor,音樂沒有合成進去,是什麼原因?

添加背景音樂後,必須調用finishRecording介面,才會把音樂合成進去,否則不會合成進去,造成進到編輯介面無音樂的結果。finishRecordingfinishRecordForEditor之間的區別如下:

  • 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()介面。