1. 程式人生 > >Android VLC音訊視訊播發器快速整合教程與模組

Android VLC音訊視訊播發器快速整合教程與模組

前言

通過該文,你能很簡單的知道怎麼使用vlc,並且通過封裝好的方法,很簡單的幾句程式碼就能實現音訊視訊本地與線上播放。

目前的效果顯示如下:

音訊效果(介面圖示拿去了網易雲音樂的圖示):

這裡寫圖片描述

視訊效果:

這裡寫圖片描述

一、vlc核心程式碼簡述

這部分主要簡述一下vlc的比較基礎的類,通過這些簡述,你可以對vlc的核心程式碼有一定了解。

libvlc包

下載官方原始碼,會包括一個libvlc的資源包,這個包是vlc的核心程式碼,裡面包括了一下播放要支援的庫,還有一些基礎了類,不用管太多,引用這個包就是了,

Media類

這個是封裝多媒體資料類,主要是包括了一些播放檔案的資訊資料,如下:

 /** Metadata from libvlc_media */
    protected String mTitle;//標題
    private String mArtist;//藝術家
    private String mGenre;//專輯
    private String mCopyright;//著作、版權
    private String mAlbum;//相簿
    private int mTrackNumber;//磁軌數、曲目號碼
    private String mAlbumArtist;//專輯作者
    private String mDescription;//描述
private String mRating;//評分 private String mDate;//日期 private String mSettings;//設定 private String mNowPlaying;//正在播放 private String mPublisher;//出版社 private String mEncodedBy;//編輯人 private String mTrackID;//軌道id private String mArtworkURL;//

在vlc的播放模組原始碼中,你會發現有個MediaDatabase的類,就是儲存了這個些資料,所以這個類作用就是將一個播放檔案路徑轉化為一個Media格式的資料,這資料提供了該播放檔案的的一些資訊,當然這個檔案應該是本來檔案,獲取到一些標頭檔案資訊而已。

將本地檔案路徑轉化為Media使用也很簡單:

 /**
     * Create a new Media
     * @param libVLC A pointer to the libVLC instance. Should not be NULL
     * @param URI The URI of the media.
     */
    public Media(LibVLC libVLC, String URI) {
        if(libVLC == null)
            throw new NullPointerException("libVLC was null");

        mLocation = URI;

        mType = TYPE_ALL;
        TrackInfo[] tracks = libVLC.readTracksInfo(mLocation);

        extractTrackInfo(tracks);
    }

2.MediaList

對於是可能播放多個檔案怎麼辦,怎麼統一進行管理?那就是MediaList這個類了,這個類的作用就是多個播放的Media進行管理。

3.MediaListPlayer

可以知道了,將本地播放多媒體路徑,轉化為了一個播放使用的資訊類Media,同時將這個Media放到統一管理的集合裡面MediaList進行。那怎麼進行播放,這就是MediaListPlayer了。這個類的作用是持有MediaList類,並播放指定的Media。所以想要播放很簡單,獲取到MediaList,然後新增一個Media到裡面,然後播放指定的media就是了。

    //建立控制的MediaListPlayer
        MediaListPlayer player = new MediaListPlayer(mLibVlc);
        String path = Environment.getExternalStorageDirectory() + "/musictest/vedio/tv01.mp4";
        String mLocation = LibVLC.PathToURI(path);
        //將本地路徑傳入,生成一個media格式資料
        Media m = new Media(mLibVlc, mLocation);
        //新增Media進去
        player.getMediaList().add(m);       
        //播放該    Media
        player.playIndex(0);

到現在為止,只需要幾句程式碼就可以實現用vlc播放本地檔案了,是不是很簡單,哈哈,那麼接下來再深入一點。

4.LibVLC

這個類很長,其實也沒什麼,大概作用就是,呼叫native方法對多媒體進行播放,並提供了一些播發器基本需要的方法,比如如下:

  public native void playMRL(String mrl, String[] mediaOptions);//這個是播放網路路徑
   public native boolean isPlaying();
   public native boolean isSeekable();
    public native void play();
    public native void pause();
    public native void stop();
    public native int getPlayerState();
    public native int getVolume();
    public native int setVolume(int volume);
    public native long getTime();
    public native long setTime(long time);
    public native float getPosition();
    public native void setPosition(float pos);
    public native long getLength();

所以也沒啥,只需要呼叫這個類,你就可以對播放進行控制比如,停止播放、開始播放等等,也可以獲取一下播放資訊,比如時間、進度、是否播放中等等。記得與上面的MediaListPlayer區分開來,MediaListPlayer是對media進行控制,決定要播放那個media,並能對MediaList進行資料管理,而LibVLC是對播放控制,就是播放過程的控制,不大一樣的。

5.IVideoPlayer

通過上面幾個類,怎麼使用播放一個多媒體檔案並如何實現播放的控制,詳細你已經知道大概怎麼做了。但是還是有很多細節沒有知道怎麼做,比如視訊播放的話怎麼處理事看到畫畫,上面的下來估計你只能聽到聲音。IVideoPlayer這個類的作用控制視訊播放時顯示的大小的。有些視訊比較高清,可以顯示大一點,有些視訊顯示小一點,我的理解是這樣哈哈,就是控制顯示畫面大小就是了。

二、模組api封裝

通過上面的簡述,大概知道如何使用vlc進行播放了,但是還是需求我們封裝一下時適合我們使用,官網的原始碼就很難用了。你也可以自己封裝,下面記錄一下我封裝好的使用模組,目的是為了使用更簡單起來。主要包括兩個模組,視訊與音訊,因為兩個還是有些區別的。通過下面,你可以通過非常簡單的程式碼就可以使用vcl實現播發器基本的功能操作開發。

1.VLCInstance

這個其實就是獲取例項,Libvlc 中會持有一個例項去儲存,每次使用時我們全域性使用一個就是好了。

public static LibVLC getInstance(){

        LibVLC existlibvlc = LibVLC.getExistingInstance();
        if(existlibvlc==null){
            try {
                return LibVLC.getInstance();
            } catch (LibVlcException e) {               
                e.printStackTrace();
            }
        }

        return existlibvlc;
    }

除了這個之處還有的就是對vlc進行設定,注意的是,如果不進行設定的話,視訊播放可能出現有聲音沒有畫面的情況。所以把官網的程式碼拷過來就是了。

2.音訊播放

音訊播放,我分開了兩個控制器去控制播放。

1.AudioLocalPalyerController: 用於播放本地音訊。程式碼使用如下:

audioloaclcontroller = new AudioLocalPalyerController(mLibVlc);
        //兩個本地音訊檔案路徑,可以新增多個相應要播放的檔案路徑
        String path1 = Environment.getExternalStorageDirectory() + "/musictest/aaa.mp3";
        String path2 = Environment.getExternalStorageDirectory() + "/musictest/想你(國語Beyond.mp3";
        // 將本地路徑傳入,生成一個AudiaLoacalMedia格式資料
        AudiaLoacalMedia m = new AudiaLoacalMedia(path1);
        AudiaLoacalMedia m1 = new AudiaLoacalMedia(path2);
        //新增到控制器去
        audioloaclcontroller.addMedia(m);
        audioloaclcontroller.addMedia(m1);
        // controller.PlayLocalUrl(path2);
        audioloaclcontroller.setOnTimeChangerListsner(new 
        //重新播放,就是從新增的第一個音訊檔案開始播放
        audioloaclcontroller.PlayRestart();

除此之處,PalyerController支援一些最常見的播放操作:

    /** 
     * 重新播放,重新開始播放,沒有播放資料不播放
     * 
     * @param position
     */
    public void PlayRestart();

    /**
     * 繼續播放,沒有記錄不播放
     * 
     * @param position
     */
    public void PlayReSume();

    /**播放下一個多媒體檔案
     * 如果當前已經是最後一個了,不會執行下去
     */
    public void PlayNext();

    /**播放上一個多媒體檔案
     * 如果當前已經是最前一個了,不會執行下去
     */
    public void PlayPre();

    /**
     * 暫停播放
     */
    public void Pause();

    /**
     *獲取播放列表長度
     * @return
     */
    public int getMediaSize();

    /**
     * @return 當前播放的是否是列表的第一個多媒體
     */
    public Boolean isFirst();

    /**
     * @return 當前播放的是否是列表的最後一個多媒體
     */
    public Boolean isLast();

   /**
     * 指定時間播放
     */
   public long setTime(long time);

還可以監聽播放時間:

audioloaclcontroller.setOnTimeChangerListsner(new ITimeChangeListsner() {

            @Override
            public void onTime(long currenttime,long tataltime) {
                Log.e("當前播放時間",currenttime+"");

            }
        });

2.AudioNetPlayerController:網路音訊播放控制器。使用如下:

audionetcontroller = new AudioNetPlayerController(mLibVlc);
        //建立兩個線上播放的AudioNetMedia
        AudioNetMedia media = new AudioNetMedia(
                "http://192.168.1.105:5338/music/%E8%BF%88%E5%85%8B%E5%B0%94%E6%9D%B0%E5%85%8B%E9%80%8A%E5%81%B6%E5%83%8F%E7%9A%84%E4%B8%80%E7%94%9F.mp3");
        AudioNetMedia media1 = new AudioNetMedia(
                "http://192.168.1.105:5338/mu2sic/%E8%BF%88%E5%85%8B%E5%B0%94%E6%9D%B0%E5%85%8B%E9%80%8A%E5%81%B6%E5%83%8F%E7%9A%84%E4%B8%80%E7%94%9F.mp3");
        //新增到控制器去
        audionetcontroller.addMedia(media);
        audionetcontroller.addMedia(media1);
        //重第一首開始播放
        audionetcontroller.PlayRestart();

3.視訊播放
視訊播放也是跟音訊播放一樣,分了兩個控制器分別去控制播放線上視訊檔案與本地視訊檔案。

1.VedioLoaclPlayerController:用於控制本地視訊檔案播放。使用如下:

vedioLoaclPlayerController = new VedioLoaclPlayerController(mLibVlc);
        //兩個本地視訊路徑
        String path1 = Environment.getExternalStorageDirectory() + "/musictest/vedio/tv01.mp4";
        String path2 = Environment.getExternalStorageDirectory() + "/musictest/vedio/tv02.mp4";
        //生成兩個VedioLocalMedia
        VedioLocalMedia m1 = new VedioLocalMedia(path1);        
        VedioLocalMedia m2 = new VedioLocalMedia(path2);
        //新增到控制器
        vedioLoaclPlayerController.addMedia(m1);
        vedioLoaclPlayerController.addMedia(m2);
        //從最開始播放
        vedionetcontroller.PlayRestart();

但是視訊檔案是有畫面的,這樣做只能聽到聲音,還需要一個VedioPlayerView,在xml佈局裡引用它:

 <com.hw.vlcsimplelib.VedioPlayerView
        android:id="@+id/playerview"
        android:layout_width="match_parent"
        android:layout_height="300dp" >
    </com.hw.vlcsimplelib.VedioPlayerView>

然後找到id,進行初始化操作:

VedioPlayerView playerView = (VedioPlayerView) findViewById(R.id.playerview);
//傳入控制器進行初始化操作
playerView.initPlayer(vedionetcontroller);
//從最開始播放
vedionetcontroller.PlayRestart();

這樣很簡單的程式碼就可以使用到vlc進行視訊播放了。同樣,這個控制器還有跟本地音訊控制器AudioLocalPalyerController一樣的操作方法,可以進行上一個、下一個、暫停、時間跳轉、時間監聽等方法操作,非常簡單。

4.VedioNetPlayerController:線上視訊播放控制器,非常簡單就可以使用,程式碼如下:

        //視訊路徑
        String url ="http://192.168.1.105:5338/music/tv01.mp4";
        //生成VedioNetMedia
        VedioNetMedia m = new VedioNetMedia(url);
        //新增到播放控制器
        vedionetcontroller.addMedia(m);
        //初始化
        playerView.initPlayer(vedionetcontroller);
        //播放
        vedionetcontroller.PlayRestart();

三.使用方法

上面只是使用api的封裝,為了能快速整合整個模組,我也對介面進行封裝,封裝成直接傳入引數就可以用的Activity就可以,當然你也可以自己封裝成自己想要的,通過上面的介紹應該很容易就做得到了。

各播放模組使用如下:

1.播放單個本地音訊檔案:

String path = Environment.getExternalStorageDirectory() + "/aaa.mp3";
        AudioLocalMediaPlayActivity.PlayMedia(TestActivity.this, path);

播放多個本地音訊檔案:

AudioLocalMediaPlayActivity.PlayMedias(TestActivity.this, paths);

2.播放單個本地視訊檔案:

    String path = Environment.getExternalStorageDirectory() + "/1.flv";     
        VedioLocalMediaPlayActivity.PlayMedia(TestActivity.this, path);

播放多個本地視訊檔案

VedioNetMediaPlayActyivity.PlayMedias(TestActivity.this, urls);

3.播放單個網路音訊檔案:

String url = "http://192.168.1.105:5338/music/%E8%BF%88%E5%85%8B%E5%B0%94%E6%9D%B0%E5%85%8B%E9%80%8A%E5%81%B6%E5%83%8F%E7%9A%84%E4%B8%80%E7%94%9F.mp3";     
AudioNetNediaPlayActivity.PlayMedia(TestActivity.this, url);

播放多個網路音訊檔案:

AudioNetNediaPlayActivity.PlayMediasTestActivity.this, urls);

4.播放單個網路視訊檔案:

String url = "http://192.168.1.105:5338/music/%E8%BF%88%E5%85%8B%E5%B0%94%E6%9D%B0%E5%85%8B%E9%80%8A%E5%81%B6%E5%83%8F%E7%9A%84%E4%B8%80%E7%94%9F.mp4";
VedioNetMediaPlayActyivity.PlayMedia(TestActivity.this, url);

播放多個網路視訊檔案:

VedioNetMediaPlayActyivity.PlayMedias(TestActivity.this, urls);

5.播放網路直播:

String url = "http://vedio.url";
VedioNetMediaPlayActyivity.PlayMedia(TestActivity.this, url);

後記:當然還有不少小問題,在慢慢改善當中,這篇博文與該小專案的目的是為了幫助不大瞭解android vlc同時又比較急用到這個的同學,可以實現幫你快速整合使用到音訊視訊播放功能(就是上面各模組使用那幾句程式碼,使用非常簡單),當然你也可以快速自定義實現自己的需求。