基于libvlc aar的android播放器实例

您所在的位置:网站首页 libvlc播放器 基于libvlc aar的android播放器实例

基于libvlc aar的android播放器实例

2024-06-07 11:32| 来源: 网络整理| 查看: 265

之前我在服务器里面已经编译出aar包(VLC for Android编译出AAR文件)因为有了aar包做一些事情就简单多了,不像以前的so库,接口很多都要自己写,现在基于aar包去制作自己的android播放器 参考文章: VLC for Android编译出AAR文件(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) VLC-3.0全部详细参数(https://blog.csdn.net/avsuper/article/details/80145439)

VLC也有自己的的例子,包括了java和native方式,下载方法:git clone https://code.videolan.org/videolan/libvlc-android-samples.git

不过VLC例子的build.gradle问里面,org.videolan.android:libvlc-all:3.1.12会编译开始会下载这个aar包,不用墙过去的话,会下载很慢

dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'org.videolan.android:libvlc-all:3.1.12' }

接下来开始基于aar包去制作自己的android播放器,名称暂定vlc-player,播放直播和点播

一.效果演示: 1.直播

在这里插入图片描述 在这里插入图片描述

2.点播

在这里插入图片描述点播是多了进度条功能

二.apk配置注意地方:

在build.gradle里面,配置libs的路径,使app/libs成为项目的一部分

android { ... repositories{ flatDir{ dirs 'libs' } } }

然后去掉了自动下载的aar配置,使用本地的arr

dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) ... //implementation 'org.videolan.android:libvlc-all:3.1.12' implementation(name: 'libvlc-all-3.2.6', ext: 'aar')//使用本地aar }

由于包有70多M,build.gradle里面,只配置armeabi-v7a,x86这2个cpu类型,生成的apk只有30多M,也兼容64位的cpu。唯一比较大的问题64位的cpu的最好效果没有发挥出来,等抽时间再裁剪一下vlc内部。

defaultConfig { ... ndk { //选择要添加的对应cpu类型的.so库。 abiFilters 'armeabi-v7a','x86' } } 三.apk主要代码分析:

下面代码段主要初始化vlc,args是vlc的参数配置,后期用的比较多。"–rtsp-tcp"是加快rtsp加载视频速度,因为apk会应用安防的比较多,对速度和实时性要求比较高

final ArrayList args = new ArrayList();//VLC参数 args.add("--rtsp-tcp");//强制rtsp-tcp,加快加载视频速度 args.add("--live-caching=0"); args.add("--file-caching=0"); args.add("--network-caching=0");//增加实时性,延时大概2-3秒 mLibVLC = new LibVLC(this, args); mMediaPlayer = new MediaPlayer(mLibVLC); mVideoLayout = findViewById(R.id.video_layout);

下面代码设置播放地址和开始播放

mMediaPlayer.attachViews(mVideoLayout, null, ENABLE_SUBTITLES, USE_TEXTURE_VIEW); mMediaPlayer.setVideoScale(MediaPlayer.ScaleType.SURFACE_BEST_FIT); Uri uri = Uri.parse("http://nclive.grtn.cn/gdws/sd/live.m3u8?_upt=0704702d1598088562");//rtsp流地址或其他流地址 final Media media = new Media(mLibVLC, uri); mMediaPlayer.setMedia(media); media.release(); mMediaPlayer.play();

下面代码段主要监听播放器状态,用于扩展各种应用

//监听播放状态 mMediaPlayer.setEventListener(new MediaPlayer.EventListener() { @Override public void onEvent(MediaPlayer.Event event) { if (event.type == MediaPlayer.Event.Opening) { Log.d(TAG, "VLC Opening"); progressBar.setVisibility(View.VISIBLE); } 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){ Log.d(TAG, "VLC Playing"); } else if (event.type == MediaPlayer.Event.Stopped){ Log.d(TAG, "VLC Stopped"); progressBar.setVisibility(View.GONE); } else if (event.type == MediaPlayer.Event.EncounteredError){ Log.d(TAG, "VLC EncounteredError"); progressBar.setVisibility(View.GONE); error_text.setVisibility(View.VISIBLE); error_text.setText("播放错误"); } else if (event.type == MediaPlayer.Event.Vout){ Log.d(TAG, "VLC Vout"+ event.getVoutCount()); mHandler.sendEmptyMessageDelayed(UPDATE_SCREEN, 1000); } } }); }

重点介绍一下setAspectRatio(宽高比)的方法,vlc问题最多出现在跟据屏幕和view宽高拉伸和缩放。不配置宽高比的话,会使用MediaPlayer.ScaleType.SURFACE_BEST_FIT,具体它是怎么best fit,不是很清楚,但是比例效果是有问题的。setAspectRatio其实很简单就是获取屏幕和view宽高,然后转成字符串(宽:高)传到这个方法就可以了,如下代码

case UPDATE_SCREEN: //frame的屏幕大小 screen_width = frame_layout.getWidth(); screen_height = frame_layout.getHeight(); Log.d(TAG, "screen_width:" + screen_width + " screen_height:" + screen_height); mMediaPlayer.getVLCVout().setWindowSize(screen_width, screen_height); mMediaPlayer.setAspectRatio(screen_width + ":" + screen_height);//设置屏幕比例 mMediaPlayer.setScale(0); break; case UPDATE_FULL_SCREEN: mMediaPlayer.getVLCVout().setWindowSize(full_screen_height, full_screen_width); mMediaPlayer.setAspectRatio(full_screen_height + ":" + full_screen_width);//设置屏幕比例 mMediaPlayer.setScale(0); break;

还有MediaPlayer.Event.Vout应该是Video渲染view时出现监听的状态,设置屏幕宽高比最为合适,早了不起作用,晚了出现视频拉伸的动画

四.以model方式调用libvlc,提高效率:

这段时间在开发过程中发现aar有点庞大而且放到香港服务器,编译通过后下载到本地调试很麻烦,还有vlc源代码有些bug和一些功能没有打开,效率特别低。因此把libvlc的代码作为model加入播放器程序,进行调试

具体移植的过程就忽略,我的代码里面已经完成了,可以参考。唯一的主要是下面部分

修改app的build.gradle文件,编译通过即可

//implementation(name: 'libvlc-all-3.3.0-eap17', ext: 'aar') implementation project(path: ':libvlc')

linux端使用compile-libvlc.sh编译对应架构,得出so文件进行调试即可,发布的时候再编译出aar

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

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



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3