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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1-2算法基础-常用库函数

1.排序 sort(first,last,cmp) first指向要排序范围的第一个元素&#xff0c;从0起 last指向要排序范围的最后一个元素的下一个位置 cmp&#xff08;可选&#xff09;&#xff0c;自定义函数&#xff0c;默认从小到大 评测系统 #include <iostream> #include<algorith…

Java一对一聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…

three.js 入门三:buffergeometry贴图属性(position、index和uvs)

环境&#xff1a; three.js 0.159.0 一、基础知识 geometry&#xff1a;决定物体的几何形状、轮廓&#xff1b;material&#xff1a;决定物体呈现的色彩、光影特性、贴图皮肤&#xff1b;mesh&#xff1a;场景中的物体&#xff0c;由geometry和materia组成&#xff1b;textu…

十五、机器学习进阶知识:K-Means聚类算法

文章目录 1、聚类概述2、K-Means聚类算法原理3、K-Means聚类实现3.1 基于SKlearn实现K-Means聚类3.2 自编写方式实现K-Means聚类 4、算法不足与解决思路4.1 存在的问题4.2 常见K值确定方法4.3 算法评估优化思路 1、聚类概述 聚类&#xff08;Clustering&#xff09;是指将不同…

浅谈WPF之控件拖拽与拖动

使用过office的visio软件画图的小伙伴都知道&#xff0c;画图软件分为两部分&#xff0c;左侧图形库&#xff0c;存放各种图标&#xff0c;右侧是一个画布&#xff0c;将左侧图形库的图标控件拖拽到右侧画布&#xff0c;就会生成一个新的控件&#xff0c;并且可以自由拖动。那如…

Python---面向对象其他特性

1、类属性 Python中&#xff0c;属性可以分为实例属性和类属性。 类属性就是 类对象中定义的属性&#xff0c;它被该类的所有实例对象所共有。通常用来记录 与这类相关 的特征&#xff0c;类属性 不会用于记录 具体对象的特征。 在Python中&#xff0c;一切皆对象。类也是一…

1 接口测试介绍

在软件测试工作中&#xff0c;接口测试是必不可少的。接口测试一般是发生在单元测试之后&#xff0c;系统测试之前。当开发人员输出API文档后&#xff0c;测试人员就可以开始编写接口测试用例了。接口测试可以让测试人员更早的介入&#xff0c;不需要等待前后端联调完成才开始测…

银行卡二要素API的应用案例:从在线购物到金融投资

引言 随着互联网技术的不断发展&#xff0c;人们的金融需求也在不断增加。随之而来的是各种新型金融服务的涌现&#xff0c;让用户的金融体验更加便利快捷。其中&#xff0c;银行卡二要素API的应用&#xff0c;则为用户的金融体验和安全性提供了极大的保障。 银行卡二要素API…

知识蒸馏的蒸馏损失方法代码总结(包括:基于logits的方法:KLDiv,dist,dkd等,基于中间层提示的方法:)

有两种知识蒸馏方法&#xff1a;一种利用教师模型的输出概率&#xff08;基于logits的方法&#xff09;[15,14,11]&#xff0c;另一种利用教师模型的中间表示&#xff08;基于提示的方法&#xff09;[12,13,18,17]。基于logits的方法利用教师的输出作为辅助信号来训练一个较小的…

VBA语法结构及编程思想

VBA&#xff08;Visual Basic for Applications&#xff09;是一种编程语言&#xff0c;它被用于Microsoft Office应用程序的自动化&#xff0c;允许用户编写宏来执行常规任务。VBA是基于Microsoft的Visual Basic语言&#xff0c;但专为Office应用程序定制。 VBA语法格式 VBA的…

【STM32】TIM定时器输出比较

1 输出比较 1.1 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较&#xff1b;IC&#xff08;Input Capture&#xff09;输入捕获&#xff1b;CC&#xff08;Capture/Compare&#xff09;输入捕获和输出比较的单元输出比较可以通过比较CNT与CCR寄存器值&#…

JavaWeb-HTTP协议

1. 什么是HTTP协议 HTTP超文本传输协(Hyper Text transfer protocol)&#xff0c;是一种用于用于分布式、协作式和超媒体信息系统的应用层协议。它于1990年提出&#xff0c;经过十几年的使用与发展&#xff0c;得到不断地完善和扩展。HTTP 是为 Web 浏览器与 Web 服务器之间的…

AI自动生成代码工具

AI自动生成代码工具是一种利用人工智能技术来辅助或自动化软件开发过程中的编码任务的工具。这些工具使用机器学习和自然语言处理等技术&#xff0c;根据开发者的需求生成相应的源代码。以下是一些常见的AI自动生成代码工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有…

Redisson的基本使用

Redisson官网描述&#xff1a;Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的 redis 常用数据结构命令服务&#xff0c;还提供了许多分布式服务&#xff0c;例如分布式锁、分布式对象、…

HCIP —— BGP 基础 (上)

BGP --- 边界网关协议 &#xff08;路径矢量协议&#xff09; IGP --- 内部网关协议 --- OSPF RIP ISIS EGP --- 外部网关协议 --- EGP BGP AS --- 自治系统 由单一的组织或者机构独立维护的网络设备以及网络资源的集合。 因 网络范围太大 需 自治 。 为区分不同的AS&#…

vim常见操作

vim常见操作 文章目录 vim常见操作1. 回退/前进2. 搜索3. 删除4. 定位到50行5. 显示行号6. 复制粘贴7. 剪贴8. 替换9. vim打开文件的时候出现 1. 回退/前进 1.esc进入命令模式 2.ctrlr 前进 u 回退2. 搜索 1&#xff09; esc进入命令模式 2&#xff09; /text  查找text&am…

Docker load 命令

docker load &#xff1a;导入使用docker save命令导出的镜像。 语法 docker load [OPTIONS]OPTIONS 说明&#xff1a; --input , -i &#xff1a;指定导入的文件&#xff0c;代替STDIN。 --quiet , -q &#xff1a;精简输出信息。 实例&#xff1a; 导入镜像&#xff1a…

【STM32】TIM定时器输入捕获

1 输入捕获 1.1 输入捕获简介 IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff08;上升沿/下降沿&#xff09;&#xff0c;当前CNT的值将被锁存到CCR中&#xff08;把CNT的值读出来&#xff0c;写入到…

ubuntu16.04安装ROS+Gazebo

ubuntu16.04安装ROS参考文章 ros安装&#xff08;一键最简安装&#xff0c;吹爆鱼香ROS&#xff0c;请叫我鱼吹&#xff09; ROS篇——Ubuntu快速一键安装ROS或ROS2&#xff08;通用&#xff09; ubuntu安装ROS melodic(最新、超详细图文教程) 配置ubuntu以及安装ros2必要环…

类风湿性关节炎口腔黏膜破裂引发抗瓜氨酸细菌和人蛋白抗体反应

今天给同学们分享一篇实验文章“Oral mucosal breaks trigger anti-citrullinated bacterial and human protein antibody responses in rheumatoid arthritis”&#xff0c;这篇文章发表在Sci Transl Med期刊上&#xff0c;影响因子为17.1。 结果解读&#xff1a; 口腔黏膜破…