FFmpeg开发笔记(九)Linux交叉编译Android的x265库

简介: 在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。

​《FFmpeg开发实战:从零基础到短视频上线》一书的“12.1.2 交叉编译Android需要的so库”介绍了如何在Windows环境交叉编译Android所需FFmpeg的so库,前文又介绍了如何在Linux环境交叉编译Android所需FFmpeg的so库,接下来介绍如何在Linux环境交叉编译Android所需x265的so库。

1、安装cmake

执行以下命令安装cmake

yum install cmake git

2、下载Linux版本的android-ndk-r21e(如已下载则忽略)

登录Linux服务器(比如华为云的欧拉系统),依次执行下面的命令。

cd /usr/local/src
curl -O https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip
unzip android-ndk-r21e-linux-x86_64.zip

3、上传x265的源码

从下面链接下载x265的源码包
https://bitbucket.org/multicoreware/x265_git/downloads/x265_3.5.tar.gz
解压x265源码包,修改x265_3.5/build/aarch64-linux目录下的crosscompile.cmake,把下面两行

set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

改为下面两行

set(CMAKE_C_COMPILER aarch64-linux-android24-clang)
set(CMAKE_CXX_COMPILER aarch64-linux-android24-clang++)

4、配置x265的源码

进入x265_3.5下的build/aarch64-linux目录,执行以下命令配置x265:

export PATH=$PATH:/usr/local/src/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin
./make-Makefiles.bash

命令行弹出的选项界面中,注意下列三项修改:
(1)把CMAKE_INSTALL_PREFIX这项改为/usr/local/app_x265(按向下键定位到该项,再按回车键,即可按照vi方式编辑路径)
(2)把ENABLE_ASSEMBLY这项改为OFF(按向下键定位到该项,再按回车键,即可把ON改为OFF)
(3)把ENABLE_CLI这项改为OFF(按向下键定位到该项,再按回车键,即可把ON改为OFF)
接着按c键开始配置,再按e键退出配置,然后按g键开始生成。

5、修改x265的编译规则

进入x265_3.5源码下的build/aarch64-linux/CMakeFiles/x265-shared.dir目录,注意修改下面三个文件:
(1)修改该目录的link.txt,把文件中的所有“libx265.so.199”替换为“libx265.so”。同时删除文件末尾的“ -lpthread -lrt”。
(2)同目录的relink.txt修改说明同link.txt。
(3)修改同目录下面的build.make,把该文件中的所有“libx265.so.199”替换为“libx265.so”,把所有的“libx265.so”替换为“libx265.so.199”。注意A和B互换名称的时候,可以设定第三个名称C,比如先把A替换为C,接着B替换为A,然后C替换为B。

6、编译和安装x265

进入x265_3.5源码下的build/aarch64-linux目录,执行以下命令编译和安装x265:

make
make install

7、调整x265的pc描述文件

修改/usr/local/app_x265/lib/pkgconfig下面的x265.pc,该文件的“Libs.private”选项里面去掉“-lrt”,也就是改成下面这行:

Libs.private: -lc++ -lm -lgcc -ldl -lgcc -ldl -ldl

8、添加PKG_CONFIG_PATH路径

Linux的profile文件位于用户初始目录的.bash_profile。执行以下命令编辑当前用户的profile文件:

cd
vi .bash_profile

往.bash_profile的文件末尾添加下面一行:

export PKG_CONFIG_PATH=/usr/local/app_x265/lib/pkgconfig:$PKG_CONFIG_PATH

保存并退出.bash_profile之后,执行以下命令加载环境变量:

source .bash_profile

然后执行下面的环境变量查看命令,确保x265的环境变量已经成功加载。

env | grep PKG

9、重新编译FFmpeg启用x265

打开《FFmpeg开发实战:从零基础到短视频上线》随书源码的chapter12/config_ffmpeg_full.sh,将该文件另存为config_ffmpeg_x265.sh,并在文件内部这行

  --enable-libx264 \

的下面增加如下一行配置

  --enable-libx265 \

接着把config_ffmpeg_x265.sh上传到服务器的FFmpeg源码目录,执行下面命令赋予可执行权限。

chmod +x config_ffmpeg_x265.sh

然后运行下列命令配置、编译和安装FFmpeg

./config_ffmpeg_x265.sh
make clean
make -j4
make install

10、把so文件导入App工程

(1)把FFmpeg交叉编译好的include目录(位于/usr/local/app_ffmpeg/include)整个复制到App工程的src/main/cpp目录下。
(2)在src\main目录下创建jniLibs目录,并在jniLibs下面创建子目录arm64-v8a,把FFmpeg交叉编译好的8个so文件(位于/usr/local/app_ffmpeg/lib)全部复制到arm64-v8a目录下。
(3)config_ffmpeg_x265.sh里面启用的几个第三方库的so文件也一块复制到arm64-v8a目录下,包括x264、x265、mp3lame、freetype等。
(4)给App工程的build.gradle的android→defaultConfig→externalNativeBuild→cmake节点内部增加下面配置。

    abiFilters "arm64-v8a"
    arguments '-DANDROID_STL=c++_shared' // FFmpeg集成x265时需要

如果不加,App运行时会报错“java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found”。
(5)在Android Studio上编译运行App工程,观察App是否正常运行。​

目录
相关文章
|
9天前
|
运维 Oracle 容灾
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
|
6天前
|
运维 网络协议 Linux
2024年最全CentOS8 Consul微服务架构安装(1)_agent(1),Linux运维开发面试
2024年最全CentOS8 Consul微服务架构安装(1)_agent(1),Linux运维开发面试
|
7天前
|
编解码 Linux 5G
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
AVS3,中国制定的第三代音视频标准,是首个针对8K和5G的视频编码标准,相比AVS2和HEVC性能提升约30%。uavs3d是AVS3的解码器,支持8K/60P实时解码,且在各平台有优秀表现。要为FFmpeg集成AVS3解码器libuavs3d,需从GitHub下载最新源码,解压后配置、编译和安装。之后,重新配置FFmpeg,启用libuavs3d并编译安装,通过`ffmpeg -version`确认成功集成。
21 0
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
|
9天前
|
运维 监控 关系型数据库
【Zabbix 6(1),Linux运维组件化开发教程
【Zabbix 6(1),Linux运维组件化开发教程
|
4天前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
19小时前
|
存储 Linux 网络安全
在 Linux 中通过 SSH 执行远程命令时,无法自动加载环境变量(已解决)
SSH远程执行命令时遇到“命令未找到”问题,原因是Linux登录方式不同导致环境变量加载差异。解决方案:将环境变量写入`/etc/profile.d/`下的文件,或手动在命令前加载环境变量,如`source /etc/profile`。
|
2天前
|
关系型数据库 MySQL Java
1.Linux常用命令
1.Linux常用命令
10 1
|
5天前
|
Linux
【超全】Linux命令思维导图总结 值得收藏
【超全】Linux命令思维导图总结 值得收藏
11 0
|
5天前
|
Linux 文件存储 Windows
Linux常用的基础命令
Linux常用的基础命令
12 1
|
6天前
|
运维 关系型数据库 MySQL
day03-Linux运维-Xshell优化和Linux系统命令入门(2)
day03-Linux运维-Xshell优化和Linux系统命令入门(2)
day03-Linux运维-Xshell优化和Linux系统命令入门(2)