Android VLC音频视频播发器快速集成教程与模块
前言
通过该文,你能很简单的知道怎么使用vlc,并且通过封装好的方法,很简单的几句代码就能实现音频视频本地与在线播放。
转载请务必注明出处:http://blog.csdn.net/u014614038/article/details/53158323
目前的效果显示如下:
音频效果(界面图标拿去了网易云音乐的图标):
视频效果:
一、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;//
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
在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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
到现在为止,只需要几句代码就可以实现用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();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
所以也没啥,只需要调用这个类,你就可以对播放进行控制比如,停止播放、开始播放等等,也可以获取一下播放信息,比如时间、进度、是否播放中等等。记得与上面的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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
除了这个之处还有的就是对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();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
除此之处,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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
还可以监听播放时间:
audioloaclcontroller.setOnTimeChangerListsner(new ITimeChangeListsner() {
@Override
public void onTime(long currenttime,long tataltime) {
Log.e("当前播放时间",currenttime+"");
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
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();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
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();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
但是视频文件是有画面的,这样做只能听到声音,还需要一个VedioPlayerView,在xml布局里引用它:
<com.hw.vlcsimplelib.VedioPlayerView
android:id="@+id/playerview"
android:layout_width="match_parent"
android:layout_height="300dp" >
</com.hw.vlcsimplelib.VedioPlayerView>
- 1
- 2
- 3
- 4
- 5
然后找到id,进行初始化操作:
VedioPlayerView playerView = (VedioPlayerView) findViewById(R.id.playerview);
//传入控制器进行初始化操作
playerView.initPlayer(vedionetcontroller);
//从最开始播放
vedionetcontroller.PlayRestart();
- 1
- 2
- 3
- 4
- 5
- 6
这样很简单的代码就可以使用到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();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
三.使用方法
上面只是使用api的封装,为了能快速集成整个模块,我也对界面进行封装,封装成直接传入参数就可以用的Activity就可以,当然你也可以自己封装成自己想要的,通过上面的介绍应该很容易就做得到了。
各播放模块使用如下:
1.播放单个本地音频文件:
String path = Environment.getExternalStorageDirectory() + "/aaa.mp3";
AudioLocalMediaPlayActivity.PlayMedia(TestActivity.this, path);
- 1
- 2
播放多个本地音频文件:
AudioLocalMediaPlayActivity.PlayMedias(TestActivity.this, paths);
- 1
2.播放单个本地视频文件:
String path = Environment.getExternalStorageDirectory() + "/1.flv";
VedioLocalMediaPlayActivity.PlayMedia(TestActivity.this, path);
- 1
- 2
播放多个本地视频文件
VedioNetMediaPlayActyivity.PlayMedias(TestActivity.this, urls);
- 1
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);
- 1
- 2
播放多个网络音频文件:
AudioNetNediaPlayActivity.PlayMediasTestActivity.this, urls);
- 1
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);
- 1
- 2
播放多个网络视频文件:
VedioNetMediaPlayActyivity.PlayMedias(TestActivity.this, urls);
- 1
5.播放网络直播:
String url = "http://vedio.url";
VedioNetMediaPlayActyivity.PlayMedia(TestActivity.this, url);
- 1
- 2
后记:当然还有不少小问题,在慢慢改善当中,这篇博文与该小项目的目的是为了帮助不大了解android vlc同时又比较急用到这个的同学,可以实现帮你快速集成使用到音频视频播放功能(就是上面各模块使用那几句代码,使用非常简单),当然你也可以快速自定义实现自己的需求。
版权声明:本文为楠之枫雪的原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014614038/article/details/53158323