【VLC-Android】vlc-android簡例

來源:互聯網
上載者:User

標籤:

前言

  繼續折騰vlc,做這個例子並不順利,卡在只有聲音沒有映像這個問題好久,網上的例子有些API已經對不上,繼續分享,,,

 

聲明
  歡迎轉載,但請保留文章原始出處:)
    部落格園:http://www.cnblogs.com
    農民伯伯: http://over140.cnblogs.com

 

本文

  

    

  項目

    

  代碼

public class VlcVideoActivity extends Activity implements SurfaceHolder.Callback, IVideoPlayer {    private final static String TAG = "[VlcVideoActivity]";    private SurfaceView mSurfaceView;    private LibVLC mMediaPlayer;    private SurfaceHolder mSurfaceHolder;        private View mLoadingView;    private int mVideoHeight;    private int mVideoWidth;    private int mVideoVisibleHeight;    private int mVideoVisibleWidth;    private int mSarNum;    private int mSarDen;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_video_vlc);        mSurfaceView = (SurfaceView) findViewById(R.id.video);        mLoadingView = findViewById(R.id.video_loading);        try {            mMediaPlayer = VLCInstance.getLibVlcInstance();        } catch (LibVlcException e) {            e.printStackTrace();        }        mSurfaceHolder = mSurfaceView.getHolder();        mSurfaceHolder.setFormat(PixelFormat.RGBX_8888);        mSurfaceHolder.addCallback(this);        mMediaPlayer.eventVideoPlayerActivityCreated(true);        EventHandler em = EventHandler.getInstance();        em.addHandler(mVlcHandler);        this.setVolumeControlStream(AudioManager.STREAM_MUSIC);        mSurfaceView.setKeepScreenOn(true);        //        mMediaPlayer.setMediaList();        //        mMediaPlayer.getMediaList().add(new Media(mMediaPlayer, "http://live.3gv.ifeng.com/zixun.m3u8"), false);        //        mMediaPlayer.playIndex(0);        mMediaPlayer.playMRL("http://live.3gv.ifeng.com/zixun.m3u8");    }    @Override    public void onPause() {        super.onPause();        if (mMediaPlayer != null) {            mMediaPlayer.stop();            mSurfaceView.setKeepScreenOn(false);        }    }    @Override    protected void onDestroy() {        super.onDestroy();        if (mMediaPlayer != null) {            mMediaPlayer.eventVideoPlayerActivityCreated(false);            EventHandler em = EventHandler.getInstance();            em.removeHandler(mVlcHandler);        }    }    @Override    public void onConfigurationChanged(Configuration newConfig) {        setSurfaceSize(mVideoWidth, mVideoHeight, mVideoVisibleWidth, mVideoVisibleHeight, mSarNum, mSarDen);        super.onConfigurationChanged(newConfig);    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        if (mMediaPlayer != null) {            mSurfaceHolder = holder;            mMediaPlayer.attachSurface(holder.getSurface(), this);        }    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        mSurfaceHolder = holder;        if (mMediaPlayer != null) {            mMediaPlayer.attachSurface(holder.getSurface(), this);//, width, height        }        if (width > 0) {            mVideoHeight = height;            mVideoWidth = width;        }    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        if (mMediaPlayer != null) {            mMediaPlayer.detachSurface();        }    }    @Override    public void setSurfaceSize(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den) {        mVideoHeight = height;        mVideoWidth = width;        mVideoVisibleHeight = visible_height;        mVideoVisibleWidth = visible_width;        mSarNum = sar_num;        mSarDen = sar_den;        mHandler.removeMessages(HANDLER_SURFACE_SIZE);        mHandler.sendEmptyMessage(HANDLER_SURFACE_SIZE);    }    private static final int HANDLER_BUFFER_START = 1;    private static final int HANDLER_BUFFER_END = 2;    private static final int HANDLER_SURFACE_SIZE = 3;    private static final int SURFACE_BEST_FIT = 0;    private static final int SURFACE_FIT_HORIZONTAL = 1;    private static final int SURFACE_FIT_VERTICAL = 2;    private static final int SURFACE_FILL = 3;    private static final int SURFACE_16_9 = 4;    private static final int SURFACE_4_3 = 5;    private static final int SURFACE_ORIGINAL = 6;    private int mCurrentSize = SURFACE_BEST_FIT;    private Handler mVlcHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            if (msg == null || msg.getData() == null)                return;            switch (msg.getData().getInt("event")) {            case EventHandler.MediaPlayerTimeChanged:                break;            case EventHandler.MediaPlayerPositionChanged:                break;            case EventHandler.MediaPlayerPlaying:                mHandler.removeMessages(HANDLER_BUFFER_END);                mHandler.sendEmptyMessage(HANDLER_BUFFER_END);                break;            case EventHandler.MediaPlayerBuffering:                break;            case EventHandler.MediaPlayerLengthChanged:                break;            case EventHandler.MediaPlayerEndReached:                //播放完成                break;            }        }    };    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {            case HANDLER_BUFFER_START:                showLoading();                break;            case HANDLER_BUFFER_END:                hideLoading();                break;            case HANDLER_SURFACE_SIZE:                changeSurfaceSize();                break;            }        }    };    private void showLoading() {        mLoadingView.setVisibility(View.VISIBLE);    }    private void hideLoading() {        mLoadingView.setVisibility(View.GONE);    }    private void changeSurfaceSize() {        // get screen size        int dw = getWindowManager().getDefaultDisplay().getWidth();        int dh = getWindowManager().getDefaultDisplay().getHeight();        // calculate aspect ratio        double ar = (double) mVideoWidth / (double) mVideoHeight;        // calculate display aspect ratio        double dar = (double) dw / (double) dh;        switch (mCurrentSize) {        case SURFACE_BEST_FIT:            if (dar < ar)                dh = (int) (dw / ar);            else                dw = (int) (dh * ar);            break;        case SURFACE_FIT_HORIZONTAL:            dh = (int) (dw / ar);            break;        case SURFACE_FIT_VERTICAL:            dw = (int) (dh * ar);            break;        case SURFACE_FILL:            break;        case SURFACE_16_9:            ar = 16.0 / 9.0;            if (dar < ar)                dh = (int) (dw / ar);            else                dw = (int) (dh * ar);            break;        case SURFACE_4_3:            ar = 4.0 / 3.0;            if (dar < ar)                dh = (int) (dw / ar);            else                dw = (int) (dh * ar);            break;        case SURFACE_ORIGINAL:            dh = mVideoHeight;            dw = mVideoWidth;            break;        }        mSurfaceHolder.setFixedSize(mVideoWidth, mVideoHeight);        ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();        lp.width = dw;        lp.height = dh;        mSurfaceView.setLayoutParams(lp);        mSurfaceView.invalidate();    }}

    代碼說明 

      1、vlc-android的版本為2.2.0-pre1 Weatherwax

      2、拷貝vlc-android官網例子下面org.videolan.libvlc所有的類,以及VLCInstance、 Preferences。只有聲音沒有畫面就出在VLCInstance這個問題上,少了一些配置,參考 VLCInstance.updateLibVlcSettings。

      3、playMRL不要用Uri來轉,否則打不開

      4、提供的代碼已經編譯好了so,也修改源碼開啟了EventHandler.MediaPlayerBuffering(也修改了libvlcjni.c),但是還是沒有緩衝進度的值,還有待進一步探索。

      5、實際發現如果只在surfaceChanged中attachSurface,setSurfaceSize回調不會觸發,需要同時在surfaceCreated中設定。

      6、本文不討論Handler非靜態可能引發記憶體泄露的問題,大家寫的時候自己注意一下 :) 

 

  下載

    https://github.com/over140/vlc-android-demo (注意工程是Android Studio的工程)

 

  文章

    1、vlc-android 中調用用libvlcjni.so實現流媒體播放 

    2、[Github]vlc-android-macbuild

    3、vlc android的編譯及,錄製視頻等功能

    4、vlc-android源碼編譯過程記錄

    5、vlc-android 擷取MediaPlayerEncounteredError,MediaPlayerBuffering等各種事件的響應

    6、Vlc-for-android源碼分析

 

結束

   文章2的GitHub項目是對vlc進行封裝,也挺不錯了,值得參考。vlc-android的例子寫的比較複雜,而且api可能老變,大家看文章的時候注意一下版本問題。

【VLC-Android】vlc-android簡例

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.