SDL录制音频并播放

摘要:在ubuntu 20.04中使用QAudioInput、PortAduio、ffmpeg打开音频设备录制音频都显示失败,最后没办法选择了SDL2.0,SDL2.0录制音频十分方便,使用也非常简单。

疑问:不知道SDL是如何区分打开的设备是录制还是播放。(已解决,通过打开设备时设置iscapture参数的值,0表示录制,非0表示播放)

主要函数简介:

cpp 复制代码
SDL_Init(SDL_INIT_AUDIO)

此函数用于初始化音频。

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

设置音频数据的格式。

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

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

cpp 复制代码
SDL_QueueAudio(deviceIdO,stream,len);

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

cpp 复制代码
SDL_DequeueAudio(deviceIdO,stream,len);

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

cpp 复制代码
SDL_MixAudioFormat(stream, stream, AUDIO_S16SYS, len, 100);

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

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

cpp 复制代码
SDL_AudioDeviceID deviceIdO;//全局播放音频设备id
cpp 复制代码
//回调函数,用在音频录制
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);
}
cpp 复制代码
	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);
相关推荐
2601_965454239 小时前
做新闻视频没素材?AI按文稿语义自动配画面的工作流
音视频
AIsoft_868918 小时前
长时间音频内容如何快速整理?
音视频
FlightYe20 小时前
音视频修炼之容器与协议(一):MP4和MOV的box剖析
android·linux·c++·ffmpeg·音视频
智能直播20 小时前
RK3576 + NDI 框架:HX2 编码输出与 HX2/FULL介绍
音视频·实时音视频·视频编解码
TK泰妞1 天前
AI 带货视频工具怎么选?电商短视频创作者的实用评估指南
人工智能·音视频
EasyDSS1 天前
告别单一场景局限!一套视频会议/直播/点播/集群对讲EasyDSS音视频平台四大功能解析
音视频·媒体·easydss
龙腾-虎跃2 天前
基于 SIP 协议的自研电话终端:FreeSWITCH 语音与视频通信实战
android·音视频·freeswitch·sip协议终端·wertc
2601_965619692 天前
AI视频制作:财经数据可视化视频怎么做:AI 自动生成图表动画的实操流程
人工智能·nginx·音视频
2601_965619692 天前
历史解说视频怎么做:青铜器瓷器文物画面自动对齐的完整教程
运维·nginx·音视频
2601_965454232 天前
AI视频制作:券商研报怎么转口播视频:PDF 解读、配音和图表自动成片的方法
人工智能·pdf·音视频