我的Android播放器封装经验

近段时间,电视家不能用了,好吧,自己开发一个APP。其实也不是开发,而是基于现有的播放器核心自己封装一个,只要能够非常方便操作观看电视就好。

当然,前提是要有节目源,这个我早已完成:通过OpenWRT用udpxy将IPTV信号转换为HTTP单播协议融合到了家里的局域网中。

基于哪一款播放器核心来封装,其实有很多选择:VLC、ExoPlayer、IjkPlayer、安卓自带的控件VideoView。

我首先使用的是VLC,因为这款播放器我用得最多,在Windows平台上,我也用C#基于它封装了一个播放器,平时坐在电脑前一边做事,一边通过这个封装的播放器看看电视。

封装的关键步骤为:

1、按常规步骤新建android项目,Empty View类型的项目就好。

2、为项目添加VLC支持库。修改 build.gradle.kts 文件,在依赖项中添加:

dependencies {

implementation("org.videolan.android:libvlc-all:3.5.1")

......

}

这里的版本号可以适时修改。

3、给项目APP授予网络访问的权限。在AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.INTERNET" />

4、添加播放器的显示组件。在APP主界面的视图配置文件activity_main.xml中添加:

<SurfaceView

android:id="@+id/surfaceView"

android:layout_width="match_parent"

android:layout_height="match_parent" />

5、声明初始化基于VLC的播放器核心组件,并将视频显示关联到控件:

ArrayList<String> options = new ArrayList<>();

options.add("--rtsp-tcp");

options.add("--live-caching=200");

LibVLC libVLC = new LibVLC(this, options);

MediaPlayer mediaPlayer = new MediaPlayer(libVLC);

SurfaceView surfaceView = findViewById(R.id.surfaceView);

mediaPlayer.getVLCVout().setVideoView(surfaceView);

mediaPlayer.getVLCVout().setWindowSize(surfaceView.getWidth(), surfaceView.getHeight());

surfaceView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {

@Override

public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {

mediaPlayer.getVLCVout().setWindowSize(right-left, bottom-top);

}

});

mediaPlayer.getVLCVout().attachViews();

6、播放网络视频:

public void play(String url){

if(libVLC != null && mediaPlayer != null){

Media media = new Media(libVLC, Uri.parse(url));

mediaPlayer.setMedia(media);

media.release();

mediaPlayer.play();

}

}

通过以上关键步骤,即可正常播放局域网中IPTV的单播信号。最初在我的AS开发环境的模拟器和我备用手机上测试时,一切正常,换台也很快。但程序安装到我的小米电视后,播放效果就不尽人意了。图像有点灰,部分频道播放正常,但CCTV3、6、湖南卫视、经视等频道只有声音,图像无法正常显示,尝试过各种办法也没有解决。最后,我将VLC原版程序安装到我的小米电视后,问题依旧,那就说明不是我封装的问题了。可能是因为我的小米电视太老旧,2014年的产品,API还是18。

我不得不尝试换一种播放器,然后开始尝试ExoPlayer,封装的步骤与VLC的类似,甚至更简单,在模拟器和手机上测试时,所有频道都能正常播放,但大部分频道无声音,CCTV3、6、湖南卫视、经视等频道却能正常播放。尝试安装到小米电视时,又遇到问题,在编译minSDK=18的APP版本时,总是报错,一直没办法解决。

然后,我又尝试其他的播放器,如IjkPlayer,但更容易遇到一些无法解决的问题。在不停的尝试中,也试过VideoView,这个Android自带的控件,代码更简单,但在模拟器上一直没办法播放。总是显示"无法播放此视频"。在日志输出中,显示:

mapper 4.x is not supported

一次偶然的机会,在手机上测试,居然播放正常。然后在我的小米电视上测试,居然所有的频道都正常,很是意外。回头再去查前面的错误,有解释说是需要arm,引用的图形库libnative-igraphics.so只存在于arm64-8a和armeabi-v7a这个两个目录,x86核心的模拟器不能找到文件而无法播放。

这真是:踏破铁鞋无觅处,得来全不费功夫。最后给我的感觉应该是:VLC在x86-64的平台上性能最好;Andorid自带的VideoView组件使用了自己系统最底层的东西,在arm平台中性能最好;其他的一些开源的播放器,还需要努力!

相关推荐
勿问东西13 分钟前
【Android】设备操作
android
五味香20 分钟前
C++学习,信号处理
android·c语言·开发语言·c++·学习·算法·信号处理
图王大胜2 小时前
Android Framework AMS(01)AMS启动及相关初始化1-4
android·framework·ams·systemserver
工程师老罗4 小时前
Android Button “No speakable text present” 问题解决
android
小雨cc5566ru5 小时前
hbuilderx+uniapp+Android健身房管理系统 微信小程序z488g
android·微信小程序·uni-app
小雨cc5566ru6 小时前
微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台
android·微信小程序·uni-app
小雨cc5566ru6 小时前
小程序 uniapp+Android+hbuilderx体育场地预约管理系统的设计与实现
android·小程序·uni-app
佛系小嘟嘟8 小时前
Android-由switch-case和view.getId()引起的bug:错误:需要常量表达式 的解决办法
android·bug
勿问东西8 小时前
【Android】事件
android
连连斯基11 小时前
Android Framework(八)WMS-窗口动效概述
android·dubbo