• ffmpeg6.0编译(NDK)


    ffmpeg 6.0 支持vulkan 需要手动安装Vulkan 并将include里面的vk_video 和 vulkan 拷贝到 android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/
    vulkan 下载

    cp -r vk_video $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/
    cp -r vulkan $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/
    
    • 1
    • 2

    1 下载ffmpeg源码(网速差的可以直接传文件包到Linux上安装)
    mkdir ffmpeg
    cd ffmpeg
    wget https://ffmpeg.org/releases/ffmpeg-6.0.tar.xz
    2 解压
    xz -d ffmpeg-6.0.tar.xz 先解压成 ffmpeg-6.0.tar
    tar -zxf ffmpeg-6.0.tar -C ./ 解压到当前目目录
    或者 tar -xf ffmpeg-6.0.tar.xz -C ./ 解压到当前目目录
    3 下载NDK 版本 (r25c)
    cd /home
    mkdir ndk
    cd ndk
    wget https://dl.google.com/android/repository/android-ndk-r25c-linux.zip
    4 解压
    unzip android-ndk-r25c-linux.zip
    5 配置环境
    cd /etc/profile.d/
    touch ndk.sh
    vim ndk.sh 输入下面的内容保存并退出

    export NDK_ROOT=/home/ndk/android-ndk-r25c
    export PATH=$NDK_ROOT:$PATH
    
    • 1
    • 2

    激活配置:source /etc/profile
    echo $NDK_ROOT 输出如图所示的结果说明配置成功
    在这里插入图片描述

    6开始配置编译文件并对ffmpeg进行编译
    把ffmpeg源码编译成.so文件,可以供Android进行调用
    第一步修改configure里面的配置

    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
    
    • 1
    • 2
    • 3
    • 4

    修改为

    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)$(LIBMAJOR)$(SLIBSUF)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'
    
    • 1
    • 2
    • 3
    • 4

    配置–cross-prefix-clang=PREFIX

     --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
     # 这里添加
     --cross-prefix-clang=PREFIX use PREFIX for compilation clang tools [$cross_prefix]
    
    • 1
    • 2
    • 3

    找到如图所示把cc_default="clang"改为cxx_default=“clang++”,如果用的是C语言可以不修改cross-prefix-clang前缀也添加上
    在这里插入图片描述

    set_default target_os
    if test "$target_os" = android; then
        cc_default="clang"
        # 这里修改 默认值
       cxx_default="clang++"
    fi
    
    ar_default="${cross_prefix}${ar_default}"
    cc_default="${cross_prefix}${cc_default}"
    cxx_default="${cross_prefix}${cxx_default}"
    nm_default="${cross_prefix}${nm_default}"
    pkg_config_default="${cross_prefix}${pkg_config_default}"
    ranlib_default="${cross_prefix}${ranlib_default}"
    strip_default="${cross_prefix}${strip_default}"
    windres_default="${cross_prefix}${windres_default}"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    添加编译脚本android_build.sh,添加权限chmod 777 android_build.sh,执行脚本 sh android_build.sh

    #!/bin/bash
    
    # 指定ndk路径
    # 指定交叉编译链
    TOOLCHHAINS=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64
    
    echo "开始编译ffmpeg"
    
    function build_android
    {
    	./configure \
    	--prefix=$PREFIX \
    	--enable-gpl \
    	--disable-postproc \
    	--disable-debug \
    	--enable-small \
    	--enable-jni \
    	--enable-mediacodec  \
    	--enable-decoder=h264_mediacodec \
    	--enable-static \
    	--enable-shared \
    	--disable-doc \
    	--enable-ffmpeg \
    	--disable-ffplay \
    	--disable-ffprobe \
    	--disable-avdevice \
    	--disable-symver \
    	--cross-prefix=$CROSS_PREFIX \
    	--target-os=android \
    	--arch=$ARCH \
    	--cpu=$CPU \
    	--cc=$CC \
    	--cxx=$CXX \
    	--enable-cross-compile \
    	--sysroot=$SYSROOT \
    	--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    	--extra-ldflags="$ADDI_LDFLAGS"
    
    	make
    	make clean
    	make -j16
    	make install
    
    	echo "============================ build android arm64-v8a success =========================="
    }
    
     
     #arm64-v8a
    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=$(pwd)/android/$CPU
    OPTIMIZE_CFLAGS="-march=$CPU"
    
    build_android
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    编译好的文件在当前目录的Android文件夹里面, 如果与prefix路径不匹配, 可以在ffbuild的config.log中查看prefix

  • 相关阅读:
    【Linux 进程通信】消息队列
    数据治理实战——翼支付金融板块业务数仓建设和数据治理之路
    域名不部署SSL证书有什么影响?
    决胜B端产品经理学习笔记03
    AddressSanitizer(ASan)
    写在Go语言招生之际
    JDBC操作数据库实现增、删、查、改
    【面试专栏】第五篇:Java基础:集合篇-LinkedHashMap、ConcurrentHashMap、TreeMap
    Servlet
    金蝶OA server_file 目录遍历漏洞
  • 原文地址:https://blog.csdn.net/qq_41505416/article/details/132819580