首页 > 系统相关 >FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库

FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库

时间:2024-10-25 13:19:35浏览次数:3  
标签:NDK FFmpeg ijkplayer 编译 so Android android

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开发实战:从零基础到短视频上线》一书。

标签:NDK,FFmpeg,ijkplayer,编译,so,Android,android
From: https://blog.51cto.com/u_15067275/12361040

相关文章

  • ISO证书:企业安全的护航者,成功的敲门砖
    在当今竞争激烈的市场环境中,投资者都希望自己的投资能够安全、稳定地增长,并最终取得成功。而ISO标准认证提供的证书,正是他们判断一个企业是否认真、负责、专业,并持续寻求改善的最好指标。ISO证书,其作用不可小觑。首先,任何投资者都希望自己的投资是安全的。他们希望投资的企业能够成......
  • 利用010Editor修改so
    这里使用的so还是demo中的libBileton.so010Editor对so进行修改利用010Editor打开libBileton.so找到一部分字符串内容这里把这里面的字符串进行修改,我把大写的字母手动patch为了小写字母保存!把修改后的so放进app里先把它push到/sdcard/Download/目录下查一下apk中......
  • Linux基础——虚机mysql库覆盖/usr/lib64/libcrypto.so.1.1.1f无法启动
    1、问题描述租户新增数据库mysql,手动覆盖/usr/lib64中的libcrypto.so.1.1.1f库文件,导致主机重启进入救援模式。 2、问题分析i.发现报错poweroff:errorwhileloadingsharedlibraries:libcrypto.so.1.1:cannotopensharedobjectfile:Nosuchfileordirectoryii.检......
  • 【接口】websocket
    背景HTTP(超文本传输协议)缺点:缺乏数据加密、身份验证和会话管理等安全特性;HTTP链接的半双工的,而且通信只能由客户端发起,服务端无法将数据主动推送给客户端HTTPS(安全超文本传输协议):为了解决HTTP的缺点,提出HTTPS,提供传输的安全性websocket:为了解决"HTTP链接的半双工的,而且通信只......
  • EOL/Obsolete Operating System: Red Hat Enterprise Linux 7.9 Detected
    Title: EOL/ObsoleteOperatingSystem:RedHatEnterpriseLinux7.9DetectedFirstDetected: 8/6/2024VendorReference: EndofLifeforRedHatEnterpriseLinux7.9Impact: Thesystemisathighriskofbeingexposedtosecurityvulnerabilities.Beca......
  • Agent.exe:让Claude 3.5 Sonnet控制你的电脑
    简介Agent.exe是一个开源的Electron应用程序,它允许Claude3.5Sonnet直接控制你的本地计算机。这个项目的特色在于它的操作界面简洁,并且对Firefox浏览器有特别的优化支持。功能亮点简单易用:通过一个简单的Electron应用,让Claude3.5Sonnet接管你的电脑。操作直......
  • CCRC-DSO数据安全官能力培养及课程特色
    在当今数字化高速发展的时代,培养六大能力以确保数据安全意识至关重要。首先,树立安全观并提高安全意识是基石。若在工作中方式、方法不当,可能会引发一系列严重后果。例如,在某些企业中,员工因疏忽大意将未加密的重要数据存储在公共云盘上,导致数据泄露,给企业带来巨大的经济损失和声......
  • JSON日志处理 | 基于SparkSql实现
    目录0 主要JSON处理函数1JSON处理函数使用2案例分析3小结0 主要JSON处理函数get_json_object:提取单个JSON字段json_tuple:同时提取多个JSON字段from_json:JSON字符串转结构化数据to_json:结构化数据转JSON字符串schema_of_json:推断JSONs......
  • 网关点表&&全局点表json文件使用(拓展性实现方法)
    全局点表点表作用每一个网关中都会有配置点表,它会在里面写入一些网关运行过程中所需要的配置项,比如连接的服务器地址、当前固件版本号等。而点表最重要的作用就是定义网关需要采集或者处理的设备点抽象,实际开发中我们会将每个需要关注的终端设备抽象成一个具体的数据点,这......
  • C++Socket通讯样例(服务端)
    1.创建Socket实例并开启。privateintOpenTcp(intport,stringip=""){//1.开启服务端try{_tcpServer=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPAddressipAddr=IPAddress.Any;......