Android IjkPlayer内核编译记(一)so库编译使用

转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/140528831

本文出自 容华谢后的博客

0.写在前面

最近在搞RTMP协议直播拉流的功能,使用了B站开源的IjkPlayer作为播放器内核,在网络不好的情况下延迟会比较高,通过设置一些缓存、丢帧参数,发现效果也不是很好,当发生延迟的时候很难追到最新的帧,试过每隔一段时间,重新start一下视频流,虽然能追上但是卡顿明显。

查了一些资料,发现只能通过修改源码的方式解决了,在修改之前先要编译一遍官方的源码,由于是在Linux系统上编译so库,还是会遇到一些问题的,于是便有了本篇文章,本篇文章用于记录编译IjkPlayer源码的步骤和遇到的问题,以防止后续再用到的时候忘记,至于如何修改源码,下篇文章见。

1.环境搭建

操作系统:Ubuntu 20.04.4 64bit

Java版本:java-17-openjdk-amd64

NDK版本:android-ndk-r13b-linux-x86_64

SDK版本:android-30

IjkPlayer版本:0.8.8

FFmpeg版本:3.4

1.1 Java

使用以下命令安装 OpenJDK 17

sudo apt install openjdk-17-jdk

配置环境变量,打开Home目录下的 .bashrc 文件,在最后面输入

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

验证安装和环境变量配置是否成功

java -version

Java版本

1.2 NDK

NDK下载地址:https://developer.android.com/ndk/downloads/index.html

注意NDK一定要下载Linux版本的,解压到Home目录就可以,使用到的命令如下

sudo apt-get install unzipunzip 要解压的文件名

配置环境变量,同样在 .bashrc 文件最后面输入

export ANDROID_NDK=/home/用户名/NDK目录名
export PATH=$PATH:$ANDROID_NDK

验证NDK是否配置成功

// 如果输出你解压的ndk目录,则说明环境变量设置正确
echo $ANDROID_NDK

1.3 SDK

要先下载sdkmanager,然后通过这个工具下载SDK,在官网的最下面

sdkmanager

在Home目录新建一个sdk目录,将下载完的sdkmanager解压到Home目录,目录结构如下

~/sdk/cmdline-tools/bin/lib/NOTICE.txtsource.properties

需要修改下目录结构,在cmdline-tools目录下再新建一个latest目录,然后将原有的文件都拷贝至latest目录下

~/sdk/latest/cmdline-tools/bin/lib/NOTICE.txtsource.properties

cd到bin目录下,执行下面的命令下载SDK

./sdkmanager "build-tools;30.0.3" "platforms;android-30"

配置环境变量

export ANDROID_SDK=/home/用户名/SDK目录名
export PATH=$PATH:$ANDROID_SDK

验证SDK是否配置成功

// 如果输出你解压的sdk目录,则说明环境变量设置正确
echo $ANDROID_S

2.编译

2.1 安装一些依赖库

sudo apt-get install git
sudo apt-get install make
sudo apt-get install yasm
sudo apt-get install python

2.2 下载源码

https://github.com/bilibili/ijkplayer.git

2.3 修改配置

进度config目录

cd ijkplayer/config

可以看到在config目录下,提供了三种配置

  • module-default.sh:支持更多的编码格式
rm module.sh
ln -s module-default.sh module.sh
  • module-lite-hevc.sh:支持少量的编码格式,更小的体积(包含HEVC功能)
rm module.sh
ln -s module-lite-hevc.sh module.sh
  • module-lite.sh:支持少量的编码格式,更小的体积(不包含HEVC功能)
rm module.sh
ln -s module-lite.sh module.sh

2.4 开始编译

当前在config目录,退回ijkplayer目录,执行初始化命令

cd .../init-android-openssl.sh
./init-android.sh

进入android/contrib目录编译ffmpeg

cd android/contrib./compile-openssl.sh clean
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
./compile-ffmpeg.sh all

当前在contrib目录下,退回到android目录下,编译so库

cd .../compile-ijk.sh all

看到这个就说明编译成功了

编译成功

/ijkplayer/android/ijkplayer/ijkplayer-armv7a/src/main/libs/armeabi-v7a 目录下,可以看到编译好的so库

so库

每一个ABI目录下,都会有三个对应的so库,到这里编译工作就完成了,下面来简单测试下。

4.视频播放器

新建一个播放器项目,将编译好的so库,导入到main下的jniLibs目录,然后新建一个Module,将源码中的 android\ijkplayer\ijkplayer-java\src\main\java 下的包复制到新Module中,在主App中引用此Module。

布局:

<?xml version="1.0" encoding="utf-8"?>
<SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/sv_video"android:layout_width="match_parent"android:layout_height="match_parent" />

调用逻辑:

val ijkMediaPlayer = IjkMediaPlayer()
binding.svVideo.holder.addCallback(object : SurfaceHolder.Callback {override fun surfaceCreated(holder: SurfaceHolder) {ijkMediaPlayer.setDisplay(holder)}override fun surfaceChanged(holder: SurfaceHolder,format: Int,width: Int,height: Int) {}override fun surfaceDestroyed(holder: SurfaceHolder) {}
})
ijkMediaPlayer.setDataSource("http://vjs.zencdn.net/v/oceans.mp4")
ijkMediaPlayer.prepareAsync()
ijkMediaPlayer.start()

这是一个非常基础的使用示例,看下效果

IjkPalyer播放器

5.写在最后

GitHub传送门:https://github.com/alidili/Demos/tree/master/IjkPlayerDemo

到这里,IjkPlayer源码的编译就完成了,有问题可以给我留言评论,谢谢。

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

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

相关文章

网络安全防御【防火墙双机热备带宽管理综合实验】

目录 一、实验拓扑图 二、实验要求 三、实验思路&#xff1a; 四、实验步骤&#xff1a; 1、FW3的网络相关配置&#xff1a; 2、FW1的新增配置&#xff1a; 3、交换机LSW6&#xff08;总公司&#xff09;的新增配置&#xff1a; 4、双机热备技术配置&#xff08;双机热…

甲骨文闲置ARM实例防回收的方法

前几日挖了个大坑&#xff0c;今天补一下&#xff0c;谈谈甲骨文闲置实例如何防止回收。 回收原则 2022年11月16日 Oracle添加声明&#xff1a; 从 2022 年 11 月 24 日开始&#xff0c;您闲置的 Always Free 计算实例可能会停止。巴拉巴拉&#xff0c;您还可以随时升级您的帐…

线程基础概念

1、线程概念: 线程是一个轻量级的进程 每一个线程都属于一个进程 进程是操作系统资源分配的最小单元 线程是CPU任务调度的最小单元 线程是一个任务执行的过程,包括创建、调度、消亡 创建: 线程空间位于进程空间内部 进程: …

“生日悖论”简析——公式计算、代码模拟

“生日悖论”共享生日概率&#xff0c;通项公式计算&#xff0c;代码模拟计算。 (笔记模板由python脚本于2024年07月17日 18:16:40创建&#xff0c;本篇笔记适合会基础编程的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&…

《汇编语言 基于x86处理器》- 读书笔记 - Visual Studio 2019 配置 MASM环境

安装 Visual Studio 2019 配置 MASM环境 下载 Visual Studio Installer安装 Visual Studio 20191. 双击运行2. 自定义安装内容3. 修改 MSVC 工具集版本4. 设置主题&#xff08;可选&#xff09;5. 安装代码高亮插件 AsmDude&#xff08;可选&#xff09;6. 通义灵码&#xff08…

C++基础语法:STL之容器(4)--序列容器中的list(一)

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 序列容器的学习.以<C Prime Plus> 6th Edition(以下称"本书")内容理解 本书中容器内容不多只有几页.最好是有数据结构方面的知识积累,如果没有在学的同时补上. 序列容器回顾:序列容器内元素按严格…

多口适配器,给您的生活增添便利

随着科技的快速发展&#xff0c;我们的生活已离不开各种各样的电子设备&#xff0c;智能手机、平板电脑、智能手表、无线耳机……它们共同构建了我们丰富多彩的数字生活。然而&#xff0c;面对众多设备的充电需求&#xff0c;传统的单一充电口已难以满足现代人的使用习惯。在这…

x264 编码器 CAVLC 熵编码源码分析

CAVLC 关于 CAVLC 原理具体可参考:基于上下文自适应可变长熵编码 CAVLC 原理详细分析函数关系图 x264_macroblock_write_cavlc函数 函数作用:用于将宏块(macroblock)的数据通过 CAVLC(Context-based Adaptive Variable Length Coding)编码成比特流。函数内部核心功能:宏…

使用 OpenCV 和 YOLO 模型进行实时目标检测并在视频流中显示检测结果

文章目录 Github官网简介视频帧推理视频设备ID安装依赖 检测示例分类示例姿势估计 Github https://github.com/ultralytics/ultralytics 官网 https://docs.ultralytics.com/zhhttps://docs.ultralytics.com/zh/quickstart/ 简介 Ultralytics 是一个软件公司&#xff0c;专…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.2新一代信息技术及应用-2.2.1物联网与2.2.2云计算

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

Linux下如何安装配置Graylog日志管理工具

Graylog是一个开源的日志管理工具&#xff0c;可以帮助我们收集、存储和分析大量的日志数据。它提供了强大的搜索、过滤和可视化功能&#xff0c;可以帮助我们轻松地监控系统和应用程序的运行情况。 在Linux系统下安装和配置Graylog主要包括以下几个步骤&#xff1a; 准备安装…

【Spark On Hive】—— 基于电商数据分析的项目实战

文章目录 Spark On Hive 详解一、项目配置1. 创建工程2. 配置文件3. 工程目录 二、代码实现2.1 Class SparkFactory2.2 Object SparkFactory Spark On Hive 详解 本文基于Spark重构基于Hive的电商数据分析的项目需求&#xff0c;在重构的同时对Spark On Hive的全流程进行详细的…

【人工智能】机器学习 -- 决策树(乳腺肿瘤数)

目录 一、使用Python开发工具&#xff0c;运行对iris数据进行分类的例子程序dtree.py&#xff0c;熟悉sklearn机器实习开源库。 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库&#xff0c;使用决策树对breast-cancer-wisconsin.data进行分类。 …

Linux 注意事项

Linux 与 Windows 是两个相互独立的操作系统&#xff0c;两者有较大差距&#xff1a; 1.1 Linux 严格区分大小写&#xff08;Windows不严格区分大小写&#xff09;&#xff1b; 1.2 Linux 中所有内容&#xff0c;硬件设备都以文件形式保存在 /dev 目录下&#xff08;万物皆文件…

攻防世界 re新手模式

Reversing-x64Elf-100 64位ida打开 看if语句&#xff0c;根据i的不同&#xff0c;选择不同的数组&#xff0c;后面的2*i/3选择数组中的某一个元素&#xff0c;我们输入的是a1 直接逆向得到就行 二维字符数组写法&#xff1a;前一个是代表有几个字符串&#xff0c;后一个是每…

Logback日志异步打印接入指南,输出自定义业务数据

背景 随着应用的请求量上升&#xff0c;日志输出量也会成线性比例的上升&#xff0c;给磁盘IO带来压力与性能瓶颈。应用也遇到了线程池满&#xff0c;是因为大量线程卡在输出日志。为了缓解日志同步打印&#xff0c;会采取异步打印日志。这样会引起日志中的追踪id丢失&#xf…

鸿蒙OS开发工具 DevEco Studio(4.0)安装教程

1.旧版本下载地址【HarmonyOS】HUAWEI DevEco Studio 下载地址汇总_deveco studio历史版本-CSDN博客 2.解压安装包&#xff0c;双击安装程序 3.打开后点击Next 4.点击“Browse...”选择路径&#xff0c;然后点击“Next” 5.勾选&#xff0c;点击“Next” 6.默认&#xff0c;直…

NASA数据集——宝瓶座天体微波发射图辅助数据集 V1.0

Aquarius Celestial Sky Microwave Emission Map Ancillary Dataset V1.0 宝瓶座天体微波发射图辅助数据集 V1.0 简介 本数据集包含三张 L 波段&#xff08;波长 21 厘米&#xff09;天体&#xff08;"银河系"&#xff09;亮度温度图&#xff0c;用于处理美国航天…

maven 私服搭建(tar+docker)

maven私服搭建 一、linux安装nexus1、工具下载 二、 docker 搭建nexus1、镜像下载创建目录2、运行nexus3、访问确认&#xff0c;修改默认密码&#xff0c;禁用匿名用户登录4、创建仓库5、创建hostd仓库6、创建Blob Stores7、创建docker私服1、创建proxy仓库2、创建hotsed本地仓…