SDL录制音频并播放

embedded/2024/9/30 0:25:47/

摘要:在ubuntu 20.04中使用QAudioInput、PortAduio、ffmpeg打开音频设备录制音频都显示失败,最后没办法选择了SDL2.0,SDL2.0录制音频十分方便,使用也非常简单。
疑问:不知道SDL是如何区分打开的设备是录制还是播放。(已解决,通过打开设备时设置iscapture参数的值,0表示录制,非0表示播放)
主要函数简介:

SDL_Init(SDL_INIT_AUDIO)

此函数用于初始化音频。

SDL_AudioSpec want, have;
SDL_zero(want);
want.freq = 44100;
want.format = AUDIO_S16SYS;
want.channels = 2;
want.samples = 288;
want.callback = audioCallback;

设置音频数据的格式。

//参数iscapture 0表示播放音频  非0表示录制音频
SDL_AudioDeviceID deviceId = SDL_OpenAudioDevice(nullptr, 2, &want, &have, SDL_AUDIO_ALLOW_FORMAT_CHANGE);

此函数用于打开音频设备,音频的录制和播放取决于第二个参数,若第二个参数设置为0,此函数表示的打开录制音频。非0表示打开播放音频。

SDL_QueueAudio(deviceIdO,stream,len);

若不用回调函数,可以使用此函数对音频进行播放操作。

SDL_DequeueAudio(deviceIdO,stream,len);

若不用回调函数,可以使用此函数定时读取录制的音频数据。

SDL_MixAudioFormat(stream, stream, AUDIO_S16SYS, len, 100);

可用于混音和调节音频的音量。

在下面的demo中,音频的录制采用了回调函数,音频的播放采用了SDL_QueueAudio函数。

SDL_AudioDeviceID deviceIdO;//全局播放音频设备id
//回调函数,用在音频录制
void audioCallback(void *userdata, Uint8 * stream,int len)
{Q_UNUSED(userdata);// Sint16* audioData = reinterpret_cast<Sint16*>(stream);// int numSamples = len / sizeof(Sint16);// for (int i = 0; i < numSamples; ++i) {//     // 假设放大倍数为 2//     audioData[i] *= 2;// }SDL_MixAudioFormat(stream, stream, AUDIO_S16SYS, len, 100);mp3InFILE.write((char *)stream,len);//从缓存区播放音频SDL_QueueAudio(deviceIdO,stream,len);
}
	if(SDL_Init(SDL_INIT_AUDIO) < 0){qDebug() << "SDL  INIT ERROR" << SDL_GetError();return ;}SDL_AudioSpec want, have;SDL_zero(want);want.freq = 44100;want.format = AUDIO_S16SYS;want.channels = 2;want.samples = 288;want.callback = audioCallback;//参数iscapture 0表示播放音频  非0表示录制音频SDL_AudioDeviceID deviceId = SDL_OpenAudioDevice(nullptr, 2, &want, &have, SDL_AUDIO_ALLOW_FORMAT_CHANGE);//开启音频播放设备want.callback = nullptr;deviceIdO = SDL_OpenAudioDevice(nullptr, 0, &want, &have, SDL_AUDIO_ALLOW_FORMAT_CHANGE);if (deviceIdO == 0) {qDebug() << "SDL could not open audio device! SDL Error: " << SDL_GetError();return;}//分别开启音频录制和音频播放。SDL_PauseAudioDevice(deviceId,0);SDL_PauseAudioDevice(deviceIdO,0);

http://www.ppmy.cn/embedded/119649.html

相关文章

使用Prometheus进行系统监控,包括Mysql、Redis,并使用Grafana图形化表示

Prometheus是一个开源的的监控工具&#xff0c;而且还免费。这一次我们用Prometheus来对之前安装的所有服务&#xff0c;包括Mysql、Redis、系统状况等进行监控&#xff0c;并结合Grafana进行图形化展示 Prometheus下载和安装 下载地址&#xff08;以下所有插件的官方下载地址…

面经4——亚信

1、简单介绍一下自己和在大学做过的东西 这个大家根据自己的经历回答即可 2、了解过Oracle吗&#xff1f; Oracle和MySQL一样&#xff0c;也是关系型数据库。 Oracle数据库是由美国甲骨文公司&#xff08;Oracle Corporation&#xff09;开发的一款关系型数据库管理系统。它…

Tomcat系列漏洞复现

CVE-2017-12615——Tomcat put⽅法任意⽂件写⼊漏洞 漏洞描述 当 Tomcat运⾏在Windows操作系统时&#xff0c;且启⽤了HTTP PUT请求⽅法&#xff08;例如&#xff0c;将 readonly初始化参数由默认值设置为false&#xff09;&#xff0c;攻击者将有可能可通过精⼼构造的攻击请求…

更新gitignore后如何使其生效

更新gitignore后如何使其生效 当我们更新了gitignore后&#xff0c;当我们想push文件的时候&#xff0c;我们声明的忽略文件还是会出现在push的目录中 原因 某些文件已经被纳入版本管理中&#xff0c;就算是在.gitignore中已经声明也不会起作用 解决方案 git rm -r --cach…

ubuntu 如何彻底卸载谷歌浏览器

卸载 在Ubuntu系统中彻底卸载谷歌浏览器&#xff08;Google Chrome&#xff09;可以通过命令行来完成。以下是卸载步骤&#xff1a; 首先&#xff0c;打开终端&#xff08;Terminal&#xff09;。 运行以下命令来停止正在运行的Chrome进程&#xff08;如果有的话&#xff09;…

Swagger3基本使用

Swagger 课程目标 Swagger简介【了解】 Springboot整合swagger【掌握】 Swagger 常用注解【掌握】 knife4j-Swagger【会用】 一、Swagger3简介 Swagger 是一系列 RESTful API 的工具&#xff0c;通过 Swagger 可以获得项目的⼀种交互式文档&#xff0c;客户端 SDK 的自 动…

[深度学习]卷积神经网络CNN

1 图像基础知识 import numpy as np import matplotlib.pyplot as plt # 图像数据 #imgnp.zeros((200,200,3)) imgnp.full((200,200,3),255) # 可视化 plt.imshow(img) plt.show() # 图像读取 imgplt.imread(img.jpg) plt.imshow(img) plt.show() 2 CNN概述 卷积层convrelu池…

商标名称注册查询,到底是查询什么!

在商标注册前是需要商标名称注册查询&#xff0c;那这个到底是查询什么&#xff0c;普推知产商标老杨发现&#xff0c;近日国家知产局发布《商标代理委托合同示范文本》征求意见稿&#xff0c;虽然是参考使用不具有强制性&#xff0c;里面对商标名称注册查询描述是申请前商标检…