NDK交叉编译FFmpeg安卓编译ffmpeg

这篇具有很好参考价值的文章主要介绍了NDK交叉编译FFmpeg安卓编译ffmpeg。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

NDK交叉编译FFmpeg安卓编译ffmpeg

编译环境

编译工具下载

参考这个:https://blog.csdn.net/gaoliang0/article/details/81913291

或者官网 NDK编译工具下载: https://developer.android.google.cn/ndk/downloads?hl=zh-cn

官网老版本: https://github.com/android/ndk/wiki/Unsupported-Downloads

或者从我的百度网盘:

链接:https://pan.baidu.com/s/1FEtM6mVNgER_DvC2myHB5Q?pwd=28l9
提取码:28l9
–来自百度网盘超级会员V6的分享

准备下载 android-ndk-r19c-linux-x86_64.zip 因为这个版本比较适中

编译过程

编译环境

系统环境

系统环境:

iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ uname -a
Linux iyfangfeng 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

NDK版本:

/home/iyfangfeng/libsrc/tools/android-ndk-r19c

以下只编译armeabi-v7a版本如果需要编译其他版本 可以参考 build_fdkaac_all.sh 方式

NDK版本的选择

当前Google给的NDK工具支持GCC最高版本android-ndk-r17c-linux-x86_64.zip之后的版本不再支持gcc,只支持clang来编译,而使用gcc或者clang编译在编译脚本上存在差别,所以需要注意着点。

选择哪个版本取决于使用的编译脚本。

下面的ffmpeg因为涉及到很多第三方库所以会存在同时使用r17c以上的版本或者r17c下的版本 使用gcc编译。

注意:

如果遇到一些奇怪的问题可以换一换NDK版本时候,有时候就解决了,或者更多的使用自己经常使用的版本,比如我用的多是android-ndk-r10e环境来适应gcc编译环境,问题少很多。

  • 本地NDK编译器目录参考

    iyfangfeng@iyfangfeng:~/libsrc/tools$ ls
    android-ndk-r10e  android-ndk-r10e-linux-x86_64.zip  android-ndk-r16b  android-ndk-r16b-linux-x86_64.zip  android-ndk-r19c  android-ndk-r19c-linux-x86_64.zip
    iyfangfeng@iyfangfeng:~/libsrc/tools$ 
    
    

源码下载

ffmpeg-3.3.8.tar.gz 
  • ffmpeg 下载

    https://gitee.com/mirrors/ffmpeg/tags?page=4

    http://ffmpeg.org/download.html#releases

只编译简单的ffmpeg

编译
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ./build_ffmpeg.sh armeabi-v7a
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ls libs/lib-ffmpeg/armeabi-v7a/lib/
libavcodec.so  libavdevice.so  libavfilter.so  libavformat.so  libavutil.so  libpostproc.so  libswresample.so  libswscale.so  pkgconfig

./build_ffmpeg.sh 使用的是gcc 编译脚本

编译脚本
  • 最简单的目录结构

    iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ls
    build_ffmpeg.sh  config.sh   libs   ffmpeg-3.3.8
    
  • build_ffmpeg.sh

iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ cat build_ffmpeg.sh 
#!/bin/bash

ARCH=$1

source config.sh $ARCH
LIBS_DIR=$(cd `dirname $0`; pwd)/libs/lib-ffmpeg
echo "LIBS_DIR="$LIBS_DIR

cd ffmpeg-3.3.8

PLATFORM=$ANDROID_NDK_ROOT/platforms/$AOSP_API/$AOSP_ARCH
TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/$TOOLCHAIN_BASE-$AOSP_TOOLCHAIN_SUFFIX/prebuilt/linux-x86_64

PREFIX=$LIBS_DIR/$AOSP_ABI

echo ===============================
echo $PREFIX

./configure \
--prefix=$PREFIX \
--enable-cross-compile \
--disable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--target-os=android \
--cc=$TOOLCHAIN/bin/$TOOLNAME_BASE-gcc \
--cross-prefix=$TOOLCHAIN/bin/$TOOLNAME_BASE- \
--disable-stripping \
--nm=$TOOLCHAIN/bin/$TOOLNAME_BASE-nm \
--sysroot=$PLATFORM \
--enable-gpl \
--enable-shared \
--disable-static \
--enable-small \
--enable-postproc \
--enable-avdevice \
--disable-outdevs \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-ffserver \
--disable-debug \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-symver \
--disable-stripping \
--extra-cflags="$FF_EXTRA_CFLAGS  $FF_CFLAGS" \
--extra-ldflags="  "

make clean
make -j8
make install

cd ..

  • config.sh

    iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ cat config.sh
    
    #NDK路径
    #clang ffmpeg 
    #export ANDROID_NDK_ROOT=/home/yanglong/iyangfeng/tools/android-ndk-r19c
    #上面是之前电脑编译路径
    #export ANDROID_NDK_ROOT=/home/iyfangfeng/libsrc/tools/android-ndk-r19c
    #clang
    
    
    #CXX  gcc r17c 及其以下
    #fdkaac x264 
    export ANDROID_NDK_ROOT=/home/iyfangfeng/libsrc/tools/android-ndk-r10e
    
    
    
    
    export AOSP_TOOLCHAIN_SUFFIX=4.9
    
    export AOSP_API="android-21"
    
    #架构
    if [ "$#" -lt 1 ]; then
    	THE_ARCH=armv7
    else
    	THE_ARCH=$(tr [A-Z] [a-z] <<< "$1")
    fi
    
    #根据不同架构配置环境变量
    case "$THE_ARCH" in
      arm|armv5|armv6|armv7|armeabi)
    	TOOLCHAIN_BASE="arm-linux-androideabi"
    	TOOLNAME_BASE="arm-linux-androideabi"
    	AOSP_ABI="armeabi"
    	AOSP_ARCH="arch-arm"
    	HOST="arm-linux-androideabi"
    	AOSP_FLAGS="-march=armv5te -mtune=xscale -mthumb -msoft-float -funwind-tables -fexceptions -frtti"
    	FF_EXTRA_CFLAGS="-O3 -fpic -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 -mfloat-abi=softfp -mfpu=vfp -marm -march=armv6 "
    	FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID  "
    	;;
      armv7a|armeabi-v7a)
    	TOOLCHAIN_BASE="arm-linux-androideabi"
    	TOOLNAME_BASE="arm-linux-androideabi"
    	AOSP_ABI="armeabi-v7a"
    	AOSP_ARCH="arch-arm"
    	HOST="arm-linux-androideabi"
    	AOSP_FLAGS="-march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti "
    	FF_EXTRA_CFLAGS="-DANDROID  -fPIE -pipe -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing"
    	FF_CFLAGS="-O3 -Wall -fPIE -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wa,--noexecstack -DANDROID "
    	;;
      hard|armv7a-hard|armeabi-v7a-hard)
    	TOOLCHAIN_BASE="arm-linux-androideabi"
    	TOOLNAME_BASE="arm-linux-androideabi"
    	AOSP_ABI="armeabi-v7a"
    	AOSP_ARCH="arch-arm"
    	HOST="arm-linux-androideabi"
    	AOSP_FLAGS="-mhard-float -D_NDK_MATH_NO_SOFTFP=1 -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti -Wl,--no-warn-mismatch -Wl,-lm_hard"
    	FF_EXTRA_CFLAGS="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 "
    	FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID  "
    	;;
      neon|armv7a-neon)
    	TOOLCHAIN_BASE="arm-linux-androideabi"
    	TOOLNAME_BASE="arm-linux-androideabi"
    	AOSP_ABI="armeabi-v7a"
    	AOSP_ARCH="arch-arm"
    	HOST="arm-linux-androideabi"
    	AOSP_FLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti"
    	FF_EXTRA_CFLAGS="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 "
    	FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID  "
    	;;
      armv8|armv8a|aarch64|arm64|arm64-v8a)
    	TOOLCHAIN_BASE="aarch64-linux-android"
    	TOOLNAME_BASE="aarch64-linux-android"
    	AOSP_ABI="arm64-v8a"
    	AOSP_ARCH="arch-arm64"
    	HOST="aarch64-linux"
    	AOSP_FLAGS="-funwind-tables -fexceptions -frtti"
    	FF_EXTRA_CFLAGS=""
    	FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID  "
    	;;
      mips|mipsel)
    	TOOLCHAIN_BASE="mipsel-linux-android"
    	TOOLNAME_BASE="mipsel-linux-android"
    	AOSP_ABI="mips"
    	AOSP_ARCH="arch-mips"
    	HOST="mipsel-linux"
    	AOSP_FLAGS="-funwind-tables -fexceptions -frtti"
    	;;
      mips64|mipsel64|mips64el)
    	TOOLCHAIN_BASE="mips64el-linux-android"
    	TOOLNAME_BASE="mips64el-linux-android"
    	AOSP_ABI="mips64"
    	AOSP_ARCH="arch-mips64"
    	HOST="mipsel64-linux"
    	AOSP_FLAGS="-funwind-tables -fexceptions -frtti"
    	;;
      x86)
    	TOOLCHAIN_BASE="x86"
    	TOOLNAME_BASE="i686-linux-android"
    	AOSP_ABI="x86"
    	AOSP_ARCH="arch-x86"
    	HOST="i686-linux"
    	AOSP_FLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -funwind-tables -fexceptions -frtti"
    	FF_EXTRA_CFLAGS="-O3 -DANDROID -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -fomit-frame-pointer -march=k8 "
    	FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID  "
    	;;
      x86_64|x64)
    	TOOLCHAIN_BASE="x86_64"
    	TOOLNAME_BASE="x86_64-linux-android"
    	AOSP_ABI="x86_64"
    	AOSP_ARCH="arch-x86_64"
    	HOST="x86_64-linux"
    	AOSP_FLAGS="-march=x86-64 -msse4.2 -mpopcnt -mtune=intel -funwind-tables -fexceptions -frtti"
    	FF_EXTRA_CFLAGS="-O3 -DANDROID -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -fomit-frame-pointer -march=k8 "
            FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID  "
    	;;
      *)
    	echo "ERROR: Unknown architecture $1"
    	[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1
    	;;
    esac
    
    echo "TOOLCHAIN_BASE="$TOOLCHAIN_BASE
    echo "TOOLNAME_BASE="$TOOLNAME_BASE
    echo "AOSP_ABI="$AOSP_ABI
    echo "AOSP_ARCH="$AOSP_ARCH
    echo "AOSP_FLAGS="$AOSP_FLAGS
    echo "HOST="$HOST
    
    
    
问题
  • C compiler cannot create executables
checking whether the C compiler works... no
configure: error: in `/home/iyfangfeng/libsrc/ffmpeg/basic/clangffmpeg0511/fdk-aac-0.1.6':
configure: error: C compiler cannot create executables
See `config.log' for more details

解决:

之前使用的是clang ndk-r19c的编译环境建议换成r10e或者r14 不能使用r16b 有问题

  • fatal error: stdio.h: No such file or directory

    libSYS/src/cmdl_parser.cpp:96:19: fatal error: stdio.h: No such file or directory
     #include <stdio.h>
                       ^
    compilation terminated.
    Makefile:1270: recipe for target 'libSYS/src/cmdl_parser.lo' failed
    make: *** [libSYS/src/cmdl_parser.lo] Error 1
    make: *** 正在等待未完成的任务....
    libSYS/src/genericStds.cpp:95:18: fatal error: math.h: No such file or directory
    
    

    百度后说:改用ndk-r14b,因为r16b目录结构改了。 这有可能,我换的是 r10e 这个之前用的最多 https://www.jianshu.com/p/38894c45daf0

    确实编译过了 遇到类似问题可以换版本试试 android-ndk-r10e

  • 编译器路径一直都还是之前项目的

    重新创建一个目录,再下载一个版本 oK

  • Unknown option “–enalbe-demuxer=flv”.

Unknown option "--enalbe-demuxer=flv".
See ./configure --help for available options.

除了报错这个外海包含其他的错误,可能是这个版本不支持flv 解复用,可以编译选项中删除掉

使用

可以在Android Studio 上面演示,暂时没有完全独立的demo,用得人多再补吧,先编译

技术支持

按照如上提供的步骤,如果还存在问题,可以找我获取可以使用的so库、源码、脚本、带环境及源码的虚拟机。应该有地方可以获取名片。promptpe文章来源地址https://www.toymoban.com/news/detail-719361.html

到了这里,关于NDK交叉编译FFmpeg安卓编译ffmpeg的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FFMPEG使用DrawText滤镜添加字幕,包含ndk编译freetype

            ffmpeg使用drawtext滤镜需要在编译的时候使能drawtext,要想成功使能必须要先集成编译freetype库,并通知到ffmpeg(交叉编译没有安装到系统库路径)。         也有看到有的文章说需要集成fribidi,笔者也交叉编译了,但是最终没有用到,可能是ffmpeg版本的原因。 freety

    2024年01月17日
    浏览(72)
  • Android中集成FFmpeg及NDK基础知识

    在日常App开发中,难免有些功能是需要借助NDK来完成的,比如现在常见的音视频处理等,今天就以ffmpeg入手,来学习下Android NDK开发的套路. 很多人并不清除JNI和NDK的概念,经常搞混这两样东西,先来看看它们各自的定义吧. 很多人并不清除JNI和NDK的概念,经常搞混这两样东西,先来看看

    2024年01月17日
    浏览(39)
  • Android-NDK的linux交叉编译环境

    NDK 下载  |  Android NDK  |  Android Developers https://github.com/android/ndk/wiki/Unsupported-Downloads 以android-ndk-r26c下载为例,下载后将压缩包解压至/usr目录下 编译平台变量判断条件中增加一下android条件下CMake的变量 详细变量设置参考 C++ 库支持  |  Android NDK  |  Android Developers 编译出的程

    2024年04月10日
    浏览(45)
  • FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库

    ​ 《FFmpeg开发实战:从零基础到短视频上线》一书的“12.1.2  交叉编译Android需要的so库”介绍了如何在Windows环境交叉编译Android所需FFmpeg的so库,接下来介绍如何在Linux环境交叉编译Android所需FFmpeg的so库。 登录Linux服务器(比如华为云的欧拉系统),依次执行下面的命令。 重

    2024年03月24日
    浏览(50)
  • FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库

    ​ 《FFmpeg开发实战:从零基础到短视频上线》一书的例程主要测试本地的音视频文件,当然为了安全起见,很多网络视频都采用了https地址。FFmpeg若要访问https视频,就必须集成第三方的openssl库,但编译FFmpeg时却默认关闭了openssl。为了让App能够播放采用https的在线视频,需要

    2024年04月22日
    浏览(39)
  • FFmpeg开发笔记(九)Linux交叉编译Android的x265库

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

    2024年04月08日
    浏览(72)
  • 在Clion开发工具上使用NDK编译可以在安卓上执行的程序

            因为工作需要,我要将一份C语言代码编译成可执行文件传送到某安卓系统里执行。         众所周知,使用ndk编译代码有三种使用方式,分别是基于 Make 的 ndk-build、CMake以及独立工具链。以前进行ndk编程都是使用ndk-build进行的,新建jni目录,编写Android.mk和A

    2023年04月12日
    浏览(37)
  • android ndk一些编译链接错误及解决办法

    链接opencv库时报链接错误缺少libz库 解决,mediann是本人所编译库的名字 链接librknnrt.so时报 解决 使用的是aarch-linux的库,报错换成android版本的librknnrt.so即可 链接opencv库时报错缺少jnigraphics 解决 链接opencv库时报错确实mediandk 解决 链接opencv时报很多std的链接错误 解决 ndk版本太

    2024年02月09日
    浏览(49)
  • 安卓高级工程师面试题,Android 仪器化单元测试(1),ndk开发入门

    配置 build.gradle 依赖 dependencies { androidTestImplementation ‘androidx.test🏃1.4.0’ androidTestImplementation ‘androidx.test:rules:1.4.0’ } android { defaultConfig { testInstrumentationRunner “androidx.test.runner.AndroidJUnitRunner” } } 测试样例 测试代码 本例子参考 google 官方网站。因为官网里面很多类没有给到

    2024年04月16日
    浏览(44)
  • (NDK编译)详解使用Android.mk编译的C/C++程序过程

    想要在 Android设备 上运行 C/C++程序 可执行文件,可采用一个方法就是使用 NDK编译 ,很多时候要比 gcc编译 更适合,这里我采用的是 imx6q开发板 上面装载了自己编写的Android6.0.1镜像,在 Ubuntu64位 系统上采用NDK编译。 目录 1.准备文件 2.编写Android.mk 注意 完整Android.mk代码 3.NDK编

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包