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

相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui