window 10 下安装 Ubuntu 22.04 使用 NDK r24 编译FFmpeg 5.1

一、第一步window 10下安装 Ubuntu

1.打开主板虚拟化并打开子系统服务

不打开此功能你的电脑无法正常使用虚拟机,具体不再这里描述,请自行百度”主板品牌 + 打开虚拟化“
右键”开始按钮“,选择”应用和功能“


image.png

点击”程序和功能“


image.png

点击”启用或关闭windows功能“
image.png

拉到底找到”适用于Linux的windows子系统“,勾选上
image.png

自此window10下需要设置的内容均已完成,可以开始下载Ununtu系统了

2.点击左下角开始按钮(window按钮),打开 store 若没有可以通过下方搜索栏查找

image.png

打开后,如下图搜索“Ubuntu”,我选择的是22.04版本


image.png

点击你要下载的版本后,进入到下面页面点击“Get”按钮(因我已经安装了22.04版本,下面点击的20.04版本给大家演示)


image.png

下载中会变成download状态,若未出现此画面,请想办法调整自己的网络,网络问题过于复杂,请自行解决
image.png

下载成功后,点击“open”然后等待即可
image.png

继续等待。。。。


image.png

请输入你自己的账号和密码
image.png

此时你的Ubuntu已经安装成功
image.png

自此Ubuntu系统已经安装完成,接下来可以安装一下方便操作的工具

3.安装Xshell、Xftp 这部分是我自己找的一个方便操作的工具,因为简单的文件复制等操作不想再去查linux命令

百度 “Xshell” 找到了 https://www.xshell.com/zh/xshell/ 网站,简单看了下,单用户免费使用
安装过程省略
安装好以后,点击Xshell,点击“新建链接”

image.png

输出“名称”,主机地址“127.0.0.1”
image.png

点击“用户身份验证”输入用户名:“xwl”输入密码:“XXXXXXX”方法选择password,点击连接
image.png

然后报错了,是正常的,请去检查Ubuntu是否开启了ssh服务
image.png

如果将之前安装的Ubuntu操作窗口关闭了,请再次打开,可以通过这里
image.png

先获取root权限,再安装openssh,再通过Xshell重新连接
此时输入“su”,按提示输入密码,提示密码错误,是因为首次安装还没有设置root用户密码,此时输入“sudo passwd”再按照提示多次输入密码即可,设置好以后再输入“su”输入密码后成功
image.png

输入“ssh-keygen -A”,再输入“/etc/init.d/ssh start”启动sshd,此时输入“ ps -e | grep ssh”查询ssh启动情况
image.png

此时还无法通过Xshell直接使用账号密码登录,需要配置公钥,我嫌麻烦,稍微改一下允许通过账号密码登录
image.png

image.png

按Insert,进入修改,将no改为yes,按esc键,按“:wq”,回车
image.png

输入“sudo service ssh restart” 重启ssh服务
此时Xshell再次连接,连接成功
image.png

Xftp接入,再上述基础上很简单就完成
image.png

image.png

至此,Ubuntu环境基本完成,接下来开始进入正题,ffmpeg编译

4.先将需要的工具下载好

4.1 NDK r24 下载过程:

打开 android开发者网站
找到NDK的下载地址:NDK r24 Linux 版本 https://dl.google.com/android/repository/android-ndk-r24-linux.zip
Xshell 输入 “su”回车 输入密码“XXXXXX”(我喜欢再root权限下搞,减少权限问题)
确认下载文件存放路径(/home/xwl),输入”wget https://dl.google.com/android/repository/android-ndk-r24-linux.zip“ 进行下载

image.png

下载好以后,输入”ll“查看文件
image.png

接下来需要将NDK压缩包进行解压,输入”apt install unzip“ 安装解压缩软件,安装好以后再输入”unzip android-ndk-r24-linux.zip“等待解压成功
至此NDK工具已经安排好了,接下来需要下载FFmpeg源码

4.2 FFmpeg 5.1 下载过程:

下载地址 http://ffmpeg.org/download.html
可以通过windows下载压缩包,然后通过Xftp 直接拖进指定路径下,也可以通过Ubuntu 安装git ,通过git clone下载
输入”sudo git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg “
等待完成即可

4.3 修改权限

将NDK与ffmpeg权限修改成”777“
输入”chmod 777 -R android-ndk-r24“
输入”chmod 777 -R ffmpeg“

4.4 添加dos2unix工具,此工具是将windows下编写的文件转换成linux下的编码格式,很多时候我习惯用windows将编译脚本修改好,通过Xftp拖拽到Ubuntu下,此时需要通过Xshell 执行dos2unix转换格式

输入”apt-get update“
输入”apt-get install dos2unix“

4.5 添加make工具

输入”apt-get install make“

4.6 添加gcc工具

输入”apt-get install gcc“

4.7 添加yasm工具

输入”apt-get install yasm“
至此,所需工具与代码均已下载完成,接下来开始编写编译脚本完成编译

5.编写编译脚本

5.1 执行configure

先进入到ffmpeg文件夹下,我的路径是"/home/xwl/ffmpeg"
输入”./configure“
这个过程有可能会报错,上面4.X中添加各种工具就是这个过程中发现了异常,根据异常去搜索答案时添加的,如果按照我的流程走下还有报错,可以自行google一下,也欢迎反馈到评论区

5.2 复制脚本build_android_2.sh

通过Xftp拖拽到ffmpeg文件夹下
脚本复制成功后
输入”dos2unix build_android_2.sh“ 转换Linux编码
输入”chmod 777 build_android_2.sh“ 赋予权限
输入”./build_android_2.sh“ 开始编译
无尽的等待,编译一个ABI(android下不同cpu指令集 eg:arm64-v8a、armeabi-v7a、x86、x86_64)预计10-20min一个

5.3 build_android_2.sh 内容
5.3.1 NDK_PATH地址一定要准确!!!!NDK_PATH地址一定要准确!!!!NDK_PATH地址一定要准确!!!!重要的事说3编
5.3.2 最后可以通过#注释掉不需要的ABI,建议先用一个确认是否可以编译成功,若可以再将其它的开启

#build "armeabi-v7a"
build "arm64-v8a"
#build "x86"
#build "x86_64"

5.3.3 COMMON_OPTIONS="$COMMON_OPTIONS --target-os=android"

旧版本有时需要修改configure,新版本可以通过--target-os=android去设置
有些文章还有configure的修改过程,按照本文流程是不需要的

5.3.4 build_android_2.sh 正文

#!/bin/bash
# 用于编译android平台的脚本

# NDK所在目录
NDK_PATH=/home/xwl/android-ndk-r24 # tag1
# macOS 平台编译,其他平台看一下 $NDK_PATH/toolchains/llvm/prebuilt/ 下的文件夹名称
HOST_PLATFORM=linux-x86_64  #tag1
# minSdkVersion
API=23

TOOLCHAINS="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM"
SYSROOT="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM/sysroot"
# 生成 -fpic 与位置无关的代码
CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID "
LDFLAG="-lc -lm -ldl -llog "

# 输出目录
PREFIX=`pwd`/android
# 日志输出目录
CONFIG_LOG_PATH=${PREFIX}/log
# 公共配置
COMMON_OPTIONS=
# 交叉配置
CONFIGURATION=

build() {
  APP_ABI=$1
  echo "======== > Start build $APP_ABI"
  case ${APP_ABI} in
  armeabi-v7a)
    ARCH="arm"
    CPU="armv7-a"
    MARCH="armv7-a"
    TARGET=armv7a-linux-androideabi
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    # 交叉编译工具前缀
    CROSS_PREFIX="$TOOLCHAINS/bin/arm-linux-androideabi-"
    EXTRA_CFLAGS="$CFLAG -mfloat-abi=softfp -mfpu=vfp -marm -march=$MARCH "
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS="--enable-neon --cpu=$CPU "
    ;;
  arm64-v8a)
    ARCH="aarch64"
    TARGET=$ARCH-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"
    EXTRA_CFLAGS="$CFLAG"
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS=""
    ;;
  x86)
    ARCH="x86"
    CPU="i686"
    MARCH="i686"
    TARGET=i686-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"
    #EXTRA_CFLAGS="$CFLAG -march=$MARCH -mtune=intel -mssse3 -mfpmath=sse -m32"
    EXTRA_CFLAGS="$CFLAG -march=$MARCH  -mssse3 -mfpmath=sse -m32"
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS="--cpu=$CPU "
    ;;
  x86_64)
    ARCH="x86_64"
    CPU="x86-64"
    MARCH="x86_64"
    TARGET=$ARCH-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"
    #EXTRA_CFLAGS="$CFLAG -march=$CPU -mtune=intel -msse4.2 -mpopcnt -m64"
    EXTRA_CFLAGS="$CFLAG -march=$CPU -msse4.2 -mpopcnt -m64"
    EXTRA_LDFLAGS="$LDFLAG"
    EXTRA_OPTIONS="--cpu=$CPU "
    ;;
  esac

  echo "-------- > Start clean workspace"
make clean

  echo "-------- > Start build configuration"
  CONFIGURATION="$COMMON_OPTIONS"
  CONFIGURATION="$CONFIGURATION --logfile=$CONFIG_LOG_PATH/config_$APP_ABI.log"
  CONFIGURATION="$CONFIGURATION --prefix=$PREFIX"
  CONFIGURATION="$CONFIGURATION --libdir=$PREFIX/libs/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --incdir=$PREFIX/includes/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --pkgconfigdir=$PREFIX/pkgconfig/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --cross-prefix=$CROSS_PREFIX"
  CONFIGURATION="$CONFIGURATION --arch=$ARCH"
  CONFIGURATION="$CONFIGURATION --sysroot=$SYSROOT"
  CONFIGURATION="$CONFIGURATION --cc=$CC"
  CONFIGURATION="$CONFIGURATION --cxx=$CXX"
  CONFIGURATION="$CONFIGURATION --ld=$LD"
  # nm 和 strip
  CONFIGURATION="$CONFIGURATION --nm=$TOOLCHAINS/bin/llvm-nm"
  CONFIGURATION="$CONFIGURATION --strip=$TOOLCHAINS/bin/llvm-strip"
  CONFIGURATION="$CONFIGURATION $EXTRA_OPTIONS"

  echo "-------- > Start config makefile with $CONFIGURATION --extra-cflags=${EXTRA_CFLAGS} --extra-ldflags=${EXTRA_LDFLAGS}"
  ./configure ${CONFIGURATION} \
  --extra-cflags="$EXTRA_CFLAGS" \
  --extra-ldflags="$EXTRA_LDFLAGS"

  echo "-------- > Start make $APP_ABI with -j1"
  make -j1

  echo "-------- > Start install $APP_ABI"
  make install
  echo "++++++++ > make and install $APP_ABI complete."

}

build_all() {
  #配置开源协议声明
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-gpl"
  #目标android平台
  COMMON_OPTIONS="$COMMON_OPTIONS --target-os=android"
  #取消默认的静态库
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-static"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-shared"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-protocols"
  #开启交叉编译
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-cross-compile"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-optimizations"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-debug"
  #尽可能小
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-small"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-doc"
  #不要命令(执行文件)
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-programs"  # do not build command line programs
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg"    # disable ffmpeg build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay"    # disable ffplay build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe"   # disable ffprobe build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-symver"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-network"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-x86asm"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-asm"
  #启用
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-pthreads"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-mediacodec"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-jni"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-zlib"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-pic"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-muxer=flv"
  #COMMON_OPTIONS="$COMMON_OPTIONS --enable-avresample"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=h264"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mpeg4"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mjpeg"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=png"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=vorbis"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=opus"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=flac"
  echo "COMMON_OPTIONS=$COMMON_OPTIONS"
  echo "PREFIX=$PREFIX"
  echo "CONFIG_LOG_PATH=$CONFIG_LOG_PATH"
  mkdir -p ${CONFIG_LOG_PATH}
  #build "armeabi-v7a"
  build "arm64-v8a"
  #build "x86"
  #build "x86_64"
}

echo "-------- Start --------"
build_all
echo "-------- End --------"

5.4 给大家看一下我的文件路径截图,以及操作情况

/home/xwl下仅有android-ndk-r24 和 ffmpeg 文件夹,均已”chmod 777 -R 文件夹名“过
android-ndk-r24文件夹除了赋权限无任何其他操作


image.png

ffmpeg文件夹

5.4.1 赋权限
5.4.2 复制build_android_2.sh文件
5.4.3 build_android_2.sh 转编码、赋权限
5.4.4 执行configure
5.4.5 执行build_android_2.sh
image.png

最后生成的文件放入到ffmpeg/android下


image.png

集成so文件到Android中并使用

可以看我另一篇文章
window10环境 android studio集成ffmpeg5.1 NDK r24

你可能感兴趣的:(window 10 下安装 Ubuntu 22.04 使用 NDK r24 编译FFmpeg 5.1)