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"
        }
    }
}


目录
相关文章
|
4月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
340 1
|
2月前
|
缓存 并行计算 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的相关信息。
93 4
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
|
2月前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
216 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
2月前
|
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开发知识可参考相关书籍。
116 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
2月前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
4月前
|
开发者 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 或官网下载工具包。
433 0
|
4月前
|
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让你的技术探索之旅充满无限可能。
100 0
|
1月前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
1月前
|
监控 安全 网络安全
使用EventLog Analyzer日志分析工具监测 Windows Server 安全威胁
Windows服务器面临多重威胁,包括勒索软件、DoS攻击、内部威胁、恶意软件感染、网络钓鱼、暴力破解、漏洞利用、Web应用攻击及配置错误等。这些威胁严重威胁服务器安全与业务连续性。EventLog Analyzer通过日志管理和威胁分析,有效检测并应对上述威胁,提升服务器安全性,确保服务稳定运行。