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

news2025/1/20 4:37:36

更多内容: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.gz

cd SDL2-2.28.4
mkdir build_arm64
cd build_arm64

cmake -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);

    // 退出SDL
    SDL_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

.


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

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

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

相关文章

K8S开启/关闭审计日志

K8S默认禁用审计 开启/关闭 k8s 审计日志 默认 Kubernetes 集群不会输出审计日志信息。通过以下配置&#xff0c;可以开启 Kubernetes 的审计日志功能。 准备审计日志的 Policy 文件配置 API 服务器&#xff0c;开启审计日志重启并验证 准备审计日志 Policy 文件 apiVersio…

深入探讨DICOM医学影像中的MPPS服务及其具体实现

深入探讨DICOM医学影像中的MPPS服务及其具体实现 1. 引言 在医疗影像的管理和传输过程中&#xff0c;DICOM&#xff08;数字影像和通信医学&#xff09;标准发挥着至关重要的作用。除了DICOM影像的存储和传输&#xff08;如影像存储SCP和影像传输SCP&#xff09;&#xff0c;…

VGG (Visual Geometry Group) :深度卷积神经网络的图像识别利器

前言 在深度学习的蓬勃发展历程中&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;为图像识别领域带来了革命性的突破。而 VGG&#xff08;Visual Geometry Group&#xff09;作为其中的杰出代表&#xff0c;凭借其简洁而高效的…

【机器学习实战中阶】音乐流派分类-自动化分类不同音乐风格

音乐流派分类 – 自动化分类不同音乐风格 在本教程中,我们将开发一个深度学习项目,用于自动化地从音频文件中分类不同的音乐流派。我们将使用音频文件的频率域和时间域低级特征来分类这些音频文件。 对于这个项目,我们需要一个具有相似大小和相似频率范围的音频曲目数据集…

HTML基础与实践

目录 HTML 结构 认识 HTML 标签 HTML 文件基本结构 标签层次结构 快速生成代码框架 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 超链接标签: a ​编辑链接的几种形式: 表格标签 基本使用 合并单元格 …

差分(前缀和的逆运算)

作用&#xff1a; 在 [ l ,r ] 数组中&#xff0c;对全部数字c 思路 原数组a 构造差分数组b使得a[i]b1b2b3...bi; a数组是b数组的前缀和,b1b2b3...bnan b[i] a[i]-a[i-1]; 在d21,那在前缀和时&#xff0c;这些a都1 在数组中&#xff0c;要l~r这段数c 在l处c后&#xff0c…

学习记录1

[SUCTF 2019]EasyWeb 直接给了源代码&#xff0c;分析一下 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if…

走出实验室的人形机器人,将复刻ChatGPT之路?

1月7日&#xff0c;在2025年CES电子展现场&#xff0c;黄仁勋不仅展示了他全新的皮衣和采用Blackwell架构的RTX 50系列显卡&#xff0c;更进一步展现了他对于机器人技术领域&#xff0c;特别是人形机器人和通用机器人技术的笃信。黄仁勋认为机器人即将迎来ChatGPT般的突破&…

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加&#xff0c;以及为了与iOS、Android 端统一页面跳转路由&#xff0c;以及动态下发路由链接&#xff0c;路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理&#xff0c;类似于 iOS与Android的实…

左神算法基础提升--3

文章目录 Manacher 算法经典算法Manacher算法原理 单调栈或单调队列 Manacher 算法 经典算法 在每学习Manacher算法之前我们可能会使用一种比较经典暴力的算法&#xff1a;遍历str字符串&#xff0c;将字符串中的每个字符作为对称点&#xff0c;向两边扩散找到回文字段&#x…

usb通过hdc连接鸿蒙next的常用指令

参考官方 注册报名https://www.hiascend.com/developer/activities/details/44de441ef599450596131c8cb52f7f8c/signup?channelCodeS1&recommended496144 hdc-调试命令-调测调优-系统 - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-guid…

windows远程桌面连接限定ip

1&#xff0c;Windows防火墙->高级设置->远程桌面 - 用户模式(TCP-In)->作用域->远程IP地址 2&#xff0c;启用规则

ASP.NET Core - 配置系统之自定义配置提供程序

ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…

光谱相机如何还原色彩

多光谱通道采集 光谱相机设有多个不同波段的光谱通道&#xff0c;可精确记录每个波长的光强信息。如 8 到 16 个甚至更多的光谱通道&#xff0c;每个通道负责特定波长范围的光信息记录。这使得相机能分辨出不同光谱组合产生的相同颜色感知&#xff0c;而传统相机的传感器通常只…

论文速读|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…

【跟着官网学技术系列之MySQL】第7天之创建和使用数据库1

前言 在当今信息爆炸的时代&#xff0c;拥有信息检索的能力很重要。 作为一名软件工程师&#xff0c;遇到问题&#xff0c;你会怎么办&#xff1f;带着问题去搜索引擎寻找答案&#xff1f;亦或是去技术官网&#xff0c;技术社区去寻找&#xff1f; 根据个人经验&#xff0c;一…

ComfyUI 矩阵测试指南:用三种方法,速优项目效果

在ComfyUI中&#xff0c;矩阵测试也叫xyz图表测试&#xff0c;作用是通过控制变量的方式来对Lora模型以及各种参数开展测试&#xff0c;并进行有效区分。其中测试方法有很多种&#xff0c;可以通过借助插件也可以自行搭建工作流实现&#xff0c;下面介绍3种方式&#xff1a; 1…

Day 9 卡玛笔记

这是基于代码随想录的每日打卡 151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 **…

音视频入门基础:RTP专题(4)——FFmpeg源码中,判断某文件是否为SDP文件的实现

一、引言 执行《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》中的“媒体文件转推RTP的FFmpeg命令”会生成一个SDP文件&#xff0c;该文件内容如下&#xff1a; v0 o- 0 0 IN IP4 127.0.0.1 sNo Name t0 0 atool:libavformat 61…

数据结构——队列和栈的面试题分析

之前我们写过了有效括号的分析了&#xff0c;接下来&#xff0c;我们继续来学习一下&#xff0c;有关栈和队列之间的相关转换的题目吧。 栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 这里我们使用c语言的形式来写&#xff0c;所以我们先自己模拟一…