FFmpeg、x264以及fdk-aac 编译整合

news2024/11/23 11:57:54

接上文 FFMPEG 编译流程(极客版)

编译 fdk-aac

libfdk-aac version:0.1.5
success
下载

wget http://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.5.tar.gz
#!/bin/bash
NDK=/home/maqi/Desktop/android-ndk-r20b  # 这里需要替换成你本地的 NDK 路径,其他的不用修改
HOST_TAG=linux-x86_64
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
ANDROID_LIB_PATH="$(pwd)/android"

API=21

function build_android
{
echo "Build fdk-aac for android $CPU"
./configure \
--host=$HOST \
--disable-shared \
--enable-static \
--prefix="$ANDROID_LIB_PATH/$CPU" \
 CPPFLAGS="-fPIC"

make clean
make -j8
make install
echo "Build fdk-aac for android $CPU completed"
}

# armeabi-v7a
CPU=armeabi-v7a
HOST=arm-linux-android
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export AS=$TOOLCHAIN/bin/arm-linux-androideabi-as
export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
build_android

# arm64-v8a
CPU=arm64-v8a
HOST=aarch64-linux-android
export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
export CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
build_android

运行

# 修改 build_fdk_aac_clang.sh 可执行权限
chmod +x build_fdk_aac_clang.sh
# 运行编译脚本
bash build_fdk_aac_clang.sh

success

x264

wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2

success

解压

tar jxvf x264-master.tar.bz2

进入->创建->授权->编辑
success

#!/bin/bash
export NDK=/home/maqi/Desktop/android-ndk-r20b # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export API=21

function build_android
{
./configure \
    --prefix=$PREFIX \
	  --disable-cli \
    --disable-shared \
    --enable-static \
    --enable-pic \
    --host=$my_host \
	  --cross-prefix=$CROSS_PREFIX \
    --sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \

make clean
make -j8
make install
}

#arm64-v8a
PREFIX=./android/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

#armeabi-v7a
PREFIX=./android/armeabi-v7a
my_host=armv7a-linux-android
export TARGET=armv7a-linux-androideabi
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
build_android

运行

bash build_x264_clang.sh

success

合并

前提是你前面都编译好了

进入->创建->授权->编辑
gedit build_ffmpeg_link_fdk_aac_x264_clang.sh
success

我所有的文件都放在桌面上,对应下面文件内容固定
BASE_PATH=/home/maqi/Desktop/
success
编辑

#!/bin/bash

BASE_PATH=/home/maqi/Desktop/
export NDK=$BASE_PATH/android-ndk-r20b # 这里需要替换成你本地的 NDK 路径,其他的不用修改
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

function build_android
{

./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-avdevice \
--disable-symver \
--enable-libx264 \
--enable-libfdk-aac \
--enable-encoder=libx264 \
--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$FDK_INCLUDE -Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="-lm -L$FDK_LIB -L$X264_LIB $ADDI_LDFLAGS" 

make clean
make -j8
make install
echo "The Compilation of FFmpeg with x264,fdk-aac for $CPU is completed"
}

#armv8-a
ARCH=arm64
CPU=armv8-a
API=21
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=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

LIB_TARGET_ABI=arm64-v8a

#指定 fdk-aac 的头文件和静态库目录
FDK_INCLUDE=$BASE_PATH/fdk-aac-0.1.5/android/$LIB_TARGET_ABI/include
FDK_LIB=$BASE_PATH/fdk-aac-0.1.5/android/$LIB_TARGET_ABI/lib

#指定 x264 的头文件和静态库目录
X264_INCLUDE=$BASE_PATH/x264/android/$LIB_TARGET_ABI/include
X264_LIB=$BASE_PATH/x264/android/$LIB_TARGET_ABI/lib

build_android

cp $FDK_LIB/libfdk-aac.a $PREFIX/lib
cp $X264_LIB/libx264.a $PREFIX/lib

#armv7-a
ARCH=arm
CPU=armv7-a
API=21
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

LIB_TARGET_ABI=armeabi-v7a
FDK_INCLUDE=$BASE_PATH/fdk-aac-0.1.5/android/$LIB_TARGET_ABI/include
FDK_LIB=$BASE_PATH/fdk-aac-0.1.5/android/$LIB_TARGET_ABI/lib
X264_INCLUDE=$BASE_PATH/x264/android/$LIB_TARGET_ABI/include
X264_LIB=$BASE_PATH/x264/android/$LIB_TARGET_ABI/lib

build_android

cp $FDK_LIB/libfdk-aac.a $PREFIX/lib
cp $X264_LIB/libx264.a $PREFIX/lib
WARNING: Option --enable-encoder=libfdk-aac did not match anything
WARNING: /home/maqi/Desktop/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-pkg-config not found, library detection may fail.
WARNING: using libfdk without pkg-config
WARNING: using libx264 without pkg-config

编译完成
success

裁剪

加入以下配置

--disable-shared \
--enable-nonfree \
--enable-static \
--enable-gpl \
--enable-version3 \
--enable-pthreads \
--enable-runtime-cpudetect \
--enable-small \
--enable-network \
--disable-iconv \
--enable-asm \
--enable-neon \
--enable-yasm \
--disable-encoders \
--enable-libfdk-aac \
--enable-libx264 \
--enable-encoder=h263 \
--enable-encoder=libx264 \
--enable-encoder=libfdk_aac \
--enable-encoder=aac \
--enable-encoder=mpeg4 \
--enable-encoder=mjpeg \
--enable-encoder=png \
--enable-encoder=gif \
--enable-encoder=bmp \
--disable-muxers \
--enable-muxer=h264 \
--enable-muxer=flv \
--enable-muxer=gif \
--enable-muxer=image2 \
--enable-muxer=mp3 \
--enable-muxer=dts \
--enable-muxer=mp4 \
--enable-muxer=mov \
--enable-muxer=mpegts \
--enable-muxer=rtsp \
--disable-decoders \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec \
--enable-decoder=aac \
--enable-decoder=aac_latm \
--enable-decoder=mp3 \
--enable-decoder=h263 \
--enable-decoder=h264 \
--enable-decoder=mpeg4 \
--enable-decoder=mjpeg \
--enable-decoder=gif \
--enable-decoder=png \
--enable-decoder=bmp \
--enable-decoder=yuv4 \
--disable-demuxers \
--enable-demuxer=image2 \
--enable-demuxer=h263 \
--enable-demuxer=h264 \
--enable-demuxer=flv \
--enable-demuxer=gif \
--enable-demuxer=aac \
--enable-demuxer=ogg \
--enable-demuxer=dts \
--enable-demuxer=mp3 \
--enable-demuxer=mov \
--enable-demuxer=m4v \
--enable-demuxer=concat \
--enable-demuxer=mpegts \
--enable-demuxer=mjpeg \
--enable-demuxer=mpegvideo \
--enable-demuxer=rawvideo \
--enable-demuxer=yuv4mpegpipe \
--enable-demuxer=rtp \
--enable-demuxer=rtsp \
--enable-demuxer=sdp \
--disable-parsers \
--enable-parser=aac \
--enable-parser=ac3 \
--enable-parser=h264 \
--enable-parser=mjpeg \
--enable-parser=png \
--enable-parser=bmp\
--enable-parser=mpegvideo \
--enable-parser=mpegaudio \
--disable-protocols \
--enable-protocol=file \
--enable-protocol=hls \
--enable-protocol=concat \
--enable-protocol=rtmp \
--enable-protocol=rtmpe \
--enable-protocol=rtmps \
--enable-protocol=rtmpt \
--enable-protocol=rtmpte \
--enable-protocol=rtmpts \
--enable-protocol=rtp \
--enable-protocol=udp \
--enable-protocol=tcp \
--disable-filters \
--enable-filter=aresample \
--enable-filter=asetpts \
--enable-filter=setpts \
--enable-filter=ass \
--enable-filter=scale \
--enable-filter=concat \
--enable-filter=atempo \
--enable-filter=movie \
--enable-filter=overlay \
--enable-filter=rotate \
--enable-filter=transpose \
--enable-filter=hflip \
--enable-zlib \
--disable-outdevs \
--disable-doc \
--disable-ffplay \
--disable-ffmpeg \
--disable-debug \
--disable-ffprobe \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \

编译警告
warning
Android NDK 缺少arm-linux-androideabi-pkg-config

配置
AS编译失败
undefined reference to 'atof'
参考:
【Android FFMPEG 开发】Android Studio 中 配置 FFMPEG 库最小兼容版本 ( undefined reference to ‘atof’ )
解决:
success
由此引入另一个问题minSdkVersion版本冲突
<uses-sdk tools:overrideLibrary="包名" />

配置流程

配置
CmakelList


cmake_minimum_required(VERSION 3.4.1)

set(libname NativeCore)

set(jniLibs ${CMAKE_SOURCE_DIR}/src/main/jniLibs)
message(jniLibs :"${jniLibs}/${ANDROID_ABI}")
include_directories(${jniLibs}/include)
 
add_library(yuv
        SHARED
        IMPORTED)
set_target_properties(yuv
        PROPERTIES IMPORTED_LOCATION
        ${jniLibs}/${ANDROID_ABI}/libyuv.so)

add_library(
        ${libname}
        SHARED
        src/main/cpp/.cpp)

find_library(log-lib log)

target_link_libraries(
        ${libname}

        -Wl,--start-group  #忽略静态库的链接顺序。
        ${jniLibs}/${ANDROID_ABI}/libavfilter.a
        ${jniLibs}/${ANDROID_ABI}/libavformat.a
        ${jniLibs}/${ANDROID_ABI}/libavcodec.a
        ${jniLibs}/${ANDROID_ABI}/libavutil.a
        ${jniLibs}/${ANDROID_ABI}/libswresample.a
        ${jniLibs}/${ANDROID_ABI}/libswscale.a
        ${jniLibs}/${ANDROID_ABI}/libx264.a
        ${jniLibs}/${ANDROID_ABI}/libfdk-aac.a
        -Wl,--end-group

        ${log-lib}
        z
        m
        jnigraphics
        yuv)

build_gradle

defaultConfig {
		 //对应 gedit build_ffmpeg_link_fdk_aac_x264_clang.sh  API=21 
        minSdkVersion 21
        targetSdkVersion 31
        versionCode 100
        versionName '1.0.0'
        
        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_ARM_MODE=arm', '-DANDROID_STL=c++_static'
                cFlags "-ferror-limit=0 -fPIC"
                cppFlags "-std=c++11 -frtti -fexceptions"
            }
        }

        ndk {
            abiFilters "armeabi-v7a", "arm64-v8a"
        }
    }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

LearnFFmpeg
FFmpeg 开发(09):FFmpeg、x264以及fdk-aac 编译整合

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

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

相关文章

【来不及刷题之】43、最小栈(PriorityQueue)

因为要在常量时间内查询出最小值&#xff0c;所以需要有另外的数据结构维护最小值&#xff0c;很自然地想到了“堆”这个结构&#xff0c;“最小堆”的堆顶元素刚好是最小值因此出栈和入栈的同时也要维护好最小堆 class MinStack {PriorityQueue<Integer> heap;LinkedLi…

软件测试前途如何?要学吗?

1.前言 当我们面临择业问题的时候&#xff0c;因为我们本身对自己认知的不清晰和对现有自己能选择的岗位的不了解&#xff0c;往往不知道如何选择才是最优解。这个博客就专门来解答大家对于软件测试这个岗位的疑惑&#xff0c;让大家对软件测试这个岗位有更广义的了解。 本博…

观察者模式(下):如何实现一个异步非阻塞的EventBus框架?

上一节课中&#xff0c;我们学习了观察者模式的原理、实现、应用场景&#xff0c;重点介绍了不同应用场景下&#xff0c;几种不同的实现方式&#xff0c;包括&#xff1a;同步阻塞、异步非阻塞、进程内、进程间的实现方式。 同步阻塞是最经典的实现方式&#xff0c;主要是为了…

C++之std::is_same用法(一百五十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Flink HA方案介绍

1.Flink HA方案介绍 每个Flink集群只有单个JobManager&#xff0c;存在单点失败的情况。Flink有YARN、Standalone和Local三种模式&#xff0c;其中YARN和Standalone是集群模式&#xff0c;Local是指单机模式。但Flink对于YARN模式和Standalone模式提供HA机制&#xff0c;使集群…

【历史上的今天】7 月 12 日:世界上第一台商用数字计算机;Python 之父卸任 BDFL;Wacom 成立

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 7 月 12 日&#xff0c;在 1854 年的今天&#xff0c;伊士曼柯达公司的创始人、胶卷的发明者乔治伊斯曼&#xff08;George Eastman &#xff09;出生&#xf…

NC55 最长公共前缀

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** param strs string字符串一维数组* return string字符串*/public String longestCommonPrefix (String[] strs) {int n s…

类和对象(—)

今天&#xff0c;我带来类和对象的基础篇。 目录 面向对象和面向过程类类的概念类的定义类的访问限定符c中struct和class的区别封装类的作用域类的实例化类的存储结构体内存对齐规则【面试题】this指针this指针的概念this指针的特性 【面试题】 面向对象和面向过程 C语言是面向…

[PyTorch][chapter 44][时间序列表示方法3]

简介: word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包&#xff0c;它简单、高效&#xff0c;因此引起了很多人的关注。由于 word2vec 的作者 Tomas Mikolov 其主要知识点 目录&#xff1a; word2vec 基本思想 Skip-gram cbow Hierarchical sof…

MedNeXt的一些问题集锦

归纳偏差是一种关于机器学习算法的目标函数的假设&#xff0c;也就是目标函数评分的标准。 归纳偏差是指模型更容易学习到训练数据中的局部和表面特征&#xff0c;而较难捕捉全局和抽象特征。 scalable 可扩展的 network-wide优势&#xff1f;&#xff1f;&#xff1f; 深度监…

(论文精读)PRUNING FILTER IN FILTER《滤波器中的剪枝滤波器》

论文地址&#xff1a;原文 代码实现 中文翻译 一、精读论文 论文题目 PRUNING FILTER IN FILTER 论文作者 Fanxu Meng 孟繁续 刊物名称 NeurIPS 2020 出版日期 2020 摘要 剪枝已成为现代神经网络压缩和加速的一种非常有效的技术。现有的剪枝方法可分为两大类:滤波器…

MVC三层架构

1.MVC三层架构 MVC&#xff08;Model-View-Controller&#xff09;是一种常见的软件设计模式&#xff0c;用于组织和管理应用程序的代码和逻辑。它将应用程序分为三个主要部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#…

营销同质化,博鱼 sports牵手那不勒斯打开新大门

体育营销是企业进入新市场的经典方式&#xff0c;特别是对当今寻求高质量发展的国产品牌而言&#xff0c;从产品出海升级为品牌出海&#xff0c;体育营销可谓是一条必经之路。海信、OPPO、华为等中国品牌通过持续的体育营销不断拉近自身与海外消费者的距离&#xff0c;成功在海…

反常积分定义

目录 反常积分的定义 判断敛散性的方法 方法2&#xff1a; 例题 无界函数的反常积分 判断敛散性的方法 例题 反常积分的定义 该极限存在就表示该反常积分收敛 对于定义3&#xff0c;只有两个都收敛的情况下&#xff0c;原反常积分才收敛。 判断敛散性的方法 始终大的函数形成…

走进USB的U1模式

综述&#xff1a; PCIE有PM和ASPM两种功耗管理模式&#xff0c;USB只有一种 USB有U1/U2/U3三种低功耗模式 本文只针对U1进行分析 如下图所示&#xff0c;为主要状态变换 背景知识 U1是一种低功耗模式&#xff0c;定义的是link的状态不是设备的状态发送LGO_X进入低功耗模式&a…

C++图形开发(12):随机方块的速度和高度

文章目录 1.随机高度2.随机速度3.整段代码4.总结 1.随机高度 那既然是随机&#xff0c;自然少不了随机函数rand()咯~ 详见&#xff1a;C爱好者的自我修养&#xff08;17&#xff09;:rand()随机函数 那么随机速度就可以是&#xff1a; rect_height rand() % int(height / 4)…

【在 WSL2 GUI 中使用 pulseaudio 播放声音】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pulseaudio 是什么&#xff1f;二、部署步骤1.下载PulseAudio2.前提条件3.开始配置1.配置pulseaudio2.配置麦克风权限3.配置WSL2外放4.配置WSL2麦克风 总结…

hbase之引入Phoenix

Phoenix简介 Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表&#xff0c;插入数据和查询HBase数据。 1&#xff09;容易集成&#xff1a;如Spark&#xff0c;Hive&#xff0c;Pig&#xff0c;Flume和Map Reduce&#xff1b; 2&#xf…

RocketMQ5.0消息存储<四>_刷盘机制

RocketMQ5.0消息存储<四>_刷盘机制 一、刷盘概览 RocketMQ存储与读写是基于JDK NIO的内存映射机制(MappedByteBuffer),消息存储时首先将消息追加到文件内存映射(commit操作),再根据配置的刷盘策略在不同时间进行刷写到磁盘(flush操作)。同步刷盘,消息提交到文件内…

计算机实习学习总结报告10篇

计算机实习学习总结报告篇1 一、实习单位&#xff1a; 来到实习单位后主要是在门市从事产品的销售和商家间渠道工作。在工作的过程中了解计算机相关行业的发展现状及趋势;熟悉计算机硬件组装、计算机系统及软件安装、局域网搭建;掌握典型计算机网络工程的安装与维护;了解网站…