我的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平台中性能最好;其他的一些开源的播放器,还需要努力!

相关推荐
Dnelic-3 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen5 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年12 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿15 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神16 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛16 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法17 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter18 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快19 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl19 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5