標籤:
將vlc-android 中org.videolan.vlc包下面的這幾個class 添加:
Aout.java
BitmapCache.java
EventManager.java
LibVLC.java
LibVlcException.java
TrackInfo.java
Util.java
VLCApplication.java
WeakHandler.java
3.將源碼編譯出的libs下的armeabi-v7a(如果設裝置是arm6 或者以下,是armeabi)檔案夾添加在android工程的libs下面
uri = "rtsp://217.146.95.166:554/live/ch6bqvga.3gp"是我在網上隨便找的一個rtsp 流媒體地址
主要的部分是:
a. mLibVLC = LibVLC.getInstance(); 用來擷取mLIbVLC的執行個體,其中會初始化LibVLC,在AndroidManifest.xml中要添加 android:name="org.videolan.vlc.VLCApplication"這樣程式啟動時會調用VLCApplication使其 產生執行個體,不會導致LibVLC.getInstance()出錯。
b.mLibVLC.readMedia(uri, false);調用這一句後如果uri地址可用,流媒體就開始在載入,並且播放,並不需要mLibVLC.play()。
c.mLibVLC.attachSurface(mSurfaceHolder.getSurface(), MainActivity.this,width,height);調用這句的時候如果視頻不顯示,介面突然退出,是因為沒有添加:public void setSurfaceSize(int width, int height, int sar_num, int sar_den)這個函數(我編譯源碼的時候ANDROID_ABI=armeabi-v7a,ANDROID_ABI設定不同這個函數的參數不同),它 在libvlcjni.c 的jni_SetAndroidSurfaceSize函數中調用,用來設定surfaceview大小的。
如果需要硬體解碼,就需要添加以下方法:
[java] view plaincopy
private void enableIOMX(boolean enableIomx){
SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(VLCApplication.getAppContext());
Editor e = p.edit();
e.putBoolean("enable_iomx", enableIomx);
LibVLC.restart();
}
將sharedpreferences 的key "enable_iomx‘設定為true,因為libvlcjni.c 中通過函數libvlc_media_t *new_media(jlong instance, JNIEnv *env, jobject thiz, jstring fileLocation, bool noOmx, bool noVideo)調用java 代碼LibVLC.java 中的useIOMX()擷取“enable_iomx”的值,然後判斷是否用硬體解碼。
在調試的過程中還會出現的錯誤是因為:Util.java 中String ANDROID_ABI = properties.getProperty("ANDROID_ABI");調用屬性“ANDROID_ABI”的值時返回的是null導致,這主要 發生在LibVLC.getInstance();時,自己判斷一下,如果為ANDROID_ABI==null,就根據自己的裝置選擇賦值 “armeabi-v7a”或者“armeabi”.
[html] view plaincopy
mEventManger = EventManager.getInstance();
mEventManger.addHandler(mEventHandler);
是用來添加播放事件的,當播放視頻出現play,stop,pause等狀態時,會接收到。
VLC for android 使用手記