android-studio使用cmake编译ffmpeg实践

用cmake编译依赖ffmpeg动态库的工程 这两天碰到一个工程用cmake编译,于是简单研究了一下cmake,只看文档其实印象并不深刻,于是拿了一份之前写的推流代码来做个简单的应用,该份代码依赖OpenCV库和FFMPEG库,测试了一下,通过cmake中的find_package可以直接找到OpenCV,但找不到FFMPEG,于是找了另外一种方式实现。我的CMakeLists.txt如下: # cmake 最低版本号要求 cmake_minimum_required(VERSION 2.8) #设置project name project(te 阅读详情

音视频实践学习

本例使用的是合并的libffmpeg库,可参考之前的实践操作 android全平台编译ffmpeg合并为单个库实践

目录

配置环境

操作系统: ubuntu 16.05

注意: ffmpeg库的编译使用的是android-ndk-r10e版本,使用高版本编译会报错

而android-studio工程中配合cmake使用的版本则是android-ndk-r16b版本

新建工程ffmpeg-single-hello

  • 配置build.gradle如下
android {
    ......
    defaultConfig {
        ......
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
            ndk {
                abiFilters "armeabi-v7a"
            }
        }
        sourceSets {
            main {
                //库地址
                jniLibs.srcDirs = ['libs']
            }
        }
    }
    ......
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}
  • 新建CMakeLists.txt文件,配置如下

cmake_minimum_required(VERSION 3.4.1)

add_library(ffmpeg-hello
           SHARED
           src/main/cpp/ffmpeg_hello.c)

find_library(log-lib
            log)

#获取上级目录的路径
get_filename_component(PARENT_DIR ${CMAKE_SOURCE_DIR} PATH)
set(LIBRARY_DIR ${PARENT_DIR}/ffmpeg-single)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
set(CMAKE_VERBOSE_MAKEFILE on)

add_library(ffmpeg-single
           SHARED
           IMPORTED)

set_target_properties(ffmpeg-single
                    PROPERTIES IMPORTED_LOCATION
                    ${LIBRARY_DIR}/libs/${ANDROID_ABI}/libffmpeg.so
                    )

#包含头文件
include_directories(${LIBRARY_DIR}/libs/${ANDROID_ABI}/include)

target_link_libraries(ffmpeg-hello ffmpeg-single ${log-lib})

笔者这里考虑到后续的都是基于同一个libffmpeg.so库,因此不必每个module都放置一个,因此单独分离了一个组件ffmpeg-single,将所需要的头文件和库放置在libs目录
其他的单个库例子则都是依赖这个库

  • 新建类FFmpegHello.java
package com.onzhou.ffmpeg.hello;

public class FFmpegHello {

    static {
        System.loadLibrary("ffmpeg");
        System.loadLibrary("ffmpeg-hello");
    }

    public native String urlprotocolinfo();

    public native String avformatinfo();

    public native String avcodecinfo();

    public native String avfilterinfo();

    public native String configurationinfo();

}
  • 在src/main/cpp目录新建源文件ffmpeg_hello.c

#include <jni.h>
#include <stdio.h>
#include <time.h>
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
#include "libavutil/log.h"

#ifdef ANDROID
#include <android/log.h>
#define LOG_TAG    "FFmpegHello"
#define LOGE(format, ...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, format, ##__VA_ARGS__)
#define LOGI(format, ...)  __android_log_print(ANDROID_LOG_INFO,  LOG_TAG, format, ##__VA_ARGS__)
#else
#define LOGE(format, ...)  printf(LOG_TAG format "\n", ##__VA_ARGS__)
#define LOGI(format, ...)  printf(LOG_TAG format "\n", ##__VA_ARGS__)
#endif

JNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_urlprotocolinfo
  (JNIEnv * env, jobject obj){

    char info[40000]={0};
	av_register_all();

	struct URLProtocol *pup = NULL;
	//input
	struct URLProtocol **p_temp = &pup;
	avio_enum_protocols((void **)p_temp, 0);
	while ((*p_temp) != NULL){
		sprintf(info, "%s[in ][%10s]\n", info, avio_enum_protocols((void **)p_temp, 0));
	}
	pup = NULL;
	//output
	avio_enum_protocols((void **)p_temp, 1);
	while ((*p_temp) != NULL){
		sprintf(info, "%s[out][%10s]\n", info, avio_enum_protocols((void **)p_temp, 1));
	}
	LOGE("%s", info);
	return (*env)->NewStringUTF(env, info);
}


JNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_avformatinfo
  (JNIEnv * env, jobject obj){

    char info[40000] = { 0 };

	av_register_all();

	AVInputFormat *if_temp = av_iformat_next(NULL);
	AVOutputFormat *of_temp = av_oformat_next(NULL);
	//input
	while(if_temp!=NULL){
		sprintf(info, "%s[in ][%10s]\n", info, if_temp->name);
		if_temp=if_temp->next;
	}
	//output
	while (of_temp != NULL){
		sprintf(info, "%s[out][%10s]\n", info, of_temp->name);
		of_temp = of_temp->next;
	}
	LOGE("%s", info);
	return (*env)->NewStringUTF(env, info);
}


JNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_avcodecinfo
  (JNIEnv * env, jobject obj){

    char info[40000] = { 0 };

	av_register_all();

	AVCodec *c_temp = av_codec_next(NULL);

	while(c_temp!=NULL){
		if (c_temp->decode!=NULL){
			sprintf(info, "%s[dec]", info);
		}
		else{
			sprintf(info, "%s[enc]", 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);

		c_temp=c_temp->next;
	}
	LOGE("%s", info);
	return (*env)->NewStringUTF(env, info);
}

JNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_avfilterinfo
  (JNIEnv * env, jobject obj){

    char info[40000] = { 0 };

	avfilter_register_all();

	AVFilter *f_temp = (AVFilter *)avfilter_next(NULL);
	while (f_temp != NULL){
		sprintf(info, "%s[%10s]\n", info, f_temp->name);
	}
	LOGE("%s", info);
	return (*env)->NewStringUTF(env, info);
}


JNIEXPORT jstring JNICALL Java_com_onzhou_ffmpeg_hello_FFmpegHello_configurationinfo
  (JNIEnv * env, jobject obj){

    char info[10000] = { 0 };
	av_register_all();

	sprintf(info, "%s\n", avcodec_configuration());

	LOGE("%s", info);
	return (*env)->NewStringUTF(env, info);
}
  • 编译打包运行,输出如下信息:

项目地址:
https://github.com/byhook/ffmpeg4android

参考:
https://blog.youkuaiyun.com/leixiaohua1020/article/details/47008825

Android cmake编译FFmpeg Android cmake编译FFmpeg 项目地址 通过阅读本文,你将学到以下内容: 如何编译多种CPU指令集的FFmpeg动态库 如何配置CMakeLists.txt和build.gradle构建Android项目 编译环境 ndk-r16 ffmpeg-4.0.2 一、交叉编译FFmpeg生成动态库 FFmpeg是一个强大的音视频处理库,我们有时候只需要用到这个库的部分功能,因此我们... 阅读详情

相关推荐

windows下编译最新版ffmpeg3.3-android,并通过CMake方式移植到Android studio2.3中

windows下编译最新版ffmpeg3.3win下编译: 1.下载安装MinGW:http://sourceforge.net/projects/mingw/files/ 2.下载yasm http://yasm.tortall.net/Download.html 3.下载 ffmpeg:https://www.ffmpeg.org/download.html 编辑ffmpeg文件夹下

WangShuo的专栏 8840

Android Studio通过cmake创建FFmpeg项目

我的视频课程(基础):《(NDK)FFmpeg打造Android万能音频播放器》 我的视频课程(进阶):《(NDK)FFmpeg打造Android视频播放器》 我的视频课程(编码直播推流):《Android视频编码和直播推流》 我的视频课程(C++ OpenGL):《Android C++ OpenGL教程》 在上一篇博客《FFmpeg(3.3.2)...

ywl5320的专栏 5258

android studio 使用CMAKE 编译ffmepg

谷歌在android studio 2.2以后集成了CMake这个工具,关于这个工具和NDK开发的对比请看CMAKE和NDK的区别 在之前我们已经学会了使用在ndk环境下搭建ffmepg的开发环境,现在我们使用Cmake来搭建ffmepg开发环境 CMake官方教程网站(有墙) 首先,在android studio 2.2下新建一个工程,新建工程时候勾选 include C++

Vasil的博客 1240

cmake配置ffmpeg项目

android ndk 交叉编译ffmpeg。 编译好后,我们需要把静态库 lib 和头文件 include引入到Androidstudio中。 引入后,我们需要编写CMakeList.txt文件 cmake_minimum_required(VERSION 3.4.1) ## CMAKE_SOURCE_DIR:表示cmakeList所在路径 ## 添加cmakeLi...

wangchao1412的博客 7166

android studio 2.2 cmake ffmpeg 简单的播放器(这里只有视频解码)

背景 在上一次的初次使用cmake编译jni后,这次cmake文件再次升级。利用网上的代码来编译一个简单的播放器。本文参照 Android+FFmpeg+ANativeWindow视频解码播放 一文,在cmake下重新编译。特将过程分享给大家。 gradle 配置 apply plugin: 'com.android.application' android { compi

nothingl3的专栏 4043

ffmpeg实战教程(六)Android CMake实现解码(MP4转YUV)

在前面的文章中我们用ffmpeg在windows上实现了多种功能,下面系列的文章我们将移植到Android系统上实现。我们将使用最新版:最新版ffmpeg ffmpeg3.3 新版Android studio Android studio2.3 新版JNI编译方式 CMake对于Android开发者或许对C/C++/J

WangShuo的专栏 1万+

Android开发学习之路--Android Studio cmake编译ffmpeg

最新的android studio2.2引入了cmake可以很好地实现ndk的编写。这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路–NDK、JNI之初体验。1.ffmpeg编译  进入正题,既然是ffmpeg的移植编译,那么就先下载ffmpeg,https://ffmpeg.org/download.html#releases。这里下载

东月之神 1万+

Android Studio使用CMake编译FFmpeg生成SO库完整指南

为了确保编译器能够正确解析FFmpeg的头文件和宏定义,需要在中添加头文件路径和定义相关宏。此外,FFmpeg源码中可能依赖一些宏定义,如等,需要在CMake中显式定义:也可以根据构建目标添加不同的宏定义,例如针对不同ABI架构启用不同的优化选项:endif()CMake脚本语言以命令行指令为主,常见的基础语法包括变量定义、条件判断、函数调用等。

weixin_29050829的博客 697

LearningVideo部署指南:从源码编译到APK生成的完整流程

LearningVideo是【Android 音视频开发打怪升级】系列文章的示例代码项目,本项目将从MediaCodec硬解,FFmpeg软解,OpenGL等方面,全方位讲解如何在Android上进行音视频编辑开发。 [![Android音视频开发学习](https://raw.gitcode.com/gh_mirrors/le/LearningVideo/raw/070ae4ac6cc15a2

gitblog_00613的博客 743

android studio下利用cmake编译ffmpeg库

用Android studio2.2.2编译ffmpeg库,使用最新的cmake配置c/c++或者.so库文件。

POST 接口,将参数拼接到 URL 上,而不是将其作为表单数据发送

POST 接口,将参数拼接到 URL 上,而不是将其作为表单数据发送

pig_ning的博客 3144

Android NDK开发:C++调用C代码的完整指南

在Android NDK开发中,C++与C语言的混合编程是集成高性能库的关键技术。通过extern "C"机制和CMake编译配置,开发者可以无缝调用成熟的C语言库(如FFmpeg、OpenSSL)。这种技术方案既能复用现有C代码资产,又能利用C++的面向对象特性。实际开发中需特别注意ABI兼容性、头文件管理和JNI接口设计,典型应用场景包括音视频处理、加密算法和数学计算加速。本文以CRC16校验码实现为例,详细解析Android Studio环境下C++调用C代码的完整工程实践,涵盖从环境配置到性能优化的

weixin_34252686的博客 194

无源低通滤波器

无源RC滤波器“滤除”不需要的信号,因为它们分离并允许仅通过其频率的正弦输入信号,最简单的是无源低通滤波器网络。在低频应用(高达100kHz)中,无源滤波器通常使用简单的RC(电阻-电容)网络构建,而高频滤波器(高于100kHz)通常由RLC(电阻-电感-电容)元件制成。无源滤波器由电阻器、电容器和电感器等无源元件组成,没有放大元件(晶体管、运算放大器等),因此没有信号增益,因此它们的输出电平始终小于输入。滤波器是根据它们允许通过它们的信号的频率范围来命名的,同时阻挡或“衰减”其余部分。

weixin_44448586的博客 1万+

Android FFmpeg 交叉编译全指南:NDK编译 + CMake 集成

Android FFmpeg 交叉编译 + JNI 集成实战指南,涉及环境搭建、NDK 配置、FFmpeg 编译优化、CMake 集成、Android Studio 适配等关键步骤。

T_T233333333的博客 2826

DSSAT模型实战:从基础配置到气候情景模拟

本文详细介绍了DSSAT模型在农业模拟中的应用,从基础配置到气候情景模拟的全流程实战指南。通过土壤-植物-大气连续体的动态关系建模,DSSAT能精准预测作物产量,误差率低至8%。文章涵盖气象数据处理、土壤参数配置、管理措施调控等核心技巧,并提供了Python脚本和可视化方法,助力农业科研与决策。

weixin_29264201的博客 1014

用Matlab机器人工具箱搞定六轴机械臂建模:从DH参数到3D可视化(附完整代码)

本文详细介绍了如何使用Matlab机器人工具箱进行六轴机械臂建模,从DH参数输入到3D可视化全流程解析。通过正运动学验证、逆运动学求解和交互控制等实战技巧,帮助工程师快速掌握机械臂建模核心方法,并提供完整代码示例解决常见问题。

weixin_27372101的博客 394

Android Studio CMake使用笔记

1. 安装cmake以及ndk 工具栏: Tools-->SDK Manager-->Android SDK 选择SDK Tools,选中NDK 以及 CMake 下载安装 图: 2. 新建工程 修改build.gradle defaultConfig { minSdk 28 targetSdk 32 versionCode 1 versionName "1.0" testInstrumentationRunner "and...

静虚待令,有物混成 5243

FPGA设计中的扇出约束实战:从XDC到代码优化的全流程解析

本文全面解析FPGA设计中扇出约束的重要性与应用,详细介绍了从XDC约束文件设置到HDL代码优化的全流程实战技巧。通过MAX_FANOUT约束控制信号负载,结合寄存器复制和物理优化策略,有效解决高扇出导致的时序违例和布线拥塞问题,提升设计性能和可靠性。

nept的博客 797

Android ffmpeg入门(1)—— 使用NDK交叉编译ffmpeg集成到Android项目

使用NDK交叉编译ffmpeg静态库,并集成到Android项目实现JNI互调。

孙先森的博客 8157

2026年佰维存储数字IC笔试试卷带答案

建立时间是有效时钟沿到来前,输入数据必须稳定保持的最短时间。保持时间是有效时钟沿到来后,输入数据必须继续稳定保持的最短时间。

Open 103

【kafka】控制台默认不能发送大数据 4096 4095 4129

1.概述 因为某些原因,需要做一个测试,然后我想往topic中,发送一条消息,然后再消费它。但是消息有点大,一条消息是36K. 消费者 [root@1 kafka]# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic xxx.devicealarm | grep 网络攻击 生产者,生产者发送了一个消息消息是一个json,json中有这个数据特征 网络攻击 [root@1 kafka]# bin/kafka-console-p

九师兄 586

把cpp编译为so_Android Studio cmake编译FFmpeg以及Jni调用

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,减轻开发人员的打...

weixin_36381252的博客 530

058、时域降噪(Temporal Denoise):运动补偿与递归滤波在视频降噪中的应用

本文深入探讨了时域降噪(Temporal Denoise)技术在视频处理中的应用。作者通过车载环视项目案例,揭示了空域降噪的局限性,提出利用帧间信息进行降噪的核心思路。文章详细解析了递归滤波和运动补偿两大关键技术,指出递归滤波简单但易产生拖影,而运动补偿通过计算运动矢量解决此问题。作者还分享了多帧降噪方案的优势与算力挑战,并总结了噪声模型匹配、运动矢量一致性等实战调优经验。最后强调时域降噪需要与空域降噪平衡,指出调试工具的重要性,提出"在保证运动区域无鬼影的前提下追求信噪比"的实践原则,体现了算法复杂度与效

zzfmlxs的博客 92

在Android Studio中使用cmake编译FFmpeg

在Android Studio中使用cmake编译FFmpeg最进根据公司项目需要,学习FFmpeg音视频编解码做技术储备,项目是运行在android平台上的,所以需要把FFmpeg移植到Android上,之前做过一个Android NDK 编程的Demo,使用的是cmake编译方式,所以在这个项目中仍采用cmake。

尘埃zza的博客 4318

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: android全平台编译ffmpeg合并为单个库实践
下一篇: android全平台下基于ffmpeg解码MP4视频文件为YUV文件
handy周
handy周 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄14年 507粉丝 240原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值