音视频(四)android编译

前言
前面已经讲了在windows上应用了,这章主要讲述android上编译

1:环境
git 如果失败 直接跑到相应网站 手动下载
ubuntu22.*
android ndk r21e download:https://developer.android.google.cn/ndk/downloads/index.html?hl=uk
为什么用这个,用过最新的28的,不是编译子so有问题 就是最后编译 ffmpeg 时有问题,花太多时间不划算
libx264 git clone https://code.videolan.org/videolan/x264.git or 手动 master (没找到版本号)
(https://code.videolan.org/videolan/x264/-/tree/master?ref_type=heads 右上角代码里下载要下的类型 一般zip就可以了)
libx265 git clone https://bitbucket.org/multicoreware/x265_git.git or 手动 3.3 (https://bitbucket.org/multicoreware/x265_git/downloads/)
这里先说明下,4.1可以编过,但是 合到ffpmeg 里 有问题没解决(弄了大半天,耗不起),先用3.3代替了,有空再研究下
fdk-aac git clone https://github.com/mstorsjo/fdk-aac.git or 手动 2.0.3
(https://github.com/mstorsjo/fdk-aac/tags)
zlib https://zlib.net/zlib131.zip
ffpmeg download
cmake 3.22.* 自动安装
编译 x265 4.1的 需要安装 GUI 版本的 sudo apt install cmake-curses-gui 不然ccmake 跳出配置项 需要修改环境的
autoconf 也装下 其他automake libtool 自行决定 这里是一块装了 sudo apt-get install autoconf automake libtool
在这里插入图片描述
在这里插入图片描述

**2:编译 **
在这里插入图片描述
在这里插入图片描述
先看下结果吧, 过程太折腾了
在这里插入图片描述

临时把虚拟机 core 调高点,不然 编译太慢了,也可以在windows下用 msys2 编译
这里编译的全是 26 版,其他版本自行修改,ndk r21e 最高只能到30
脚本 参考网上其他人的 再修改的

#!/bin/bash
export NDK=/home/ubuntu22/ffpmeg/android-ndk-r21e # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export API=26
cd x264
function build_android
{
./configure \--prefix=$PREFIX \--disable-cli \--enable-shared \--enable-static \--enable-pic \--host=$my_host \--cross-prefix=$CROSS_PREFIX \--sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \make clean
make -j4
make install
}#arm64-v8a
PREFIX=/home/ubuntu22/ffpmeg/android/x264/arm64-v8a
my_host=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
build_android

2>x265 3.3版的

rm -rf $(pwd)/x265/build/android
rm -rf $(pwd)/buildmkdir x265/build/android
cp -rf build_script/* x265/build/androidexport NDK_ROOT=/home/ubuntu22/ffpmeg/android-ndk-r21e # 换成自己的实际 NDK 路径 android-ndk-r21e
export ANDROID_API_VERSION=26
export NUMBER_OF_CORES=2
export OUTPUT_PREFIX=/home/ubuntu22/ffpmeg/android/x265
#aarch64-linux-android26#export CC="$TOOLCHAIN/bin/${TARGET}${API_LEVEL}-clang"
#export CXX="$TOOLCHAIN/bin/${TARGET}${API_LEVEL}-clang++"#pushd x265/build/android/armeabi-v7a
#bash build.sh
#popdpushd x265/build/android/arm64-v8a
bash build.sh
popd

build_script/arm64-v8a/build.sh


#set(CMAKE_C_COMPILER,$CC)
#set(CMAKE_C_COMPILER,$CXX)export CMAKE_C_COMPILER=aarch64-unknown-linux-gnu-gcc
export CMAKE_CXX_COMPILER=aarch64-unknown-linux-gnu-g++cmake ../../../source \-DCMAKE_SYSTEM_NAME=Android \-DCMAKE_SYSTEM_VERSION=${ANDROID_API_VERSION} \-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \-DCMAKE_ANDROID_NDK=${NDK_ROOT} \-DCMAKE_ANDROID_STL_TYPE=c++_static \-DNEON_ANDROID=1sed -i 's/-lpthread/-pthread/g' CMakeFiles/cli.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-shared.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-static.dir/link.txtmake -j${NUMBER_OF_CORES}
#make DESTDIR=${OUTPUT_PREFIX}/arm64-v8a install
make DESTDIR=${OUTPUT_PREFIX}/arm64-v8a install
#make PREFIX=${OUTPUT_PREFIX}/arm64-v8a install

3> zlib

#!/bin/bash
export NDK=/home/ubuntu22/ffpmeg/android-ndk-r21e # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export API=26
#"armeabi-v7a arm64-v8a x86_64 x86"
#ARCHS="arm64-v8a"
#ARCHS="armeabi-v7a arm64-v8a x86_64 x86"
#configure [--const] [--zprefix] [--prefix=PREFIX]  [--eprefix=EXPREFIX]#   [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]#   [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]cd  zlibfunction build_android
{
./configure \--prefix=$PREFIX \--64	\--archs="-arch arm"make clean
make -j2
make install
}#arm64-v8a
PREFIX=/home/ubuntu22/ffpmeg/android/zlib/arm64-v8a
my_host=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
build_android

4>aac

#!/bin/bash# ndk目录
export NDK=/home/ubuntu22/ffpmeg/android-ndk-r21e # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android# 架构
#archs="armeabi-v7a arm64-v8a x86 x86_64"
# api等级
export API=26
# --- 输入参数指定 End ---PREFIX=/home/ubuntu22/ffpmeg/android/aac/arm64-v8a
my_host=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-#export AS=$TOOLCHAIN/bin/$TARGET$API-as
export AS=$TOOLCHAIN/bin/$TARGET-as
export LD=$TOOLCHAIN/bin/$TARGET-ld
export NM=$TOOLCHAIN/bin/$TARGET-nm
export STRIP=$TOOLCHAIN/bin/$TARGET-strip
export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
export AR=$TOOLCHAIN/bin/$TARGET-arcd  aac./autogen.sh
# config
#CXXFLAGS="-std=c++11 -DDEBUG=1"
#CFLAGS="-std=c11"
#${log-lib}
#LDFLAGS="${LDFLAGS} -llog"
#LIBS="${LIBS}"
#LT_SYS_LIBRARY_PATH= "aarch64-linux-android"
#export LDFLAGS="${LDFLAGS} -L$TOOLCHAIN/sysroot/usr/lib/aarch64-linux-android/26"#export LDFLAGS="-L/home/ubuntu22/ffpmeg/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/26"
#export LIBS="${LIBS} -llog"
#/home/ubuntu22/ffpmeg/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/26/liblog.so
#echo $LDFLAGS./configure \
--host=$my_host \
--enable-shared \
--enable-static \
--target=android \
--disable-frontend \
--enable-static \
--prefix=$PREFIX \
--sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot # make
make clean
make -j2
make install

5> ffmpeg

#!/bin/bash
export NDK=/home/ubuntu22/ffpmeg/android-ndk-r21e # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
#export API=26cd FFmpegfunction build_android
{
#echo "The start of FFmpeg with x264,fdk-aac for $CPU is completed"
echo "The start of FFmpeg "./configure \
--prefix=$PREFIX \
--enable-neon  \
--enable-hwaccels  \
--enable-gpl   \
--disable-postproc \
--enable-static \
--enable-shared \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-encoder=libx264 \
--enable-encoder=libx265 \
--enable-encoder=libfdk-aac \
--enable-nonfree \
--enable-muxers \
--enable-decoders \
--enable-demuxers \
--enable-parsers \
--enable-protocols \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$X264_INCLUDE -I$X265_INCLUDE -I$FDK_INCLUDE -I$ZLIB_LIB -I$SYSROOT/usr/include -Os -fpic $OPTIMIZE_CFLAGS $OTHER_CFLAGS" \
--extra-ldflags="-lm -L$FDK_LIB -L$X264_LIB -L$X265_LIB -L$ZLIB_LIB -L$SYSROOT/usr/lib " \
--target-os=android \
--disable-large-tests \
--pkg-config=/usr/bin/pkg-configmake clean
make -j2
make install
#echo "The Compilation of FFmpeg with x264,fdk-aac for $CPU is completed"
echo  "########################################"
echo  $OPTIMIZE_CFLAGS
echo $ADDI_LDFLAGS
#$ADDI_LDFLAGS
pkg-config --libs x265
echo  "########################################"
}
#--disable-avdevice \#--extra-cflags="$(pkg-config --cflags glib-2.0)" \#   --extra-ldflags="$(pkg-config --libs glib-2.0)"#--pkg-config=/usr/local/bin/pkg-config \
#armv8-a
ARCH=arm64
CPU=armv8-a
API=26
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=/home/ubuntu22/ffpmeg/android/ffpmeg/arm64-v8a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
OTHER_CFLAGS="-fno-rtti -fno-exceptions"#BASE_PATH=/root/workspace
BASE_PATH=/home/ubuntu22/ffpmeg/android
LIB_TARGET_ABI=arm64-v8a#指定 fdk-aac 的头文件和静态库目录
###PREFIX= /home/ubuntu22/ffpmeg/android/acc/arm64-v8a
FDK_INCLUDE=$BASE_PATH/aac/$LIB_TARGET_ABI/include
FDK_LIB=$BASE_PATH/aac/$LIB_TARGET_ABI/lib
echo $FDK_INCLUDE
echo $FDK_LIB#指定 x264 的头文件和静态库目录
#PREFIX=/home/ubuntu22/ffpmeg/android/x264/arm64-v8a
X264_INCLUDE=$BASE_PATH/x264/$LIB_TARGET_ABI/include
X264_LIB=$BASE_PATH/x264/$LIB_TARGET_ABI/libecho $X264_INCLUDE
echo $X264_LIB#指定 x264 的头文件和静态库目录
#/home/ubuntu22/ffpmeg/android/x265/arm64-v8a
X265_ROOT=/home/ubuntu22/ffpmeg/android/x265/arm64-v8a/usr/local
X265_INCLUDE=$X265_ROOT/include
X265_LIB=$X265_ROOT/lib#X265_INCLUDE=$BASE_PATH/x265/$LIB_TARGET_ABI/include
#X265_LIB=$BASE_PATH/x265/$LIB_TARGET_ABI/libecho $X265_INCLUDE
echo $X265_LIB#指定 zlib 的头文件和静态库目录
#PREFIX=/home/ubuntu22/ffpmeg/android/zlib/arm64-v8a
ZLIB_INCLUDE=$BASE_PATH/zlib/$LIB_TARGET_ABI/include
ZLIB_LIB=$BASE_PATH/zlib/$LIB_TARGET_ABI/libecho $ZLIB_INCLUDE
echo $ZLIB_LIBexport PKG_CONFIG_PATH=$X265_LIB/pkgconfig:$X264_LIB/pkgconfig:$FDK_LIB/pkgconfig:$PKG_CONFIG_PATH
#export PKG_CONFIG_PATH=/home/ubuntu22/ffpmeg/android/x265/arm64-v8a/lib/pkgconfig:$PKG_CONFIG_PATH
#export PKG_CONFIG_PATH=/home/ubuntu22/ffpmeg/android/x265/arm64-v8a/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
#pkg-config --libs x264
#export PKG_CONFIG_PATH=/path/to/custom/pkgconfig:$PKG_CONFIG_PATH 会将 /path/to/custom/pkgconfig 目录添加到 pkg-config 的搜索路径中
echo "###############################"
echo $X265_LIB/pkgconfig
pkg-config --libs x265  #pkg-config --list-all|grep x265
echo "###############################"build_android
#../FFmpegn4/configure --arch=x86_64 --target-os=mingw64 --prefix=/d/code/ffpmep/ffmpegLib2 --enable-shared --disable-static --enable-gpl --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-nonfree --enable-zlib --enable-bzlib --disable-postproc
#--extra-ldflags="-lm -L$FDK_LIB -L$X264_LIB $ADDI_LDFLAGS" # -lm 即是链接数学库
#因为 FFmpeg 链接的 fdk-aac 需要用到数学库,不链接的话会报如下错误:
#cp $FDK_LIB/libfdk-aac.a $PREFIX/lib
#cp $X264_LIB/libx264.a $PREFIX/lib

3: 拷贝子库到 ffmpeg lib 下
部分需要去掉 so.版号 变为 so 网上 自行搜索 这里直接跳过
把so 及 include 打包好

番外x265 4.1版本 照这个来吧 ccmake 会跳出框的
PREFIX ASSEMBLY CLI 这三个修改下,其他这里也没修改
修改后 按 c 再按e 再按g
在这里插入图片描述
acc 编译有错需要改下
写这里吧 这里纯粹偷懒
在这里插入图片描述
在这里插入图片描述
4:如果对你又帮助,麻烦点个赞,加个关注
写个android 测试下章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77147.shtml

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

相关文章

【kind管理脚本-3】脚本函数说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本

下面是一份详细的说明文档,介绍该脚本的功能、用法及各部分的含义,供您参考和使用: Kind 集群管理脚本说明文档 此脚本主要用于管理 Kind(Kubernetes IN Docker)集群,提供创建、删除、导出 kubeconfig、加…

【计算机行业发展与重塑】

计算机行业正经历前所未有的变革,AI技术的爆发式发展与产业升级的深度融合,正在重塑行业格局与就业市场。以下从行业趋势、AI的核心价值、就业需求三个维度展开分析。 一、行业趋势:AI驱动下的多极增长 AI成为核心引擎 生成式AI的突破&#…

(高频SQL50题)1667. 修复表中的名字

问题 表: Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | ------------------------- user_id 是该表的主键(具有唯一值的列)。 该表包含用户的 ID 和名字…

基于人工智能的医学影像关联分析:利用潜在空间几何混杂因素校正法|文献速递-深度学习医疗AI最新文献

Title 题目 AI-based association analysis for medical imaging using latent-spacegeometric confounder correction 基于人工智能的医学影像关联分析:利用潜在空间几何混杂因素校正法 01 文献速递介绍 人工智能(AI)已成为各个领域的…

开源免费虚拟化软件PVE功能介绍

Proxmox VE(PVE)提供了一个基于 Web UI(管理界面)的虚拟化管理平台,用户可以通过浏览器管理 虚拟机(VM)、容器(LXC)、存储、网络、备份、用户权限等。 一、PVE Web 界面…

新球体育比分状态监控

文章目录 目标分析监控逻辑代码目标分析 网页监控地址:aHR0cHM6Ly9saXZlLnRpdGFuMDA3LmNvbS9pbmRleDJpbjEuYXNweD9pZD0x 监控逻辑 比分等数据主要是依赖JS加载得到,通过ajax后端进行渲染 代码 # -*- coding: utf-8 -*-import warnings warnings.filterwarnings(ignore) f…

【lodash的omit函数详解 - 从入门到精通】

lodash的omit函数详解 - 从入门到精通 小白视角:什么是omit? omit在英文中意为"忽略"或"省略"。在编程中,它就是从一个对象中删除不需要的属性,返回一个新对象。 // 原始对象 const person {name: "…

软考笔记9——数据库技术基础

第九章节——数据库技术基础 数据库技术基础 第九章节——数据库技术基础一、基本概念1. 数据库与数据库系统2. 数据库的三级模式2.1 内模式2.2 概念模式2.3 外模式2.4 数据库的两级映射2.5 数据库设计的基本步骤 二、数据模型1. 基本概念2. E-R模型2.1 实体2.2 联系2.3 属性 3…

Django分页教程及示例

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 完整代码示例:结论Django的分页模块允许你将大量数据分割成更小的块(页面)。这对于以可管理的方式显示项目列表,如博客文章或产品…

int 与 Integer 的区别详解

1. 本质区别 特性intInteger类型基本数据类型(Primitive)包装类(Wrapper Class)存储位置栈(或作为对象成员在堆中)堆(对象实例)默认值0null(可能导致 NullPointerExcept…

mariadb使用docker compose方式安装

问题 本地mac m1上面的mysql和mariadb突然不用使用了,重新安装也不想,最近mac系统也更新了,brew也更新了,重新安装mariadb还是不能正常使用,现在我打算使用docker来安装本地的mariadb了。 默认配置文件my.cnf 从容器…

基于React + Antd + Java的OFD文件上传预览实现方案(OFD文件转图片)

一、前端实现方案(React + Antd) import React, {useState } from react; import {Upload, Button, Image, Carousel } from antd; import {UploadOutlined } from @ant-design/icons;const OFDUploadPreview = () => {const [previewImages, setPreviewImages] = useSta…

从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.3.1LangChain与Dify平台实战:从RAG到Agent工作流

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 LangChain与Dify平台实战:从RAG到Agent工作流 - 4.3.1 LangChain与Dify平台实战:从RAG到Agent工作流1. LangChain核心组件与RAG架构设计1.1 LangChain核心模块1.2 RAG架构实现流程2. RAG实战:企业知识…

操作 Office Excel 文档类库Excelize

Excelize 是 Go 语言编写的一个用来操作 Office Excel 文档类库,基于 ECMA-376 OOXML 技术标准。可以使用它来读取、写入 XLSX 文件,相比较其他的开源类库,Excelize 支持操作带有数据透视表、切片器、图表与图片的 Excel 并支持向 Excel 中插…

R Excel 文件:高效数据处理与可视化工具的完美结合

R Excel 文件:高效数据处理与可视化工具的完美结合 引言 在数据分析和处理领域,R语言因其强大的数据处理能力和丰富的可视化功能而备受青睐。而Excel作为最常用的电子表格软件,其广泛的应用也使得R与Excel的结合成为数据处理与可视化的理想…

[ctfshow web入门] 零基础版题解 目录(持续更新中)

ctfshow web入门 零基础版 前言 我在刷题之前没有学过php,但是会python和C,也就是说,如果你和我一样会一门高级语言,就可以开始刷题了。我会以完全没学过php的视角来写题解,你也完全没有必要专门学习php,这…

linux第三次作业

1、将你的虚拟机的网卡模式设置为nat模式,给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 2、测试你的虚拟机是否能够ping通网关和dns,如果不能请修改网关和dns的地址 3、将如下内容写入/etc/hosts文件中(如果有多个ip地址则写多行&…

如何开发 HTML 游戏

开发 HTML 游戏适合初学者学习编程和游戏开发的基础知识。HTML 游戏通常结合了 HTML、CSS 和 JavaScript 技术,利用浏览器的渲染能力来实现交互式的游戏体验。 1. 确定游戏类型 在开始开发之前,你需要明确你的游戏类型。例如: 简单游戏&…

我的NISP二级之路-02

目录 一.数据库 二.TCP/IP协议 分层结构 三.STRIDE模型 四.检查评估与自评估 检查评估 自评估 五.信息安全应急响应过程 六.系统工程 七.SSE-CMM 八.CC标准 九.九项重点工作 记背: 一.数据库 关于数据库恢复技术,下列说法不正确的是&#xff1a…

结构化需求分析:专业方法论与实践

结构化需求分析是一种用于软件开发或其他项目中的系统分析方法,旨在全面、准确地理解和描述用户对系统的需求。以下是关于结构化需求分析的详细介绍: 一、概念 结构化需求分析是采用自顶向下、逐步分解的方式,将复杂的系统需求分解为若干个…