FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是一款由B站研发的移动端国产播放器,它基于FFmpeg3.4版本,同时兼容Android和iOS两大移动操作系统。ijkplayer的源码托管地址为https://github.com/bilibili/ijkplayer,截止2024年9月15日,ijkplayer获得3.24万星标数,以及0.81万个分支数,而这还是ijkplayer停止更新6年之后的数据,可想而知当年的ijkplayer是多么火爆。
不过正因为ijkplayer多年未更新,按照导包方式仅能在较老的平台上编译运行,比如ijkplayer支持的Android平台仅限于API 9~23,支持的iOS平台仅限于iOS 7.0~10.2.x。为了让ijkplayer能够在更新的开发环境上正常运行,需要先在Linux系统上交叉编译ijkplayer在Android平台上的so文件,才能在App工程中导入并调用so库。下面介绍如何在Linux编译ijkplayer的so库。
一、准备Linux编译环境
首先在Linux系统执行下面命令安装编译工具。
yum install git make yasm
接着执行下面命令临时调整tmp分区大小,确保系统的临时空间充足,避免解压大文件失败。
mount -o remount,size=2G /tmp
二、安装Android的SDK和NDK
依次执行下列命令下载并安装Android的SDK,注意不要用太高版本的SDK,因为ijkplayer没有适配高版本的SDK。
mkdir -p /usr/local/src_ijkplayer
cd /usr/local/src_ijkplayer
curl -O https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
unzip sdk-tools-linux-4333796.zip
mkdir sdk
mv tools sdk/cmd_tools
cd sdk/cmd_tools/bin
./sdkmanager "build-tools;28.0.3" "platforms;android-28"
依次执行下列命令下载并安装Android的NDK,注意不要用太高版本的NDK,因为ijkplayer没有适配高版本的NDK,官方推荐采用r10e版本的NDK即可。
cd /usr/local/src_ijkplayer
curl -O https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip
unzip android-ndk-r10e-linux-x86_64.zip
执行下面的环境变量设置命令,分别设置SDK的环境变量ANDROID_SDK,以及NDK的环境变量ANDROID_NDK。
export ANDROID_SDK=/usr/local/src_ijkplayer/sdk
export ANDROID_NDK=/usr/local/src_ijkplayer/android-ndk-r10e
三、下载并编译ijkplayer
先执行以下命令下载ijkplayer的源码包。
cd /usr/local/src_ijkplayer
git clone https://github.com/Bilibili/ijkplayer.git
再执行以下命令检查并初始化ijkplayer的Android编译环境。
cd ijkplayer
./init-android-openssl.sh
./init-android.sh
然后依次执行下列命令,分别编译ijkplayer需要的openssl库和ffmpeg库,以及ijkplayer的so库。之所以在三个脚本后面添加“ arm64”,是为了只编译适配arm64指令的so文件。
cd android/contrib
./compile-openssl.sh arm64
./compile-ffmpeg.sh arm64
cd ../
./compile-ijk.sh arm64
一切顺利的话,即可在ijkplayer/android/ijkplayer/ijkplayer-arm64/src/main/libs/arm64-v8a目录下看到编译好的三个so库:libijkffmpeg.so、libijkplayer.so、libijksdl.so。把包含三个so文件在内的整个libs目录复制到App工程的libs目录,即可完整ijkplayer的so库导入工作。
更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库的更多相关文章
- FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待 前言 将ffmpeg移植到海思H ...
- .Net开发笔记(十九) 创建一个可以可视化设计的对象
阅读本篇博客之前需要了解VS窗体设计器的工作原理,详细可参见本系列博客(十).(十一).(十二).必须需要知道的一条结论就是:处于窗体设计器(Form Designer)中的任何组件(包含控件,下同) ...
- Java开发笔记(十九)规律变化的for循环
前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素.不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”.“year<l ...
- 安卓开发笔记(十九):异步消息处理机制实现更新软件UI
主界面代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andr ...
- 论文阅读笔记五十九:Res2Net: A New Multi-scale Backbone Architecture(CVPR2019)
论文原址:https://arxiv.org/abs/1904.01169 摘要 视觉任务中多尺寸的特征表示十分重要,作为backbone的CNN的对尺寸表征能力越强,性能提升越大.目前,大多数多尺寸 ...
- Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件
前言 上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤. 受限制 因为直接配置sample的vi比较麻烦 ...
- FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放
前言 ffmpeg播放rtsp网络流和摄像头流. Demo 使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克 使用ffmpeg播放网络rtsp文件流 ...
- FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建
前言 本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8. FFmpeg简介 FFmpeg是领先的多媒体框架,能够解码 ...
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
随机推荐
- tensorflow1.x——如何在C++多线程中调用同一个session会话
相关内容: tensorflow1.x--如何在python多线程中调用同一个session会话 ================================================= 从 ...
- 玩转内核链表list_head,3个超级哇塞的的例子
在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head.虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作li ...
- 使用Packer构建镜像
什么是Packer Packer 是一个强大的工具,它可以帮助我们轻松地构建各种类型的镜像,如虚拟机镜像.Docker 镜像等. Packer 的工作原理是通过定义一个配置文件,该文件描述了要构建的镜 ...
- freertos学习笔记(十)事件标志组
事件标志组 相当于用户平时定义的Flag,事件标志,不过freertos支持将该标志组作为启动task的条件 概述 分为8位和24位的模式(通过设置宏来配置) 每一位有0和1两个状态 用法 用于平常程 ...
- androi studio bitmap 压缩后 图片方向异常
Android 使用 Camera2拍照后,获得 byte[] data,随后使用 BitmapFactory.decodeByteArray 压缩 导致图片方向异常 /* * 避免出现方向异常 * ...
- 性能、成本与 POSIX 兼容性比较: JuiceFS vs EFS vs FSx for Lustre
JuiceFS 是一款为云环境设计的分布式高性能文件系统.Amazon EFS 易于使用且可伸缩,适用于多种应用.Amazon FSx for Lustre 则是面向处理快速和大规模数据工作负载的高性 ...
- Linq操作XML生成XML,实体生成XML和互转
开发接口中难免会遇到一些数据对接需要转换城xml,看到很多之前的代码都使用很传统的方法循环集合并定义xml后一一生成的,代码之封锁 特此使用了简单易用linq操作分享给大家,希望可以帮到需要的同学 今 ...
- Python存储与读写二进制文件
技术背景 一般情况下我们会选择使用明文形式来存储数据,如json.txt.csv等等.如果是需要压缩率较高的存储格式,还可以选择使用hdf5或者npz等格式.还有一种比较紧凑的数据存储格式,就是直接按 ...
- 微软RDL远程代码执行超高危漏洞(CVE-2024-38077)漏洞检测排查方式
漏洞名称:微软RDL远程代码执行超高危漏洞(CVE-2024-38077) CVSS core: 9.8 漏洞描述: CVE-2024-38077 是微软近期披露的一个极其严重的远程代码执行漏洞. ...
- python之re库,正则表达
一.前言 为什么要学re库呢?这里主要学他的正则表达,在编写安全脚本的时候肯定要遇到一些不规则的匹配规则,当然编写爬虫也少不了正则匹配去找到一些具有特殊特征的字符串.因此这是十分必要的,然而.re库使 ...