windows 下使用 NDK 编译 ffmpeg 4.1.3

一年多过去了,ffmpeg 已经到了 4.1.3 版本,谷歌也将 gcc 从 NDK 中移除。

一、指定编译器

由于 gcc 从 ndk 中移除,需要在 configure 时使用 --cc --cxx --ld 来分别指定 c/c++编译器和链接器。

找 ndk 的 clang 文件的位置,可以看见谷歌已经为我们写好各个架构和不同android版本的运行脚本。

例如编译的目标架构是 armv7a,目标 android 版本为 19,使用一下参数即可。

至于为啥连接器指定 armv7a-linux-androideabi19-clang 而不是 arm-linux-androideabi-ld 自己试试就知道

--cc=/文件路径/armv7a-linux-androideabi19-clang \
--cxx=/文件路径/armv7a-linux-androideabi19-clang++ \
--ld=/文件路径/armv7a-linux-androideabi19-clang

二、使用 cygwin 进行编译

使用 cygwin 时还是有坑的,由于 ffmpeg 4.x.x 版本在编译过程中使用软连接命令,而链接器无法识别 cygwin 的软链接符号,所以会在 libavutil/libavutil.so 时报错,这时需要通过 --ln_s="cp -rf" 来指定使用复制替代 "ln -s"

照例放出脚本:

#!/bin/bash
export TMPDIR=`dirname $0`/tmpdir
NDK=D:/Android/android-sdk/ndk-bundle
API=19
# arm aarch64 i686 x86_64
ARCH=arm
# armv7a aarch64 i686 x86_64
PLATFORM=armv7a
TARGET=$PLATFORM-linux-androideabi
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64/bin
SYSROOT=$NDK/sysroot
PREFIX=`dirname $0`/Android/$PLATFORM

CFLAG="-D__ANDROID_API__=$API -U_FILE_OFFSET_BITS -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD -Os -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm"

mkdir -p $TMPDIR

build_one()
{
./configure \
--ln_s="cp -rf" \
--prefix=$PREFIX \
--cc=$TOOLCHAIN/$TARGET$API-clang \
--cxx=$TOOLCHAIN/$TARGET$API-clang++ \
--ld=$TOOLCHAIN/$TARGET$API-clang \
--target-os=android \
--arch=$ARCH \
--cpu=$PLATFORM \
--cross-prefix=$TOOLCHAIN/$ARCH-linux-androideabi- \
--disable-asm \
--enable-cross-compile \
--enable-shared \
--disable-static \
--enable-runtime-cpudetect \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--enable-small \
--enable-gpl --enable-nonfree --enable-version3 --disable-iconv \
--enable-jni \
--enable-mediacodec \
--disable-decoders --enable-decoder=vp9 --enable-decoder=h264 --enable-decoder=mpeg4 --enable-decoder=aac \
--disable-encoders --enable-encoder=vp9_vaapi --enable-encoder=h264_nvenc --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc \
--disable-demuxers --enable-demuxer=rtsp --enable-demuxer=rtp --enable-demuxer=flv --enable-demuxer=h264 \
--disable-muxers --enable-muxer=rtsp --enable-muxer=rtp --enable-muxer=flv --enable-muxer=h264 \
--disable-parsers --enable-parser=mpeg4video --enable-parser=aac --enable-parser=h264 --enable-parser=vp9 \
--disable-protocols --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=tcp --enable-protocol=udp \
--disable-bsfs \
--disable-indevs --enable-indev=v4l2 \
--disable-outdevs \
--disable-filters \
--disable-postproc \
--extra-cflags="$CFLAG" \
--extra-ldflags="-marm"
}

build_one

make clean

make -j4

make install

三、使用 WSL 进行编译

如果系统是 Win10 1803 及其以上版本,可以使用 WSL (Windows Subsystem for Linux) 进行编译

1.启用 WSL

略,自行百度吧,教程太多了

2.安装 Linux 版的 NDK

这里有个坑,由于 windows 默认文件名大小写不敏感,而 Linux 版的 NDK 有些头文件是除了大小写其余拼写完全一致的,直接解压完进行使用可能会出现一些问题。可喜的是,win10 1803 及其以上版本可以对单独文件夹开启大小写敏感,解决方法如下:

a) 先将 NDK 文件解压出来,过程中会提示重复文件,覆盖或者跳过都行

b) 将下面的命令保存到一个 .bat 文件内,将文件放到 NDK 路径下,以管理员权限运行

@echo off & color 0A
set DP=%~dp0
set DP=%DP:~0,-1%
echo %DP%

for /f "delims=" %%i in ('dir /ad/b/s "%DP%"') do (fsutil.exe file SetCaseSensitiveInfo "%%i" enable)

pause

c) 再次解压 NDK  到相同路径覆盖即可

3.编译

还是使用之前的脚本编译即可。注意更改 NDK 的路径

哦,对了这里编译器是可以识别软链接符号的, --ln_s="cp -rf" 可以去了

如果是在真实的 Linux 环境下也可使用此脚本

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Windows使用NDK编译FFmpeg,你需要按照以下步骤进行操作: 1. 首先,确保你已经安装了NDK和CMake。你可以从Android开发者网站下载并安装Android Studio,它会自动安装NDK和CMake。 2. 下载FFmpeg源代码。你可以从FFmpeg的官方网站或GitHub上获取最新的源代码。 3. 创建一个用于编译FFmpeg的CMakeLists.txt文件。这个文件描述了编译过程中所需的配置和依赖项。你可以使用以下示例作为起点: ```cmakecmake_minimum_required(VERSION3.4.1) # 设置FFmpeg源代码的路径set(FFMPEG_SOURCE_DIR /path/to/ffmpeg/source) # 设置编译输出的路径set(FFMPEG_OUTPUT_DIR /path/to/ffmpeg/output) # 添加FFmpeg源代码的子目录add_subdirectory(${FFMPEG_SOURCE_DIR} ${FFMPEG_OUTPUT_DIR}) # 添加FFmpeg库到你的项目中add_library(ffmpeg SHARED IMPORTED) set_target_properties(ffmpeg PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_ABI}/libffmpeg.so) # 链接FFmpeg库到你的项目中target_link_libraries(your_project ffmpeg) ``` 在上面的示例中,你需要将`/path/to/ffmpeg/source`替换为你下载的FFmpeg源代码的路径,将`/path/to/ffmpeg/output`替换为你想要生成输出文件的路径。 4. 打开命令提示符或终端,并导航到包含CMakeLists.txt文件的目录。 5. 运行以下命令来生成构建文件: ```shellcmake -DCMAKE_TOOLCHAIN_FILE=/path/to/your/ndk/build/cmake/android.toolchain.cmake -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=21 . ``` 在上面的命令中,将`/path/to/your/ndk/build/cmake/android.toolchain.cmake`替换为你的NDK安装目录中的相应路径。`ANDROID_ABI`和`ANDROID_NATIVE_API_LEVEL`参数可以根据你的需求进行调整。 6. 运行以下命令来编译FFmpeg: ```shellcmake --build . ``` 这将使用CMake生成的构建文件来编译FFmpeg。 请注意,编译FFmpeg可能需要一些时间,具体取决于你的系统配置和源代码的大小。完成后,你将在指定的输出路径中找到编译好的FFmpeg库文件。 这只是一个简单的指导,实际中可能会遇到其他问题。在遇到困难时,你可以参考FFmpeg官方文档或在相关的开发者社区中寻求帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值