NDK r21编译FFmpeg 4.2.2(x86、x86_64、armv7、armv8)

2024-06-13 03:18

本文主要是介绍NDK r21编译FFmpeg 4.2.2(x86、x86_64、armv7、armv8),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.编译FFmpeg
  • 2.使用FFmpeg的so库

1.编译FFmpeg

准备Ununtu、ndk r21(linux)、FFmpeg。

准备编译脚本,这里有两个,其中一个是专门针对armv7的。

armv7

#!/bin/bashAPI=21
#armv7-a
ARCH=armv7 PREFIX=./SO/$ARCHTOOLCHAIN=/home/qwe/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64build()
{
./configure \
--prefix=$PREFIX \
--disable-static \
--enable-shared \
--enable-small \
--enable-gpl \
--disable-doc \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--target-os=android \
--arch=$ARCH \
--cc=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- make clean
make -j4
make install}build

arm64 x86 x86_64

#!/bin/bashAPI=21
#arm64  x86 x86_64 对应 aarch64  i686  x86_64 
ARCH=arm64
ARCH2=aarch64    PREFIX=./SO/$ARCHTOOLCHAIN=/home/qwe/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64build()
{
./configure \
--prefix=$PREFIX \
--disable-static \
--enable-shared \
--enable-small \
--disable-doc \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--target-os=android \
--arch=$ARCH \
--cc=$TOOLCHAIN/bin/$ARCH2-linux-android$API-clang \
--cross-prefix=$TOOLCHAIN/bin/$ARCH2-linux-android- make clean
make -j4
make install}build

在FFmpeg的根目录运行脚本。最初运行会提示缺少软件,按提示进行安装就行。

qwe@ubuntu:~/FFmpeg-n4.2.2$ sudo su
[sudo] qwe 的密码: 
root@ubuntu:/home/qwe/FFmpeg-n4.2.2# ./build3.sh 

在这里插入图片描述

2.使用FFmpeg的so库

android studio创建项目
在这里插入图片描述
将so文件复制到如下目录。include是FFmpeg的.h文件,x86、x86_64、armv7、armv8生成的.h一样的。
在这里插入图片描述
编辑build.gradle(:app)

android {.....sourceSets {main {//jniLibsjniLibs.srcDirs = ['src/main/libs']}}
}

编辑cmakeList.txt

cmake_minimum_required(VERSION 3.4.1)#设置两个目录,${ANDROID_ABI}会根据设备变化
set(DIR ${PROJECT_SOURCE_DIR}/../libs/${ANDROID_ABI})
set(DIR2 ${PROJECT_SOURCE_DIR}/../libs)
#指定h文件的目录,编译过程需要找.h文件
include_directories(${DIR2}/include)add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).native-lib.cpp)#导入FFmpeg的库
add_library(libavcodec SHARED IMPORTED)
#so文件的位置
set_target_properties(libavcodecPROPERTIES IMPORTED_LOCATION${DIR}/libavcodec.so)add_library(libavfilter SHARED IMPORTED)
set_target_properties(libavfilterPROPERTIES IMPORTED_LOCATION${DIR}/libavfilter.so)add_library(libavformat SHARED IMPORTED)
set_target_properties(libavformatPROPERTIES IMPORTED_LOCATION${DIR}/libavformat.so)add_library(libavutil SHARED IMPORTED)
set_target_properties(libavutilPROPERTIES IMPORTED_LOCATION${DIR}/libavutil.so)add_library(libswresample SHARED IMPORTED)
set_target_properties(libswresamplePROPERTIES IMPORTED_LOCATION${DIR}/libswresample.so)add_library(libswscale SHARED IMPORTED)
set_target_properties(libswscalePROPERTIES IMPORTED_LOCATION${DIR}/libswscale.so)find_library( # Sets the name of the path variable.log-liblog)#连接库
target_link_libraries( # Specifies the target library.native-lib# Links the target library to the log library# included in the NDK.${log-lib}libavfilterlibavformatlibswresamplelibswscalelibavutillibavcodec)

更改native-lib.cpp中的stringFromJNI方法

#include <jni.h>
#include <string>extern  "C"{
#include "libavcodec/avcodec.h"
}extern "C" JNIEXPORT jstring JNICALL
Java_cn_study_testffmpeg_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {std::string hello = avcodec_configuration();return env->NewStringUTF(hello.c_str());
}

运行效果
在这里插入图片描述

这篇关于NDK r21编译FFmpeg 4.2.2(x86、x86_64、armv7、armv8)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056126

相关文章

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优