欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android VLC音频视频播发器快速集成教程与模块

程序员文章站 2022-07-14 19:47:52
...

前言

通过该文,你能很简单的知道怎么使用vlc,并且通过封装好的方法,很简单的几句代码就能实现音频视频本地与在线播放。

转载请务必注明出处:http://blog.csdn.net/u014614038/article/details/53158323


目前的效果显示如下:

音频效果(界面图标拿去了网易云音乐的图标):

Android VLC音频视频播发器快速集成教程与模块


视频效果:

Android 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;//
  • 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

相关标签: Android vlc