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

news2024/11/11 10:54:21

转载请注明出处: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 unzip

unzip 要解压的文件名

配置环境变量,同样在 .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.txt
        source.properties

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

~/sdk/
	latest/
    	cmdline-tools/
        	bin/
        	lib/
        	NOTICE.txt
        	source.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.coloradmin.cn/o/1936722.html

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

相关文章

Guns v7.3.0:基于 Vue3、Antdv 和 TypeScript 打造的开箱即用型前端框架

摘要 本文深入探讨了Guns v7.3.0前端项目&#xff0c;该项目是基于Vue3、Antdv和TypeScript的前端框架&#xff0c;以Vben Admin的脚手架为基础进行了改造。文章分析了Guns 7.3.0的技术特点&#xff0c;包括其使用Vue3、vite2和TypeScript等最新前端技术栈&#xff0c;以及提供…

环信IM x 亚马逊云科技,助力出海企业实现可靠通讯服务

随着全球化进程的加速&#xff0c;越来越多的企业选择出海&#xff0c;拓展国际市场。然而&#xff0c;面对不同国家和地区的用户&#xff0c;企业在即时通讯方面遇到了诸多挑战。为了帮助企业克服这些困难&#xff0c;环信IM与亚马逊云科技强强联手&#xff0c;共同推出了一套…

蚂蚁集团推出EchoMimic:能通过音频和面部标志生成逼真的肖像动画视频

蚂蚁集团最近推出了一项名为EchoMimic的新技术。能通过音频和面部标志生成逼真的肖像动画视频&#xff0c;让你的声音和面部动作被完美复制到视频中&#xff0c;效果自然如照镜子。 EchoMimic不仅可以单独使用音频或面部标志点生成肖像视频&#xff0c;也可以将两者结合&#…

CSPVD 智慧工地安全帽安全背心检测开发包

CSPVD SDK适用于为各种智慧工地应用增加安全防护穿戴合规的检测能力&#xff0c;能够有效检测未戴安全帽和未穿 安全背心的人员&#xff0c;提供Web API和原生API。官方下载&#xff1a;CSPVD工地安全防护检测 1、目录组织 CSPVD开发包的目录组织说明如下&#xff1a; xlpr_…

价格战再起:OpenAI 发布更便宜、更智能的 GPT-4o Mini 模型|TodayAI

OpenAI 今日推出了一款名为 GPT-4o Mini 的新模型&#xff0c;这款模型较轻便且成本更低&#xff0c;旨在为开发者提供一个经济实惠的选择。与完整版模型相比&#xff0c;GPT-4o mini 在成本效益方面表现卓越&#xff0c;价格仅为每百万输入 tokens 15 美分和每百万输出 tokens…

喜报!极限科技再获国家发明专利:《一种超大规模分布式集群架构的数据处理方法》,引领大数据处理技术创新

近日&#xff0c;极限数据&#xff08;北京&#xff09;科技有限公司&#xff08;简称&#xff1a;极限科技&#xff09;传来喜讯&#xff0c;公司再次斩获国家发明专利授权。这项名为"一种超大规模分布式集群架构的数据处理方法"的专利&#xff08;专利号&#xff1…

html+canvas 实现签名功能-手机触摸

手机上的效果图 需要注意&#xff0c;手机触摸和鼠标不是一个事件&#xff0c;不能通用&#xff0c;上一篇是关于使用鼠标的样例 相关代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewpo…

[Vulnhub] MERCY SMB+RIPS-LFI+Tomcat+Ports-Knocking+Timeclock权限提升

信息收集 IP AddressOpening Ports192.168.101.151TCP:80,22,53, 110, 139, 143, 445, 993, 995, 8080 $ $ nmap -p- 192.168.101.151 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 53/tcp open domain ISC BIND 9.9.5-3ubuntu0.17 (Ubuntu Linux) …

主从复制 哨兵服务 数据类型 持久化

配置主从复制 一主多从结构 配置一主一从结构 修改配置文件 配置salve服务器 配置带验证的主从复制 查看密码&#xff0c;默认redis服务没有密码 192.168.88.61:6379> config get requirepass 设置密码 192.168.88.61:6379> config set requirepass 123456 输入密码…

分享一个 .NET EF 6 扩展 Where 的方法

前言 Entity Framework 6&#xff08;EF 6&#xff09;中的 Where 方法用于筛选数据库中的数据并返回符合条件的结果&#xff0c;但 Where 方法只能进行简单的筛选条件&#xff0c;例如相等、大于、小于等简单条件&#xff0c;如果需要处理更复杂的逻辑条件&#xff0c;则需要…

【Linux服务器Java环境搭建】011在linux中安装Nginx,以及停止或启动Nginx服务

系列文章目录 【Linux服务器Java环境搭建】 前言 又到了周五晚上了&#xff0c;最近工作上有些忙&#xff0c;忙于一个需求频繁变更的项目&#xff0c;都快吐血了&#xff0c;懂得都懂&#xff0c;哈哈&#xff0c;正好有时间了&#xff0c;继续写系列【Linux服务器Java环境搭…

我去,怎么http全变https了

项目场景&#xff1a; 在公司做的一个某地可视化项目。 部署采用的是前后端分离部署&#xff0c;图片等静态资源请求一台minio服务器。 项目平台用的是http 图片资源的服务器用的是https 问题描述 在以https请求图片资源时&#xff0c;图片请求成功报200。 【现象1】: 继图…

设计模式11-原型模式

设计模式11-原型模式 写在前面对象创建模式典型模式原型模式动机结构代码推导应用特点要点总结 原型模式与工厂方法模式对比工厂方法模式原型模式什么时候用什么模式 写在前面 对象创建模式 通过对象创建模式绕开动态内存分配来避免创建过程中所导致的耦合过紧的问题。从而支…

【devops】gitlab 实现cicd 实践

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

AWS服务器购买:如何选择合适的AWS云服务器

在当今数字化时代,云计算已成为企业IT基础设施的重要组成部分。作为全球领先的云服务提供商之一,亚马逊网络服务(AWS)提供了丰富多样的云服务器选项。然而,面对众多选择,如何为您的业务需求挑选最合适的AWS云服务器呢?我们结合九河云的分析来给你解答。 1. 明确业务需求 首先…

前端Vue项目中腾讯地图SDK集成:经纬度与地址信息解析的实践

在前端开发中&#xff0c;我们经常需要将经纬度信息转化为具体的地址信息&#xff0c;这对于定位、地图展示等功能至关重要。Vue作为现代前端框架的代表&#xff0c;其组件化开发的特性使得我们能够更高效地实现这一功能。本文将介绍如何在Vue项目中集成腾讯地图SDK&#xff0c…

vue3 + antd vue 纯前端 基于xlsx 实现导入excel 转 json,将json数据转换XLSX并下载(下载模版)

一、导入 0、关键代码 // 安装插件 npm i xlsx/yarn add xlsx // 导入xlsx import * as XLSX from xlsx; 点击提交的时候才整理数据。上传的时候文件保存在 state.form.file[0] 中的 // 定义字段映射关系 const fieldMap {sheet2json: {技能名称: skill_name,技能等级: …

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

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

iPhone手机上备忘录怎么设置字数显示

在日常生活和工作中&#xff0c;我经常会使用iPhone的备忘录功能来记录一些重要的想法、待办事项或临时笔记。备忘录的便捷性让我可以随时捕捉灵感&#xff0c;但有时候&#xff0c;我也会苦恼于不知道自己记录了多少内容&#xff0c;尤其是在需要控制字数的时候。 想象一下&a…

mysql的B+树索引结构介绍

一、B树 特性&#xff1a; 所有的叶子结点中包含了全部关键字的信息&#xff0c;非叶子节点只存储键值信息&#xff0c;及指向含有这些关键字记录的指针&#xff0c;且叶子结点本身依关键字的大小自小而大的顺序链接&#xff0c;所有的非终端结点可以看成是索引部分&#xff0…