Android 引入FFmpeg

news2024/11/24 13:45:45

1.安装 CMake

首先,需要下载 CMake 相关工具,在 Android Studio 中依次点击 Tools->SDK Manager->SDK Tools ,然后勾选

CMake : CMake 构建工具

NDK : NDK 环境

最后依次点击 OK->OK->Finish ,开始下载(文件比较大,可能会比较慢,请耐心等待)。

2. 新建 C/C++ 工程

依次点击 File -> New -> New Project ,进入新建工程页面,拉到最后,选择 Native C++ 然后按照默认配置,

一路 Next -> Next -> Finish 即可。

生成的工程目录如下:

我们可以在真机/模拟器上运行测试一下

3. 引入 FFmpeg so

这里提供了引入ffmpeg需要相关文件


链接:https://pan.quark.cn/s/b3f6abe49ea7

在main目录下添加ffmpeg的相关文件

上面已经把 so 和 头文件 放置到对应的目录中了,但是编译器是不会把它们编译、链接、并打包到 Apk 中的,我们还需要在 CMakeLists.txt 中显性的把相关的 so 添加和链接起来。完整的 CMakeLists.txt 如下

#指定最低版本名称

cmake_minimum_required(VERSION 3.4.2)

project("ffmpegjni2")


add_library(

ffmpegjni2

SHARED

native-lib.cpp
)

set(JNI_LIBS_DIR ${CMAKE_SOURCE_DIR}/../ffmpeg)

add_library( avutil

SHARED

IMPORTED )

set_target_properties(avutil

PROPERTIES IMPORTED_LOCATION

${JNI_LIBS_DIR}/${ANDROID_ABI}/lib/libavutil.so )


add_library(avresample

SHARED

IMPORTED )

set_target_properties(avresample

PROPERTIES IMPORTED_LOCATION

${JNI_LIBS_DIR}/${ANDROID_ABI}/lib/libavresample.so )


add_library(swresample

SHARED

IMPORTED )

set_target_properties(swresample

PROPERTIES IMPORTED_LOCATION

${JNI_LIBS_DIR}/${ANDROID_ABI}/lib/libswresample.so )


add_library(swscale

SHARED

IMPORTED )

set_target_properties(swscale

PROPERTIES IMPORTED_LOCATION

${JNI_LIBS_DIR}/${ANDROID_ABI}/lib/libswscale.so )


add_library(avcodec

SHARED

IMPORTED )

set_target_properties(avcodec

PROPERTIES IMPORTED_LOCATION

${JNI_LIBS_DIR}/${ANDROID_ABI}/lib/libavcodec.so )


add_library(avformat

SHARED

IMPORTED )

set_target_properties(avformat

PROPERTIES IMPORTED_LOCATION

${JNI_LIBS_DIR}/${ANDROID_ABI}/lib/libavformat.so )


add_library(avfilter

SHARED

IMPORTED )

set_target_properties(avfilter

PROPERTIES IMPORTED_LOCATION

${JNI_LIBS_DIR}/${ANDROID_ABI}/lib/libavfilter.so )


add_library(avdevice

SHARED

IMPORTED )


set_target_properties(avdevice

PROPERTIES IMPORTED_LOCATION

${JNI_LIBS_DIR}/${ANDROID_ABI}/lib/libavdevice.so )

#指定引入头文件目录

include_directories(${JNI_LIBS_DIR}/${ANDROID_ABI}/include)


target_link_libraries(ffmpegjni2

avutil swresample swscale avcodec avformat avfilter

log ${android-lib} )

4.检验是否成功引入FFmpeg

class FFmpegActivity: AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_ffmpeg_info)

        tv.text = ffmpegInfo()

}

 private external fun ffmpegInfo(): String

   companion object {

        init {
 
             System.loadLibrary("ffmpegjni2")

         }
    }
}

在 native-lib.cpp 中添加对应的 JNI 层方法 

#include <jni.h>

#include <string>

#include <unistd.h>

extern "C" {

#include <libavcodec/avcodec.h>

#include <libavformat/avformat.h>

#include <libavfilter/avfilter.h>

#include <libavcodec/jni.h>

JNIEXPORT jstring JNICALL

Java_com_cxp_ffmpegjni2_FFmpegActivity_ffmpegInfo(JNIEnv *env, jobject /* this */)

{

    char info[40000] = {0};

   AVCodec *c_temp = av_codec_next(NULL);

   while (c_temp != NULL) {

      if (c_temp->decode != NULL) {

          sprintf(info, "%sdecode:", info);

          switch (c_temp->type) {

             case AVMEDIA_TYPE_VIDEO:

           sprintf(info, "%s(video):", info);

              break;
  
             case AVMEDIA_TYPE_AUDIO:

             sprintf(info, "%s(audio):", info);

             break;

            default:

             sprintf(info, "%s(other):", info);

              break;

           }

        sprintf(info, "%s[%10s]\n", info, c_temp->name);

      } else {

     sprintf(info, "%sencode:", info);

     }
 
   c_temp = c_temp->next;

 }

return env->NewStringUTF(info);

}

如果一切正常,App运行后,就会显示出 FFmpeg 音视频编解码器的信息。

如果由提示 so 或者 头文件 找不到,需要检查 CMakeLists.txt 中设置的 so 和 头文件 的路径是否正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1033979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科技资讯|苹果获批手机“Touch Bar”新专利,苹果Find My依旧火爆

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果获得了一项 iPhone 专利&#xff0c;在机身侧面装上一个“Touch Bar”&#xff0c;用于显示电量等信息&#xff0c;并支持相关的交互操作。 这项专利最早于 2011 年提交&#xff0c;并于 2014 年…

OJ练习第180题——颠倒二进制位

颠倒二进制位 力扣链接&#xff1a;190. 颠倒二进制位 题目描述 颠倒给定的 32 位无符号整数的二进制位。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中&#xff0c;没有无符号整数类型。在这种情况下&#xff0c;输入和输出都将被指…

FPGA 图像缩放 千兆网 UDP 网络视频传输,基于B50610 PHY实现,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包UDP…

Spring | 异常处理最佳实践

引言 在快速迭代和持续交付的今天&#xff0c;软件的健壮性、可靠性和用户体验已经成为区别成功与否的关键因素。特别是在Spring框架中&#xff0c;由于其广泛的应用和丰富的功能&#xff0c;如何优雅地处理异常就显得尤为重要。本文旨在探讨在Spring中如何更加高效、准确和优…

【设计模式】组合模式

文章目录 1.组合模式定义2.组合模式的结构2.1. 安全式组合模式的结构2.2.透明式组合模式的结构 3.组合模式实战案例3.1.场景说明3.2.关系类图3.3.代码实现 4.组合模式优缺点5.组合模式适用场景6.组合模式总结 主页传送门&#xff1a;&#x1f481; 传送 1.组合模式定义 组合模式…

Spring面试题8:面试官:说一说Spring的BeanFactory

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的BeanFactory Spring的BeanFactory是Spring框架的核心容器,负责管理和创建Bean对象。它是一个工厂类,用于实例化、配置和管理Bean的…

忽视日志吃大亏,手把手教你玩转 SpringBoot 日志

一、日志重要吗 程序中的日志重要吗&#xff1f; 在回答这个问题前&#xff0c;笔者先说个事例&#xff1a; ❝ 笔者印象尤深的就是去年某个同事&#xff0c;收到了客户反馈的紧急bug。尽管申请到了日志文件&#xff0c;但因为很多关键步骤没有打印日志&#xff0c;导致排查进…

基于springboot+vue的车辆管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

专业排版软件InDesign 2023下载 InDesign mac中文功能

InDesign 2023 mac是一款专业排版软件&#xff0c;适用于Windows和macOS平台。它可以帮助用户创建、设计和排版各种印刷品和数字出版物&#xff0c;如杂志、书籍、报纸、广告、海报、手册、电子书等。 InDesign 2023 mac软件特点 多种页面布局&#xff1a;支持多种页面布局&…

名义实际GDP-各地区-原始和结果(2000-2022年)

一、数据介绍 数据名称&#xff1a;名义、实际GDP-各地区-原始和结果 数据年份&#xff1a;2000-2022年 计算公式&#xff1a;实际GDP 名义GDP / GDP折算指数 数据基期&#xff1a;2000年 数据整理&#xff1a;自主整理 二、数据用途 数据用途 文献依据 经济发展水平 …

如何在.NET电子表格应用程序中创建流程图

前言 流程图是一种常用的图形化工具&#xff0c;用于展示过程中事件、决策和操作的顺序和关系。它通过使用不同形状的图标和箭头线条&#xff0c;将任务和步骤按照特定的顺序连接起来&#xff0c;以便清晰地表示一个过程的执行流程。 在企业环境中&#xff0c;高管和经理利用…

区间重叠问题

区间未重叠数量计算&#xff1a; class Solution {public int findMinArrowShots(int[][] points) {//需要用第一种比较器&#xff1f;第二种会报错&#xff0c;在涉及数的大小边界的时候Arrays.sort(points,(a, b) -> Integer.compare(a[0], b[0]));//(a, b) -> Intege…

【算法思想-排序】根据另一个数组次序排序 - 力扣 1122 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

员工执行力差,80%是领导的问题

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 读者小T是大厂P7&#xff0c;今年跳到一家行业独角兽公司&#xff0c;做项目经理。没想到&#xff0c;半年后他的领导Y总&#xff0c;在考核中给他的绩效打了D&#xff0c;主要原因是小T“项目按时完成…

大模型分布式训练策略:ZeRO、FSDP

文章目录 一、ZeRO&#xff08;零冗余优化器&#xff09;1.1 背景1.2 深度学习内存消耗分析1.3 主要方法1.3.1 ZeRO-DP优化模型状态内存1.3.2 ZeRO-R优化残余状态内存 1.4 总结1.5 官方视频&#xff1a;ZeRO & Fastest BERT&#xff0c;提高 DeepSpeed 深度学习训练的规模和…

ROS 基础教程

欢迎访问我的博客首页。 ROS 基础教程 1.urdf 文件1.1 在 Rviz 中显示 urdf1.1.1 定义 urdf1.1.2 在 Rviz 中查看 urdf 1.2 在 Gazebo 中显示 urdf1.2.1 定义 urdf1.2.2 在 Gazebo 中查看 urdf 2.建图-仿真2.1 模型 1.urdf 文件 假设我们的工作空间是 ws_ros。我们自己实现的包…

10路LED驱动器和GPIO控制器禾润HTR3310

供电范围&#xff1a;2.5V~5.5V 10个多功能IO&#xff0c;支持LED驱动或GPIO&#xff08;电流源调光&#xff09; LED模式下具有256阶线性调光 任意IO可配置为独立的输入或输出 中断功能&#xff0c;8μs防抖&#xff0c;低电平有效 标准I2C接口&#xff0c;4个I2C器件地址…

AB包的依赖关系

1、什么是依赖关系 有时候一个模型所需要的东西可能在不同的包里面&#xff0c;例如蓝色立方体的模型和材质在不同的包&#xff08;mode和head&#xff09;里&#xff0c;这时需要加载两个包才能让这个球正常显示 2、如何获取依赖关系并加载 //加载AB包 AssetBundle ab Asse…

a single dex file (# methods: 67938 > 65536)

问题 项目不大&#xff0c;但是导入的包比较多&#xff0c;导致方法数量超过了一定数量 Cannot fit requested classes in a single dex file (# methods: 67938 > 65536) Android 5.0之前的版本&#xff08;API level < 21&#xff09;使用Dalvik runtime来执行代码&a…

服务器搭建(TCP套接字)-epoll版(服务端)

epoll 是一种在 Linux 系统上用于高效事件驱动编程的 I/O 多路复用机制。它相比于传统的 select 和 poll 函数具有更好的性能和扩展性。 epoll 的主要特点和原理&#xff1a; 1、事件驱动&#xff1a;epoll 是基于事件驱动的模型&#xff0c;它通过监听事件来触发相应的回调函…