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

在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同时又比较急用到这个的同学,可以实现帮你快速集成使用到音频视频播放功能(就是上面各模块使用那几句代码,使用非常简单),当然你也可以快速自定义实现自己的需求。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
很高兴能够回答您的问题。以下是一个简单的示例代码,可以用于在 Android集成 VLC 播放: 1. 在您的项目中添加以下依赖项: ``` implementation "de.mrmaffen:vlc-android-sdk:3.2.0@aar" ``` 2. 在您的布局文件中添加一个 SurfaceView: ``` <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在您的 Activity 中初始化 VLC: ``` import android.net.Uri; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import androidx.appcompat.app.AppCompatActivity; import org.videolan.libvlc.LibVLC; import org.videolan.libvlc.Media; import org.videolan.libvlc.MediaPlayer; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback { private SurfaceView surfaceView; private LibVLC libVLC; private MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = findViewById(R.id.surfaceView); surfaceView.getHolder().addCallback(this); libVLC = new LibVLC(this); mediaPlayer = new MediaPlayer(libVLC); } @Override public void surfaceCreated(SurfaceHolder holder) { mediaPlayer.getVLCVout().setVideoSurface(holder.getSurface(), holder); mediaPlayer.getVLCVout().attachViews(); Media media = new Media(libVLC, Uri.parse("http://example.com/video.mp4")); mediaPlayer.setMedia(media); mediaPlayer.play(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mediaPlayer.stop(); mediaPlayer.getVLCVout().detachViews(); } @Override protected void onDestroy() { mediaPlayer.release(); libVLC.release(); super.onDestroy(); } } ``` 请注意,上述示例中的视频 URL 仅用作示例。您应该在 `Uri.parse()` 中使用实际的视频 URL。同时,这只是一个简单的示例,您可能需要对代码进行修改,以满足您的特定需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值