音频的推流和封装与视频是类似的,主要在于录制和重采样部分。
QT再window的安装可以参考博客: vs2017 配置QT环境
主要是在创建QT项目的时候加入 multimedia库,利用这个库用来录制音频的。
QAudioFormat
这个类是用来设置录制音频的参数的,如下:
QAudioFormat fmt;
fmt.setSampleRate(sampleRate);// 采样率, 一秒采集音频样本数量,常设置为44100
fmt.setChannelCount(channels); // 音频通道数
fmt.setSampleSize(16); //一个音频数据大小
fmt.setCodec("audio/pcm"); //编码方式,大多声卡只支持pcm,也可以通过获取参数得到声卡支持参数
fmt.setByteOrder(QAudioFormat::LittleEndian); // 小端 存储还是大端存储
fmt.setSampleType(QAudioFormat::UnSignedInt); // 数据类型,对应的是16位
下图位大端存储和小端存储区别
QAudioDeviceInfo
音频设备信息,通产用来判断是否有音频设备。
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(fmt))// 判断是否支持配置
{
cout << "Audio format not support!" << endl;
fmt = info.nearestFormat(fmt);// 如果不支持,取最近的配置方法。
}
QAudioInput
QT自带的音频输入类,将上面设置的格式信息给它,完成音频输入设备初始化。
QAudioInput *input = new QAudioInput(fmt);
//开始录制音频
QIODevice *io = input->start();
//一次读取一帧音频 input->bytesReady() 表示是准备好了多少数据(不是很准确)
if (input->bytesReady() < readSize)
{
QThread::msleep(1);
continue;
}
QIODevice
输入QAudioInput 开始录音后返回的device,根据device来读取数据到 buffer
while (size != readSize)
{
int len = io->read(buf + size, readSize - size);
if (len < 0)break;
size += len;
}
完整demo实现了录制音频和rtmp推流操作。