windows编译FFmpeg for Android 和AndroidStudio使用FFmpeg(一)

简介: FFmpeg的编译是一个大坑,尤其是编译安卓平台的动态库和静态库,应用于APP中。在Linux平台编译是相对简单的,但是我经过尝试在Linux编译静态库没有成功,所以又在windows平台尝试编译了ffempg的动态库,应用成功了,这里分享一下。

FFmpeg的编译是一个大坑,尤其是编译安卓平台的动态库和静态库,应用于APP中。在Linux平台编译是相对简单的,但是我经过尝试在Linux编译静态库没有成功,所以又在windows平台尝试编译了ffempg的动态库,应用成功了,这里分享一下。


一、搭建编译环境


  1. NDK  版本r14
  2. MinGW,minGW可以提供gcc编译环境,所以我们才能在windows进行编译
  3. FFMPEG源码   版本3.3.9

注意一定要注意NDK和FFmpeg的版本,如果你按照我的文章来的那就一定要下载NDK版本R14和FFmpeg版本3.3.9,并不一定要新版本,因为不同的FFmpeg需要不同版本的NDK支持,本文中的是验证过的。minGW的版本不用关心。


1.1 NDK配置

我使用的AndroidStudio,刚开始用自带的ndk-buidle进行编译,是通不过的,后来换到r14版本才能编译通过。

解压下载好的文件android-ndk-r14b-windows-x86_64.zip到固定目录,尽量不要有中文,我的路径:D:\Android\android-ndk-r14b。接下来配置到环境变量:

进入计算机->属性->高级系统设置->环境变量,在系统环境中新建NDK_PATH,目录为刚才解压的NDK14的目录,如下:

10.png

image.png

再打开PATH,添加刚才新建的NDK_PATH:

11.png

image.png


然后一路确定后,测试是否配置成功。

打开cmd命令行,输入ndk-build,如果成功有类似如下显示:

12.png

image.png

1.2 minGW安装配置

打开.exe文件,选择安装位置,我的安装目录是D:\programs\minGW

点击需要安装的组件,我选择全部勾选:

13.png

image.png


安装完成后,需要把两个路径添加到环境变量:D:\programs\minGWD:\programs\minGW\msys\1.0\bin

14.png

image.png

测试一下minGW是否配置成功:

15.png


image.png


如果就是配置成功了。


1.3 下载FFmpeg源码

切记一定下载3.3.9版本的,我试过编译4.0的是编译不过的。


16.png

image.png


下载后解压即可。


二、FFmpeg源码编译


那么问题来了,怎么执行编译命令呢?

这时候minGW上场了,还记得D:\programs\minGW\mysys\1.0\吗,它下面有一个msys.bat文件,双击打开就是类似于shell的环境。


2.1 修改生成的lib库文件名

编译之前首先要做件事情,就是修改源码目录下的configure文件,因为我要的是Android平台的so库,所以要在配置文件中修改生成的库名称。使用记事本打开就行,修改方案如下:

# 原来的配置内容:
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)'
#替换后的内容:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

什么?你问我直接编译完了修改文件行不行,我认为是不行的,当然我也测试过。反正按照我说的做,保证行。


2.2开始编译

编译都是分三个步骤:

  1. configure
  2. make
  3. make install
    因为ffmpeg编译时configure的参数很多,直接写在命令行会很麻烦,我们把这些写在里面就很方便了:

#!/bin/bash
#NDK路径根据你自己设置的决定,注意不要直接拷贝window路径,因为linux不识别`\`,要使用`/`
NDK=D:/Android/android-ndk-r14b
SYSROOT=$NDK/platforms/android-18/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --enable-cross-compile \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=armv7-a \  //注意平台
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
}
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
read -p "Press any key to continue."

保存为build_android.sh,其它名字也行。

注意里面的参数arch=armv7-a,新版的AndroidStudio已经不支持armeabi了,在使用so库的时候要与arch参数对应,后面会讲到。

打开mysys.bat,进入FFmpeg的源码目录:


17.png

image.png


添加可执行权限:

chmod 777 build_android.sh

18.png

image.png


可以看到,使用ls -l是看不到有可执行权限的,不过没关系。

步骤一、执行configure

./build_android.sh  //这里要等待较长的时间,我等了七八分钟的样子才有反应

如果没有报错的话就会打印:

Press any key to continue.  //按任意键退出脚本

步骤二、执行make

make //这一步会编译所有的.c文件,生成很多的.o文件,时间较长

步骤三、执行make install

make install   //这一步会生成头文件和lib库到步骤一中configure指定的路径android/armv7-a目录

执行这几步过程中可能会出错,如果出错,请严格对比版本号和环境变量是否正确。

生成文件目录如下:


19.png

image.png


20.png

image.png

接下来就是在AndroidStudio中使用了。

什么?为什么有带数字的,有不带数字的,该用哪个呢?用带数字的,至于为什么我也不知道,反正我试过只能用带数字的。


三、在AndroidStudio中使用编译好的FFmpeg库


我使用的较新的AndroidStudio版本,为什么要说这个呢?因为新版的AndroidStudio支持使用cmake,而不需要自己写Android.mk和Application.mk这些文件了。所以需要一定的cmake语法知识,大家可以自行搜索,需要几个简单的就行,我也会给出注释。


21.png

image.png


3.1 新建工程/Module

你需要新建支持c++的工程,再新建Module。如果你使用的工程不支持c++,新建Module时参考android studio: 为现有项目添加C++支持也可以。

我新建的支持C++的工程:

22.png

image.png


在默认Module里面会生成默认的两个文件:

23.png

image.png

build.gradle中也会生成JNI相关配置:

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt" //cmake配置文件路径
            version "3.10.2"
        }
    }
}


目录
相关文章
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
243 1
|
1月前
|
缓存 并行计算 Ubuntu
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
本文是关于在Jetson AGX Xavier上编译FFmpeg(3.4.1)和OpenCV(3.4.0)的详细教程,包括编译需求、步骤、测试和可能遇到的问题及其解决方案。还提供了Jetson AGX Xavier编译CUDA版本的OpenCV 4.5.0的相关信息。
62 4
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
|
1月前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
142 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
83 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
1月前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
1月前
|
并行计算 开发工具 异构计算
在Windows平台使用源码编译和安装PyTorch3D指定版本
【10月更文挑战第6天】在 Windows 平台上,编译和安装指定版本的 PyTorch3D 需要先安装 Python、Visual Studio Build Tools 和 CUDA(如有需要),然后通过 Git 获取源码。建议创建虚拟环境以隔离依赖,并使用 `pip` 安装所需库。最后,在源码目录下运行 `python setup.py install` 进行编译和安装。完成后即可在 Python 中导入 PyTorch3D 使用。
165 0
|
3月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
132 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
3月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
291 0
|
3月前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
69 0