SDL无法打开音频设备的问题:Couldn‘t open audio/video device: No available audio/video device

2023-11-19

解决中标麒麟下SDL无法打开音频设备的问题:

root登录

首先就是一定要用root登录,这个可能是权限问题,否则后面实验不能成功

安装ALSA库

首先下载alsa-lib:https://www.alsa-project.org/main/index.php/Main_Page
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
tar -jxvf alsa-lib-1.1.2.tar.bz2
cd alsa-lib-1.1.2
./configure
make && make install
这样alsa-lib库就安装好了,不需要去管安装到哪里,系统自动安装了,测试时发现使用此版本库在播放音频时会出现:ALSA lib pcm.c:8251:(snd_pcm_recover) underrun occurred
此时音频播放会断断续续,怀疑是安装alsa-lib的版本太低了,于是换到了alsa-lib-1.2.2,就可以正常播放了

测试

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SDL2/SDL.h"
static unsigned char *pAudio_chunk;
static unsigned int audio_len;
static unsigned char *pAudio_pos;
void fill_audio_buffer(void *userdata, Uint8 * stream, int len)
{
    SDL_memset(stream, 0, len);
    // 判断是否有读到数据
    if (audio_len == 0)
        return;
    len = (len > audio_len ? audio_len : len);
    SDL_MixAudio(stream, pAudio_pos, len, SDL_MIX_MAXVOLUME);
    pAudio_pos += len;
    audio_len -= len;
}
int main(int argc, char *argv[])
{
	if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_TIMER))
    {
        printf("Initialize SDL failed: %s\n", SDL_GetError());
        return -1;
    }
    /*** 初始化初始化SDL_AudioSpec结构体 ***/
    SDL_AudioSpec audioSpec;
    audioSpec.freq = 44100;                     // 音频数据的采样率。常用的有48000,44100等
    audioSpec.format = AUDIO_S16SYS;            // 音频数据的格式
    audioSpec.channels = 2;                     // 声道数。例如单声道取值为1,立体声取值为2
    audioSpec.silence = 0;                      // 设置静音的值
    audioSpec.samples = 1024;                   // 音频缓冲区中的采样个数,要求必须是2的n次方
    audioSpec.callback = fill_audio_buffer;     // 填充音频缓冲区的回调函数
    // 打开音频设备
    if (SDL_OpenAudio(&audioSpec, NULL) < 0)
    {
        printf("Can not open audio!");
        return -1;
    }
    printf("Open audio success!\n");
	return 0;
}

MakeFile

############################################################
# main makefile
############################################################

############################################################
# Target setting
############################################################

TARGET_DEMO = sdl_test

TOP_DIR = .
BIN_DIR = $(TOP_DIR)/.bin
OBJ_DIR = $(TOP_DIR)/.obj
SRC_DIR = $(TOP_DIR)
TPARTY_DIR = $(TOP_DIR)/../install/x86/SDL2/lib
INC_DIR = $(TOP_DIR)/../install/x86/SDL2/include

############################################################
# Project options
############################################################

INCLUDES += \
	-I$(INC_DIR)
	
LIBINCLUDES += \
	-L$(TPARTY_DIR)

LINK_LIBRARIES += \
	-lSDL2 -lm -ldl -lpthread -lrt

VPATH := \
		./
	
SRCS_CPP := 
		
SRCS_C := 

SRCS_DEMO_CPP := \
		$(SRCS_CPP)

SRCS_DEMO_C := \
		$(SRCS_C) \
		main.c
		
############################################################
# Compiler
############################################################

CXX = g++
CC = gcc
LINKXX = g++
LINK = gcc
AR = $(CROSS_PREFIX)ar -r
AS = $(CROSS_PREFIX)as
LD = $(CROSS_PREFIX)ld
MAKE = make 
SUBMAKE = $(MAKE) --no-print-directory -f
PY = python
SED = sed
MKDIR = mkdir -p
CP = cp
RM = rm -f
MV = mv
ECHO = echo

CXXFLAGS += -O3 -Wall -std=c++11
CFLAGS   += -O3 -Wall

############################################################
# build rules
############################################################

CC_TITLE   = @$(ECHO) "==> Compiling $@ "
LINK_TITLE = @$(ECHO) "==> Linking $(BIN_DIR)/$@ "

CXXFLAGS += $(INCLUDES)
CFLAGS   += $(INCLUDES)

define MK_OBJ_DIR
	if test ! -d $(OBJ_DIR); then $(MKDIR) $(OBJ_DIR); fi
endef

define MK_BIN_DIR
	if test ! -d $(BIN_DIR); then $(MKDIR) $(BIN_DIR); fi
endef

$(OBJ_DIR)/%.o: %.cpp
	$(CC_TITLE)
	@$(MK_OBJ_DIR)
	@$(CXX) -o $@ -c $(CXXFLAGS) $<
	
$(OBJ_DIR)/%.o: %.c
	$(CC_TITLE)
	@$(MK_OBJ_DIR)
	@$(CC) -o $@ -c $(CFLAGS) $<
	
OBJS_C = $(patsubst %.c, $(OBJ_DIR)/%.o, $(SRCS_C))
OBJS_CPP = $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(SRCS_CPP))
OBJS_DEMO_C = $(patsubst %.c, $(OBJ_DIR)/%.o, $(SRCS_DEMO_C))
OBJS_DEMO_CPP = $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(SRCS_DEMO_CPP))

############################################################
# make target
############################################################

all: $(TARGET_DEMO)
$(TARGET_DEMO):$(OBJS_DEMO_CPP) $(OBJS_DEMO_C)
	@$(LINK_TITLE)
	@$(MK_BIN_DIR)
	@$(LINK) $^ -o $(BIN_DIR)/$(TARGET_DEMO) $(LIBINCLUDES) $(LINK_LIBRARIES)

.PHONY:install clean distclean
install:
	@$(MKDIR) install/$(CROSS_NAME)/include
	@$(CP) -rf include/* install/$(CROSS_NAME)/include 
	@$(MKDIR) install/$(CROSS_NAME)/lib
	@if [ -e $(BIN_DIR)/$(TARGET_SO) ];   then $(CP) -f $(BIN_DIR)/$(TARGET_SO) install/$(CROSS_NAME)/lib;fi
	@if [ -e $(BIN_DIR)/$(TARGET_A) ];    then $(CP) -f $(BIN_DIR)/$(TARGET_A) install/$(CROSS_NAME)/lib;fi
	@if [ -e $(BIN_DIR)/$(TARGET_DEMO) ]; then $(MKDIR) install/$(CROSS_NAME)/sbin; $(CP) -f $(BIN_DIR)/$(TARGET_DEMO) install/$(CROSS_NAME)/sbin; fi
	
clean:
	@$(RM) -r $(OBJ_DIR) $(BIN_DIR)
	
distclean:
	@$(RM) -r $(OBJ_DIR) $(BIN_DIR)

运行的时候一定要在前面加上SDL_AUDIODRIVER=alsa

SDL_AUDIODRIVER=alsa ./sdl_test
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SDL无法打开音频设备的问题:Couldn‘t open audio/video device: No available audio/video device 的相关文章

  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 如何将图标放置到 QLineEdit 上?

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • Qt 插槽是否与其他代码并行运行?

    在此函数示例中 void MyClass myFunction emit MySignal1 emit MySignal2 如果我有slot1倾听MySignal1 and slot2倾听MySignal2 1 Is slot1总是会在之前

随机推荐

  • Vue控制台警告: Added non-passive event listener to a scroll-blocking ‘touchmove‘ event. Consider markin

    翻译过来如下 违反 没有添加被动事件监听器来阻止 touchstart 事件 请考虑添加事件管理者 passive 以使页面更加流畅 原因是 Chrome51 版本以后 Chrome 增加了新的事件捕获机制 Passive Event Li
  • 修改vscode默认打开两个标签窗口

    vscode 默认打开两个标签窗口 设置能同时打开多个标签 打开以下这个路径C Users xx AppData Roaming Code User 在setting json中添加一行设置 workbench editor enableP
  • android获取view宽高的时机

    关键点 获取宽高应该在view的onLayout之后 这个时候 view已经确定算出宽高 error 在onCreate onResume方法中调用 用于获取TextView的宽度和高度都是0 private void getTextHei
  • 使用NDK编译C/C++文件生成在安卓中的可执行文件

    使用NDK编译C C 文件生成在安卓中的可执行文件 需求 要编译一个C文件 然后将他运行到安卓手机中 通过这个可执行文件可以获取一些硬件的参数信息 或者对已经有的信息进行修改 从而达到我们想要的效果 相关知识点记录 NDK Native D
  • HTTP POST请求json数据量过大的问题

    与第三方合作 需要提供数据上传接口给他们 联调时被他们的单条json数据量困扰到了 第三方接口联调 一条7M的json上传给我们 毫无意外的报错了 实体数据量太大 该如何修改以便适应大数据量的上传呢 在代码层面想不到解决方案 于是查看配置
  • GitHub Actions自动化部署+定时百度链接推送

    前言 最近用VuePress搭建了一个静态网站 由于是纯静态的东西 每次修改完文章都要重新打包上传很是麻烦 虽然vuepress theme vdoing主题作者提供了GitHub Actions自动化部署的教程文章 但是过于简陋且是19年
  • 在小项目中实践领域驱动设计(含详细代码和实践过程) #CSDN博文精选# #IT# #项目实践#

    大家好 小C将继续与你们见面 带来精选的CSDN博文 又到周一啦 上周的系统化学习专栏已经结束 我们总共一起学习了20篇文章 这周将开启全新专栏 放假不停学 全栈工程师养成记 在这里 你将收获 将系统化学习理论运用于实践 系统学习IT技术
  • 为什么Java不支持多继承,却搞了个Interface出来?

    多继承的问题在于无法找到一个合理的规则去初始化基类的数据 菱形继承中 两个子类分别调用父类构造函数进行初始化时 到底该调用谁 都调用的话 谁先谁后 C 的解决方案把这个问题丢给了使用者 也就是孙类 似乎是解决了问题 可是它忽视了子类并没有虚
  • 阿里巴巴编码规范习题

    因为工作需要 公司组里要求考阿里巴巴编程规范 于是我花了一天的时间看了一遍 然后刷了一些题 终于在第三次的时候考过了 考试是基于 阿里巴巴Java开发手册 一共50道题目 包括多选和单选 题目都是选择题 目前阿里云编程规范是出到V1 5 0
  • 算法:深度优先遍历和广度优先遍历

    什么是深度 广度优先遍历 图的遍历是指 从给定图中任意指定的顶点 称为初始点 出发 按照某种搜索方法沿着图的边访问图中的所有顶点 使每个顶点仅被访问一次 这个过程称为图的遍历 遍历过程中得到的顶点序列称为图遍历序列 图的遍历过程中 根据搜索
  • 类的数组成员变量的初始化

    使用STL标准模板库之后 编程时已经很少使用数组和指针 相反 多使用序列容器vector代替之 但事实并不这么理想 在迫不得已的情况下 我们还是会选择使用数组 这里介绍一下当数组作为类的成员变量时 应该怎么对它 数组 进行初始化 在类的构造
  • 日志LOG

    一 引言 1 1 日志介绍 用于记录系统中发生的各种事件 记录的位置常见的有 控制台 磁盘文件等 1 2 日志级别 日志级别从低到高 TRACE 堆栈 DEBUG 调试期 INFO 运行期 WARN 警告 ERROR 错误 FATAL 严重
  • 微信小程序实现一个遮罩层

    微信小程序实现遮罩层 开发中 遮罩层的使用场景很多 例如 loading的时候 例如搜索的时候等 以下是一个案例 点击页面的搜索框 在页面上添加一层遮罩层 显示搜索详情页 页面搜索框如下 页面最上面有一个搜索框 下面有一些其他UI元素
  • 微软解释关于Windows 10 收集用户数据那点事

    微软 Microsoft 在周一时发布关于Win10 收集用户数据的新细节 试图停止这场争议 早前 该软件巨头确认Win10收集用户数据并发送给微软 并声称这是用于改善整体用户体验 然而 这引发了人们对用户隐私以及用何种方式收集数据的关注
  • int、long、long long取值范围

    unsigned int 0 4294967295 int 2147483648 2147483647 unsigned long 0 4294967295 long 2147483648 2147483647long long的最大值 9
  • 美团外卖推荐关于用户新颖体验优化的技术探索

    外卖场景下 用户 复购 属性强 下单频次高 既想下单老商家 也会想换换 新口味 为更好平衡用户的复购 尝新体验 外卖推荐团队从2022年起开始持续投入 构建了外卖场景新颖性推荐的体系化解决方案 截止目前 外卖首页用户曝光新颖性累计提升19
  • 安装anconda以及在pycharm使用

    安装anconda 下载安装 配置虚拟环境需要通过anaconda来完成 anaconda的下载地址为 https docs conda io en latest miniconda html windows用户下载python3 8的mi
  • 蓝牙之四-Handler

    Handler机制 Handler允许用户发送和处理Message以及线程MessageQueue相关的可运行对象 每个Handler实例都对应一个单线程以及该线程的MessageQueue 当创建新的Handler时 该Handler将被
  • Kali搭建DVWA——Web靶场

    博主主站地址 微笑涛声 www cztcms cn 一 DVWA介绍 1 DVWA简介 DVWA是一款基于PHP和MYSQL开发的web靶场练习平台 集成了常见的web漏洞如sql注入 XSS 密码破解等常见漏洞 旨在为安全专业人员测试自己
  • SDL无法打开音频设备的问题:Couldn‘t open audio/video device: No available audio/video device

    解决中标麒麟下SDL无法打开音频设备的问题 root登录 首先就是一定要用root登录 这个可能是权限问题 否则后面实验不能成功 安装ALSA库 首先下载alsa lib https www alsa project org main in