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

相关推荐
帅得不敢出门10 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了12 小时前
【Android】使用productFlavors构建多个变体
android
德育处主任13 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山13 小时前
Android“引用们”的底层原理
android·java
迃-幵14 小时前
力扣:225 用队列实现栈
android·javascript·leetcode
大风起兮云飞扬丶14 小时前
Android——从相机/相册获取图片
android
Rverdoser15 小时前
Android Studio 多工程公用module引用
android·ide·android studio
aaajj15 小时前
[Android]从FLAG_SECURE禁止截屏看surface
android
@OuYang15 小时前
android10 蓝牙(二)配对源码解析
android
Liknana15 小时前
Android 网易游戏面经
android·面试