Qt-》QAudioOutput play 播放wav文件

Qt音频播放教程:简单且高效的方法
本文介绍如何使用Qt库轻松实现音频播放功能,相比DirectXShow,Qt提供了更简便的API和更高的易用性。通过示例代码演示了文件读取、音频格式设置及播放流程,特别注意了在不同情况下选择合适的`setSampleSize()`参数以避免音频播放问题。
         用Qt写音频比directxShow方便多了,很好用,初级文章,供大家学习路上少分困难,多份轻松。
#include <QFile>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QSound>

int main()
{
  QFile inputFile;
  inputFile.setFileName("/home/alex/Music/noh.wav");
  inputFile.open(QIODevice::ReadOnly);

  QAudioFormat format;
  format.setFrequency(8000);
  format.setChannels(1);
  format.setSampleSize(8);
  format.setCodec("audio/pcm");
  format.setByteOrder(QAudioFormat::LittleEndian);
  format.setSampleType(QAudioFormat::UnSignedInt);
  QAudioOutput *audio = new QAudioOutput( format, 0);
  audio->start(&inputFile);
  return 0;
}

       setSampleSize() 根据文档,有8 和 16的区别,曾经使用16,导致音频播放出现问题,8就没问题,是拿来别人的外文文章,算是翻译吧。。偷笑

 

 

 

        ref:http://www.qtforum.org/article/34054/should-this-play-a-sound-file-qaudiooutput.html

<think>我们被要求回答:使用Qt循环播放wav音频文件的方法。 根据引用[3]和引用[4],我们可以使用QSoundEffect或QSound来播放WAV文件。 引用[3]提到QSoundEffect类适合播放低延迟的声音效果,并且可以设置循环次数(包括无限循环)。 引用[4]和引用[5]提到QSound类也可以播放WAV文件,但QSound的循环播放功能可能有限(根据Qt文档,QSound在Qt5中支持有限次数的循环,但不如QSoundEffect灵活)。 因此,我们有两种方法: 方法1:使用QSoundEffect(推荐,因为可以设置无限循环) 方法2:使用QSound(但循环次数有限,且可能不如QSoundEffect灵活) 下面分别介绍两种方法: 方法1:使用QSoundEffect循环播放WAV文件 步骤: 1. 包含头文件:<QSoundEffect> 2. 创建QSoundEffect对象 3. 设置音频源(使用setSource,传入QUrl) 4. 设置循环次数(setLoopCount,如果要无限循环,使用QSoundEffect::Infinite) 5. 设置音量(可选) 6. 调用play()播放 示例代码: ```cpp #include <QSoundEffect> #include <QUrl> // 在某个类中定义QSoundEffect成员,避免局部变量被销毁 QSoundEffect *effect = new QSoundEffect(this); effect->setSource(QUrl::fromLocalFile("path/to/your/sound.wav")); // 或者使用资源文件路径,如":/sounds/sound.wav" effect->setLoopCount(QSoundEffect::Infinite); // 无限循环 effect->setVolume(0.5f); // 设置音量(0.0~1.0) effect->play(); ``` 注意:如果使用资源文件,路径格式为":/prefix/path/file.wav" 方法2:使用QSound循环播放(但QSound在Qt5中只支持有限次数的循环,且不能无限循环) 根据引用[4]和[5],QSound的循环播放功能有限,通常使用play()只能播放一次,但是QSound有一个play()的重载可以指定循环次数,但最大次数有限(而且不能无限循环)。 示例代码(播放一次): ```cpp #include <QSound> QSound::play("path/to/sound.wav"); // 播放一次 ``` 如果要循环多次,可以使用: ```cpp QSound *sound = new QSound("path/to/sound.wav", this); sound->play(); // 默认播放一次,但可以通过设置循环次数(但QSound没有提供无限循环的方法) ``` 实际上,在Qt5中,QSound的循环功能是通过play()的一个重载实现的,但该重载已被标记为过时,而且它只允许指定整数次循环,不能无限循环。因此,对于无限循环,我们推荐使用QSoundEffect。 总结:在Qt中实现循环播放WAV文件,特别是无限循环,使用QSoundEffect类更合适。 注意:QSoundEffect需要Qt Multimedia模块的支持,因此需要在项目文件(.pro)中添加: QT += multimedia 而QSound在QtGui模块中,不需要额外添加。 因此,根据需求,我们选择QSoundEffect。 相关问题: 1. 如何停止QSoundEffect的循环播放? 调用stop()方法:effect->stop(); 2. 如何改变播放的音量? 使用setVolume(float volume),范围0.0(静音)到1.0(最大)。 3. 使用QSoundEffect播放时出现错误怎么办? 可以连接QSoundEffect的statusChanged信号,检查状态是否为QSoundEffect::Error,然后通过errorString()获取错误信息。 引用说明: 引用[3]提到QSoundEffect适合播放低延迟声音,并且可以设置循环次数和音量,因此我们推荐使用[^3]。 另外,引用[4]和[5]提到QSound的播放方式,但无法满足无限循环的需求[^4][^5]。 因此,我们提供QSoundEffect的实现方法。 注意:在Linux系统上,需要确保音频设备可用(通过QSoundEffect::isAvailable()检查)[^5]。</think>### Qt循环播放WAV音频文件的实现方法 在Qt中实现WAV音频文件的循环播放,推荐使用`QSoundEffect`类(低延迟播放)或`QMediaPlayer`类(功能更全面)。以下是两种方法的详细实现: --- #### 方法1:使用**QSoundEffect**(低延迟播放) 适用于需要快速响应的场景(如游戏音效),支持精确控制循环次数: ```cpp #include <QSoundEffect> #include <QUrl> // 创建音效对象(建议作为类成员,避免局部变量被销毁) QSoundEffect *effect = new QSoundEffect(this); // 设置音频源(支持本地文件或资源路径) effect->setSource(QUrl::fromLocalFile(":/sounds/audio.wav")); // 资源文件路径 // effect->setSource(QUrl::fromLocalFile("/absolute/path/audio.wav")); // 绝对路径 // 设置无限循环 effect->setLoopCount(QSoundEffect::Infinite); // 关键参数:无限循环 // 设置音量(0.0~1.0) effect->setVolume(0.8f); // 开始播放 effect->play(); // 停止播放:effect->stop(); ``` **注意事项**: 1. 仅支持未压缩的WAV格式(PCM编码)[^3] 2. 需在项目文件(.pro)中添加:`QT += multimedia` 3. 通过`QSoundEffect::isAvailable()`检查音频设备是否可用[^5] --- #### 方法2:使用**QMediaPlayer**(功能更全面) 适用于需要格式兼容性或高级控制的场景: ```cpp #include <QMediaPlayer> #include <QAudioOutput> // 创建播放器和音频输出 QMediaPlayer *player = new QMediaPlayer(this); QAudioOutput *audioOutput = new QAudioOutput(this); // 关联音频输出 player->setAudioOutput(audioOutput); // 设置循环播放(关键参数) player->setLoops(QMediaPlayer::Infinite); // 无限循环 // 设置音频源 player->setSource(QUrl::fromLocalFile(":/sounds/audio.wav")); // 设置音量(0~100) audioOutput->setVolume(80); // 开始播放 player->play(); // 停止播放player->stop(); ``` **优势**: 1. 支持更多音频格式(MP3、AAC等) 2. 提供播放进度、元数据等扩展功能 3. 资源占用更灵活[^3] --- ### 关键问题解决 1. **播放失败/杂音问题** - 确认WAV为**未压缩的PCM格式**(16位/44.1kHz推荐) - 检查采样率/通道数设置是否匹配文件(参考引用[2])[^2] - 避免使用损坏的WAV文件(可用音频工具验证) 2. **资源文件路径格式** ```cpp ":/prefix/subdir/file.wav" // 资源系统路径 ``` 3. **跨平台注意事项** - Linux需安装`gstreamer`插件库 - Windows/macOS默认支持 --- ### 相关问题 1. 如何实现WAV和MP3格式的自动切换播放? 2. Qt中如何动态调整音频播放速度? 3. 如何解决QMediaPlayer在Linux平台的播放延迟问题? 4. 音频播放时如何同步显示频谱可视化效果? > 引用说明: > 低延迟播放推荐QSoundEffect[^3],格式兼容性推荐QMediaPlayer[^3],WAV参数设置注意事项见引用[2][^2]。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值