近段时间,电视家不能用了,好吧,自己开发一个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平台中性能最好;其他的一些开源的播放器,还需要努力!