​《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是否正常运行。​

FFmpeg开发笔记(九)Linux交叉编译Android的x265库的更多相关文章

  1. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  2. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

  3. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  4. FFmpeg开发笔记(四):ffmpeg解码的基本流程详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  6. FFmpeg开发笔记(一)搭建Linux系统的开发环境

    对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库.不过考虑到刚开始仅仅调用 ...

  7. Linux学习笔记——怎样在交叉编译时使用共享库

    0.前言     在较为复杂的项目中会利用到交叉编译得到的共享库(*.so文件).在这样的情况下便会产生下面疑问,比如:     [1]交叉编译时的共享库是否须要放置于目标板中,假设须要放置在哪个文件 ...

  8. ffmpeg开发环境搭建--(linux)

    1.     下载源码: http://ffmpeg.org/download.html 2.     解压:tar –xvf ffmpeg-3.2.1.tar.bz2 3.     配置 Eg:./ ...

  9. 关于Java在Linux or Android平台调用.so库

    Linux平台Java调用so库-JNI使用例子 android NDK开发及调用标准linux动态库.so文件 在Android项目中调用已有.so库 Android 调用.so文件 jni And ...

  10. FFmpeg开发笔记(二)搭建Windows系统的开发环境

    由于Linux系统比较专业,个人电脑很少安装Linux,反而大都安装Windows系统,因此提高了FFmpeg的学习门槛,毕竟在Windows系统搭建FFmpeg的开发环境还是比较麻烦的.不过若有已经 ...

随机推荐

  1. jenkins构建报错:[FATAL] Non-readable settings

    问题描述 问题分析 在项目的配置中配置了使用本地maven 配置. 解决方案 改为系统默认配置即可.修改后如图:点Build---右边高级按钮

  2. SpringBoot事务注解@Transactional 事物回滚、手动回滚事物

    处理springboot 下提交事务异常,数据库没有回滚的问题. spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作. 什么 ...

  3. 手动下载sdk及avd

    有时候下载sdk的时候报各种错误导致无法下载,如图 那么可以离线下载,到浏览器或IDM中下载图中提示的url链接,将第一个下载的包即sources的解压后放到SDK目录下的sources目录,并重命名 ...

  4. JS笔记:方法两次调用,执行不同分支(公共变量,闭包,类三种方法实现)

    好家伙,   当我们对一个方法进行两次调用,我们希望第一次执行A分支,第二次执行B分支,该怎么做? 这意味着在连续的两次调用中,方法的执行逻辑会交替执行不同的分支. 方法一:公共变量 let flag ...

  5. 【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?

    问题描述 使用Flask框架部署Python代码,如何访问其中的静态文件呢?如static问价夹中的图像资源,同时如何在代码中读取txt文件中的内容呢?是相对路径或者是绝对路径呢? 实验步骤 在App ...

  6. Glide源码解析三(注册组件)

    转载请标明出处,维权必究: https://www.cnblogs.com/tangZH/p/12900387.html Glide源码解析一,初始化 Glide源码解析二-into方法 Glide源 ...

  7. win上vscode配置ffmpeg

    参考博客https://blog.csdn.net/leixiaohua1020/article/details/38868499 https://blog.csdn.net/weixin_37515 ...

  8. 使用 maven 的 `wagon-maven-plugin`插件 快速部署 到不同的 环境

    profile 在pom文件中配置 开发和测试环境的 profile信息, <profiles> <profile> <!-- 开发环境 --> <id> ...

  9. MVC阶段所有框架完整组合示例

    思路:创建工程,导包.编辑配置文件包括 核心spring配置   SpringConfig myBatis 配置文件  mybatisConfig  JdbcConfig  jdbc.properti ...

  10. 快速复习JDBC(超详细)

    第一章  JDBC概述 之前我们学习了JavaSE,编写了Java程序,数据保存在变量.数组.集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系: 后来我们学 ...