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

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

3.2 本地方法并生成头文件

java代码如下:

public class NativeAPI {
    public static native String stringFromJNI();
    public static native String urlprotocolinfo();
    public static native String avformatinfo();
    public static native String avcodecinfo();
    public static native String avfilterinfo();
}

生成头文件,如果不知道怎么快速生成,请参考AndroidStudio JNI 快速生成头文件

3.3 编写本地方法的实现

首先要引入FFmpeg库文件,拷贝so库到libs文件夹:


24.png

image.png

拷贝FFmpeg的头文件到指定目录,这个目录并不确定,只要在CMakeList.txt中引入即可:


25.png

image.png

修改build.gradle文件,在defaultconfig中添加指定平台,还记得编译FFmpeg时的arch=armv7-a参数吧,一定要对应,否则编译可以通过,但是运行时会报错。

//指定平台,与编译FFmpeg时的arch参数对应
ndk{
     abiFilters 'armeabi-v7a'
}
//指定SO库路径

3.4 CMakeList.txt

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
#lib库工程名,并非so生成的so库名称,可以不写
project(TestFFmpeg)
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
#包含指定目录的头文件
include_directories(include/)
#添加库文件 参数:生成的库名称  动态库(即so库) 源文件
add_library(native-lib SHARED native-lib.cpp)
#创建导入的库目标,FFmpeg7个SO库
add_library(avutil-55 SHARED IMPORTED)
add_library(swresample-2 SHARED IMPORTED)
add_library(avcodec-57 SHARED IMPORTED)
add_library(avfilter-6 SHARED IMPORTED)
add_library(swscale-4 SHARED IMPORTED)
add_library(avdevice-57 SHARED IMPORTED)
add_library(avformat-57 SHARED IMPORTED)
#设置变量,CMAKE_SOURCE_DIR是CMakeList.txt的路径
set(LIB_DIR ${CMAKE_SOURCE_DIR}/../../../libs/${ANDROID_ABI})
#message(SEND_ERROR  "jni libs dir=${LIB_DIR}")
#设置目标属性,例如avutil-55的IMPORTED_LOCATION属性值是${LIB_DIR}/libavutil-55.so
set_target_properties(avutil-55 PROPERTIES IMPORTED_LOCATION ${LIB_DIR}/libavutil-55.so)
set_target_properties(swresample-2 PROPERTIES IMPORTED_LOCATION ${LIB_DIR}/libswresample-2.so)
set_target_properties(avcodec-57 PROPERTIES IMPORTED_LOCATION ${LIB_DIR}/libavcodec-57.so)
set_target_properties(avfilter-6 PROPERTIES IMPORTED_LOCATION ${LIB_DIR}/libavfilter-6.so)
set_target_properties(swscale-4 PROPERTIES IMPORTED_LOCATION ${LIB_DIR}/libswscale-4.so)
set_target_properties(avdevice-57 PROPERTIES IMPORTED_LOCATION ${LIB_DIR}/libavdevice-57.so )
set_target_properties(avformat-57 PROPERTIES IMPORTED_LOCATION ${LIB_DIR}/libavformat-57.so)
#在指定目录下搜索一个库, 保存在变量中
find_library(
        # 变量名
        log-lib
        #搜索log库
        log)
#目标文件与库文件进行链接
target_link_libraries(
        # Specifies the target library.
        native-lib
        # Links the target library to the log library
        # included in the NDK.
        avutil-55
        swresample-2
        avcodec-57
        avfilter-6
        swscale-4
        avdevice-57
        avformat-57
        ${log-lib})

native-lib.cpp

没有写完整,最后有Demo地址

extern "C" {
//因为FFmpeg是C库,所以要在extern "C"里面
#include "include/com_flyscale_testforffmpeg_NativeAPI.h"
#include "include/libavformat/avformat.h"
#include "include/libavutil/avutil.h"
#include "include/libavfilter/avfilter.h"
#include "include/libavcodec/avcodec.h"
JNIEXPORT jstring JNICALL Java_com_flyscale_testforffmpeg_NativeAPI_urlprotocolinfo
        (JNIEnv *env, jclass clazz) {
    char info[40000] = {0};
    av_register_all();
    struct URLProtocol *pup = NULL;
    struct URLProtocol **p_temp = &pup;
    avio_enum_protocols((void **) p_temp, 0);
    while ((*p_temp) != NULL) {
        sprintf(info, "%sInput: %s\n", info, avio_enum_protocols((void **) p_temp, 0));
    }
    pup = NULL;
    avio_enum_protocols((void **) p_temp, 1);
    while ((*p_temp) != NULL) {
        sprintf(info, "%sInput: %s\n", info, avio_enum_protocols((void **) p_temp, 1));
    }
    return env->NewStringUTF(info);
}
...

运行即可。


参考:


android开发-Windows环境下编译FFMPEG源码

AndroidStudio中使用FFMPEG入门

Android Studio 中的 CMake message 输出位置在哪里


目录
相关文章
|
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
|
2月前
|
并行计算 开发工具 异构计算
在Windows平台使用源码编译和安装PyTorch3D指定版本
【10月更文挑战第6天】在 Windows 平台上,编译和安装指定版本的 PyTorch3D 需要先安装 Python、Visual Studio Build Tools 和 CUDA(如有需要),然后通过 Git 获取源码。建议创建虚拟环境以隔离依赖,并使用 `pip` 安装所需库。最后,在源码目录下运行 `python setup.py install` 进行编译和安装。完成后即可在 Python 中导入 PyTorch3D 使用。
299 0
|
4月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
205 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
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