当前位置: 首页 > news >正文

SDL2:arm64下编译使用 -- SDL2多媒体库使用音频实例


更多内容:XiaoJ的知识星球


SDL2:Android-arm64端编译使用

    • 2. SDL2:Android-arm64端编译使用
      • 2.1 安装和配置NDK
      • 2.2 下载编译SDL2
      • 2.3 SDL2使用示例:Audio
      • 2.4 Android设备运行


2. SDL2:Android-arm64端编译使用

在Linux系统上使用Android NDK编译和使用arm64下的SDL2,可以按照以下步骤进行:

2.1 安装和配置NDK

确保已经安装Android NDK r26c。

设置${NDK}环境变量。

2.2 下载编译SDL2

wget https://www.libsdl.org/release/SDL2-2.28.4.tar.gz
tar -zxvf SDL2-2.28.4.tar.gzcd SDL2-2.28.4
mkdir build_arm64
cd build_arm64cmake -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \-DANDROID_ABI=arm64-v8a \-DANDROID_PLATFORM=android-26 \-DCMAKE_INSTALL_PREFIX=$PWD/_install \-DSDL_STATIC=OFF \-DSDL_SHARED=ON \..make
make install

确定安装目录:

sudo find ./ -type f -name "SDL2Config.cmake"
sudo find ./ -type f -name "sdl2-config.cmake"

2.3 SDL2使用示例:Audio

(1)main.cpp示例:

  • 使用SDL2从音频设备获取输入数据,并使用printf打印相关信息。
#include <SDL2/SDL.h>
#include <stdio.h>// 音频回调函数
void audioCallback(void* userdata, Uint8* stream, int len) {// 这里可以处理音频数据,例如保存到文件或进行实时处理// 本示例中不进行处理,仅打印信息printf("Captured %d bytes of audio data.\n", len);
}int main(int argc, char* argv[]) {// 初始化SDL音频子系统if (SDL_Init(SDL_INIT_AUDIO) < 0) {printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());return -1;}// 定义音频规格SDL_AudioSpec want, have;SDL_zero(want);want.freq = 44100;  // 采样率want.format = AUDIO_S16SYS;  // 采样格式want.channels = 2;  // 双声道want.samples = 1024;  // 缓冲区大小want.callback = audioCallback;  // 指定音频回调函数want.userdata = nullptr;// 打开音频设备SDL_AudioDeviceID deviceId = SDL_OpenAudioDevice(nullptr, 1, &want, &have, 0);if (deviceId == 0) {printf("SDL could not open audio device! SDL_Error: %s\n", SDL_GetError());SDL_Quit();return -1;}// 检查音频规格是否符合预期if (have.freq != want.freq || have.format != want.format || have.channels != want.channels) {printf("Audio specification mismatch.\n");SDL_CloseAudioDevice(deviceId);SDL_Quit();return -1;}// 播放音频SDL_PauseAudioDevice(deviceId, 0);// 持续捕获音频数据printf("Capturing audio... Press Enter to stop.\n");getchar();// 停止音频捕获SDL_PauseAudioDevice(deviceId, 1);// 关闭音频设备SDL_CloseAudioDevice(deviceId);// 退出SDLSDL_Quit();return 0;
}

(2)编译

使用Makefile+NDK交叉编译:

NDK_PATH := /home/android-ndk-r26c
CXX := $(NDK_PATH)/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++# SDL2库路径
SDL2_DIR := /home/SDL2-2.28.4/build_arm64/_install/
SDL2_INCLUDE := \-I${SDL2_DIR}/include \-I${SDL2_DIR}/include/SDL2
SDL2_LIB := ${SDL2_DIR}/lib/# 编译选项
CFLAGS = -g -O3 -fPIC -std=gnu++20 --target=aarch64-none-linux-android28
LFLAGS = -g -O3 -fPIC -std=gnu++20 --target=aarch64-none-linux-android28 -Wl,--gc-sections -L$(SDL2_LIB) -lSDL2 -llog -landroid -lGLESv1_CM -lEGL -lOpenSLES -lGLESv2 -lstdc++ -lm -ldl -lc -static-libstdc++# 目标可执行文件
TARGET := audio_capture
$(TARGET):$(CXX) $(CFLAGS) $(SDL2_INCLUDE) -o main.cpp.o -c main.cpp$(CXX) $(CFLAGS) -o $(TARGET) main.cpp.o $(LFLAGS)
clean:rm -f *.o $(TARGET)
.PHONY: all clean

生成audio_capture可执行文件,执行编译:make

2.4 Android设备运行

# 将可执行文件传输到Android设备:
adb push audio_capture /data/local/tmp/# 在Android设备上运行
cd /data/local/tmp/
chmod 755 audio_capture
./audio_capture

.


声明:资源可能存在第三方来源,若有侵权请联系删除!

相关文章:

SDL2:arm64下编译使用 -- SDL2多媒体库使用音频实例

更多内容&#xff1a;XiaoJ的知识星球 SDL2&#xff1a;Android-arm64端编译使用 2. SDL2&#xff1a;Android-arm64端编译使用2.1 安装和配置NDK2.2 下载编译SDL22.3 SDL2使用示例&#xff1a;Audio2.4 Android设备运行 2. SDL2&#xff1a;Android-arm64端编译使用 在Linux系…...

Syncthing在ubuntu下的安装使用

以前安装这个软件的时候&#xff0c; 是在windows和mac上&#xff0c;都是图形化的安装方式&#xff0c;但是ubuntu不太一样&#xff0c;需要增加源&#xff0c;然后执行命令。安装的系统版本是2004。 参考链接1&#xff0c;主要命令包含下面几个部分&#xff1a; 第一步&…...

使用 Helm 安装 Redis 集群

在 Kubernetes 集群中使用 Helm 安装 Redis 集群可以极大地简化部署和管理 Redis 的过程。本文将详细介绍如何使用 Helm 安装 Redis 集群&#xff0c;并提供一些常见问题的解决方案。 前提条件 Kubernetes 集群。&#xff08;略&#xff09;已安装 Helm 工具。搭建了存储类nf…...

基于32QAM的载波同步和定时同步性能仿真,包括Costas环的gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…...

【ArcGIS微课1000例】0140:总览(鹰眼)、放大镜、查看器的用法

文章目录 一、总览工具二、放大镜工具三、查看器工具ArcGIS中提供了三种局部查看的工具: 总览(鹰眼)、放大镜、查看器,如下图所示,本文讲述这三种工具的使用方法。 一、总览工具 为了便于效果查看与比对,本实验采用全球影像数据(位于配套实验数据包中的0140.rar中),加…...

使用QQ登录(头条项目-09)

一 QQ登录开发文档 QQ登录&#xff1a;即我们所说的 第三⽅登录&#xff0c;是指⽤户可以不在本项⽬中输⼊密码&#xff0c;⽽直接 通过第三⽅的验证&#xff0c;成功登录本项⽬。 1.1 QQ互联开发者申请步骤 若想实现QQ登录&#xff0c;需要成为 QQ互联的开发者&#xff0c;…...

iOS页面设计:UIScrollView布局问题与应对策略

在iOS开发中&#xff0c;UIScrollView是一个极其重要且常用的控件&#xff0c;它允许用户通过手势滑动查看大量内容。然而&#xff0c;在利用UIScrollView进行页面布局时&#xff0c;开发者往往会遇到一些挑战。本文将深入探讨UIScrollView布局中常见的问题&#xff0c;并提供相…...

Linux提权-02 sudo提权

文章目录 1. sudo 提权原理1.1 原理1.2 sudo文件配置 2. 提权利用方式2.1 sudo权限分配不当2.2 sudo脚本篡改2.3 sudo脚本参数利用2.4 sudo绕过路径执行2.5 sudo LD_PRELOAD环境变量2.6 sudo caching2.7 sudo令牌进程注入 3. 参考 1. sudo 提权原理 1.1 原理 sudo是一个用于在…...

vscode 设置

一、如何在vscode中设置放大缩小代码 1.1.文件—首选项——设置 1.2.在搜索框里输入“Font Ligatures”&#xff0c;然后点击"在settings.json中编辑" 1.3.在setting中&#xff08;"editor.fontLigatures":前&#xff09;添加如下代码 "editor.mous…...

学习threejs,使用FlyControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.FlyControls 相机控制…...

在 C++ 中实现调试日志输出

在 C 编程中&#xff0c;调试日志对于定位问题和优化代码至关重要。有效的调试日志不仅能帮助我们快速定位错误&#xff0c;还能提供有关程序运行状态的有价值的信息。本文将介绍几种常用的调试日志输出方法&#xff0c;并教你如何在日志中添加时间戳。 1. 使用 #ifdef _DEBUG…...

从零搭建一套远程手机的桌面操控和文件传输的小工具

从零搭建一套远程手机的桌面操控和文件传输的小工具 --ADB连接专题 一、前言 前面的篇章中&#xff0c;我们确定了通过基于TCP连接的ADB控制远程手机的操作思路。本篇中我们将进行实际的ADB桥接的具体链路搭建工作&#xff0c;从原理和实际部署和操作层面上&#xff0c;从零…...

Python中的静态方法

目录 什么是静态方法&#xff1f;静态方法的特点 定义和调用静态方法示例&#xff1a;定义一个简单的静态方法 静态方法 vs 类方法 vs 实例方法示例对比 静态方法的应用场景1. &#x1f527; 工具函数2. &#x1f3ed; 工厂方法3. ✅ 数据验证 静态方法的限制总结 静态方法是 P…...

【C++】面试题整理(未完待续)

【C】面试题整理 文章目录 一、概述二、C基础2.1 - 指针在 32 位和 64 位系统中的长度2.2 - 数组和指针2.3 - 结构体对齐补齐2.4 - 头文件包含2.5 - 堆和栈的区别2.6 - 宏函数比较两个数值的大小2.7 - 冒泡排序2.8 - 菱形继承的内存布局2.9 - 继承重写2.10 - 如何禁止类在栈上分…...

每日一题 403. 青蛙过河

403. 青蛙过河 动态规划&#xff0c;状态转移 和 上一步步长 和 当前位置点 有关系 class Solution { public:bool canCross(vector<int>& stones) {int n stones.size();unordered_map<int,unordered_set<int>> dp;unordered_map<int,int> mp;…...

Spring Boot 集成 MongoDB:启动即注入的便捷实践

引言 在现代后端开发中&#xff0c;Spring Boot 凭借其快速开发、自动配置等特性深受开发者喜爱&#xff0c;而 MongoDB 以其灵活的文档存储结构和出色的扩展性&#xff0c;成为处理非结构化数据的首选数据库之一。将两者结合&#xff0c;利用 Spring Boot 的自动配置功能&…...

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…...

R语言的文件操作

R语言的文件操作 引言 在数据科学和分析的过程中&#xff0c;文件操作是不可或缺的一部分。R语言作为一种强大的统计计算和图形作图的编程语言&#xff0c;提供了丰富的文件操作函数&#xff0c;使得用户能够方便地读取和保存数据。本文将详细介绍R语言中的文件操作&#xff…...

锐捷路由器网关RG-NBR6135-E和锐捷交换机 Ruijie Reyee RG-ES224GC 电脑登录web方法

2025年1月17日22:29:35 最近淘了点东西&#xff0c;准备在家里搞一套深度学习的服务器&#xff0c;先把网关和交换机搞到了 锐捷路由器网关RG-NBR6135-E 电脑登录web方法 在拿到机器的时候&#xff0c;如果不是全新建议拿根牙签&#xff0c;差入reset 5-10秒,灯光会全部闪几下…...

论文速读|NoteLLM: A Retrievable Large Language Model for Note Recommendation.WWW24

论文地址&#xff1a;https://arxiv.org/abs/2403.01744 bib引用&#xff1a; misc{zhang2024notellmretrievablelargelanguage,title{NoteLLM: A Retrievable Large Language Model for Note Recommendation}, author{Chao Zhang and Shiwei Wu and Haoxin Zhang and Tong Xu…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...