目录一、前言二、效果图三、体验地址四、相关代码五、功能特点5.1 基础功能5.2 特色功能5.3 视频控件5.4 音频组件一、前言 以前一直以为只有Qt5以后才有QAudioOutp
以前一直以为只有Qt5以后才有QAudioOutput播放音频,其实从Qt4.6开始就有,在Qt6中变成了QAudiOSink,功能一样。用QAudioOutput播放音频pcm数据极其方便,只需要指定音频播放设备(可能电脑上有多个音频输出设备),设置音频数据格式(采样率、通道数量、比特率等)。当FFmpeg采集到音频数据后,就是原始的pcm格式数据,直接发给QAudioOutput播放就行,这样就不需要sdl,sdl可以很方便的用来播放音视频,但是和Qt结合显示不大方便,嵌入到Qt界面中比较繁琐,所以最后采用的策略是视频用qopenglwidget或者painter绘制,音频用qaudiooutput播放,这样就只需要依赖ffmpeg即可,打完收工完美。
国内站点:https://gitee.com/feiyangqingyun
国际站点:Https://GitHub.com/feiyangqingyun
体验地址:https://pan.baidu.com/s/1YOVD8nkoOSYwX9KgSauLeQ 提取码:kcgz 文件名:bin_video_demo/bin_linux_video。
void AudioPlayer::openAudioInput(int sampleRate, int channelCount, int sampleSize)
{
this->openAudioInput("", sampleRate, channelCount, sampleSize);
}
void AudioPlayer::openAudioInput(const QString &deviceName, int sampleRate, int channelCount, int sampleSize)
{
#ifdef multimedia
//先关闭设备
this->closeAudioInput();
//初始化音频格式
QAudioFORMat format;
AudioHelper::initAudioFormat(format, sampleRate, channelCount, sampleSize);
//找到指定设备并实例化音频类(为空则采用默认设备)
if (deviceName.isEmpty()) {
audioInput = new QAudioInputx(format, this);
} else {
QAudioDevice device = AudioHelper::getAudioDevice(deviceName, true);
audioInput = new QAudioInputx(device, format, this);
}
//启动音频服务
deviceInput = audioInput->start();
//将音频输入设备的数据读取出来
if (deviceInput) {
connect(deviceInput, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
#endif
}
void AudioPlayer::closeAudioInput()
{
#ifdef multimedia
if (audioInput) {
audioInput->deleteLater();
audioInput = NULL;
}
#endif
}
void AudioPlayer::openAudioOutput(int sampleRate, int channelCount, int sampleSize)
{
this->openAudioOutput("", sampleRate, channelCount, sampleSize);
}
void AudioPlayer::openAudioOutput(const QString &deviceName, int sampleRate, int channelCount, int sampleSize)
{
#ifdef multimedia
//先关闭设备
this->closeAudioOutput();
//初始化音频格式
QAudioFormat format;
AudioHelper::initAudioFormat(format, sampleRate, channelCount, sampleSize);
//找到指定设备并实例化音频类(为空则采用默认设备)
if (deviceName.isEmpty()) {
audioOutput = new QAudioOutputx(format, this);
} else {
QAudioDevice device = AudioHelper::getAudioDevice(deviceName, false);
audioOutput = new QAudioOutputx(device, format, this);
}
//启动音频服务
deviceOutput = audioOutput->start();
#endif
}
void AudioPlayer::closeAudioOutput()
{
#ifdef multimedia
muted = false;
if (audioOutput) {
audioOutput->deleteLater();
audioOutput = NULL;
}
#endif
}
void AudioPlayer::playAudioData(const char *data, qint64 len)
{
#ifdef multimedia
if (deviceOutput) {
emit receiveOutputData(data, len);
//限定静音状态下不写入数据减轻压力
if (!muted) {
deviceOutput->write(data, len);
}
//获取音频数据振幅
if (audioLevel) {
qreal leftLevel, rightLevel;
AudioHelper::getAudioLevel(audioOutput->format(), data, len, leftLevel, rightLevel);
emit receiveLevel(leftLevel, rightLevel);
}
}
#endif
}
以上就是Qt音视频开发之音频播放QAudioOutput的实现的详细内容,更多关于Qt音频播放QAudioOutput的资料请关注编程网其它相关文章!
--结束END--
本文标题: Qt音视频开发之音频播放QAudioOutput的实现
本文链接: https://www.lsjlt.com/news/199262.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0