点播与本地播放大部分流程差不多,只是一个网络一个是本地。今天介绍一下基于libvlc的android播放器,点播与本地播放部分流程。


参考文章:

VLC for Android编译出AAR文件(最新vlc代码)(https://blog.csdn.net/u010735007/article/details/108141213)
基于libvlc aar的android播放器实例(https://blog.csdn.net/u010735007/article/details/108168267)
基于libvlc aar的android播放器(点播与本地播放)(https://blog.csdn.net/u010735007/article/details/108424493)
基于libvlc aar的android截屏和录制视频功能(https://blog.csdn.net/u010735007/article/details/108517985)
android,ios,linux多平台libvlc api文档说明笔记(不断更新)(https://blog.csdn.net/u010735007/article/details/108198711)

一.本地播放与点播最大区别就是设置播放源方法,下面就是设置播放源的代码:
1.本地播放
try {
     final Media media = new Media(mLibVLC, getAssets().openFd(ASSET_FILENAME));
     mMediaPlayer.setMedia(media);
     media.release();
     mMediaPlayer.play();
 } catch (IOException e) {
     e.printStackTrace();
 }
2.点播
Uri uri = Uri.parse("http://xxxx/xxx.mp4");//rtsp流地址或其他流地址
final Media media = new Media(mLibVLC, uri);
mMediaPlayer.setMedia(media);
media.release();
mMediaPlayer.play();
二.主要部分代码介绍
1.主要流程

在这里插入图片描述

里面还有状态的用处不知道什么意思,ESDeleted,ESSelected,ESAdded,到时候观察一下源代码在介绍一下

2.播放控制条

播放控制条一般包括播放,暂停,时间进度条,总时间,当前播放时间,加载框
在这里插入图片描述

//根据buffer显示加载框
else if (event.type == MediaPlayer.Event.Buffering){
    Log.d(TAG, "VLC Buffering:" + event.getBuffering());
    if (event.getBuffering() >= 100)
        progressBar.setVisibility(View.GONE);
    else
        progressBar.setVisibility(View.VISIBLE);
}
//获取总时间
else if (event.type == MediaPlayer.Event.Playing){
    time_total.setText(stringForTime((int)mMediaPlayer.getLength()));
}
//获取当前时间
else if (event.type == MediaPlayer.Event.TimeChanged){
    time_current.setText(stringForTime((int) event.getTimeChanged()));
}
//获取当前时间占总时间的比率
else if (event.type == MediaPlayer.Event.PositionChanged){
    mProgress.setProgress((int)(event.getPositionChanged()*100));
}
//设置播放还是停止
play_pause.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if(mMediaPlayer.isPlaying()){
            mMediaPlayer.pause();
            play_pause.setImageResource(R.drawable.media_pause2);
        }
        else {
            mMediaPlayer.play();
            play_pause.setImageResource(R.drawable.media_play);
        }
    }
});
3.片源信息,音轨和子画面(字幕)等设置

使用ffprobe查看片源的信息(电影文件需要自己下载)
在这里插入图片描述

视频流:Stream #0:0(eng): Video: h264 (High), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
音频流1:Stream #0:1(por): Audio: aac (LC), 48000 Hz, stereo, fltp (default) (forced)
音频流2:Stream #0:2(eng): Audio: aac (LC), 48000 Hz, stereo, fltp
字幕流1:Stream #0:3(por): Subtitle: subrip
字幕流2:Stream #0:4(por): Subtitle: subrip (default) (forced)

1)片源信息
在这里插入图片描述

//获取片源信息
Media.AudioTrack audioTrack = (Media.AudioTrack) media.getTrack(i);
info = info + "音频"+i+"\n" + "编码:" + audioTrack.codec + "\n"+ "声道:" + audioTrack.channels + "\n"
        + "采样率:" + audioTrack.rate + "Hz\n\n";
        
Media.VideoTrack videoTrack = (Media.VideoTrack) media.getTrack(i);
info = info + "视频"+i+"\n" + "编码:" + videoTrack.codec + "\n"+
        "分辨率:" + videoTrack.width + "*" + videoTrack.height  + "\n"
        + "帧率:" + videoTrack.frameRateNum + "\n\n";

2)音轨设置
在这里插入图片描述

//获取全部音轨
final MediaPlayer.TrackDescription[] audioTracks = mediaPlayer.getAudioTracks();
//设置当前使用哪个音轨
mediaPlayer.setAudioTrack(audioTracks[i].id);

3)字幕设置
在这里插入图片描述

//获取全部子画面(字幕)
final MediaPlayer.TrackDescription[] spuTracks = mediaPlayer.getSpuTracks();
//设置当前使用哪个子画面(字幕)
mediaPlayer.setSpuTrack(spuTracks[i].id);

子画面常用是字幕,也可能其他,暂时还没有发现其他类型子画面

具体的代码,大家可以下载,git地址:https://gitee.com/newpoyang/vlc-player,本人喜欢用码云,国内服务器比较快

如有用到此功能的朋友,可以留言交流和点赞

更多推荐