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同時又比較急用到這個的同學,可以實現幫你快速整合使用到音訊視訊播放功能(就是上面各模組使用那幾句程式碼,使用非常簡單),當然你也可以快速自定義實現自己的需求。