[Qt] 使用 QMediaPlayer 从QIODevice 播放音频偶尔崩溃的问题

使用QMediaPlayer播放即时生成的wav文件,为了方便与性能,直接保存在内存中播放。

    QMediaPlayer player;
    QBuffer buff;
    buff.setData(QByteArray());   // fill buffer
    buff.open(QIODevice::ReadOnly);
    player.setMedia(QMediaContent(), &buff);
    player.play();

播放有时会崩溃,时而发生,时而正常。网上找了一圈也没能找到根源。然后在文档上发现了一句话:

Note: This function returns immediately after recording the specified source of the media. It does not wait for the media to finish loading and does not check for errors. Listen for the mediaStatusChanged() and error() signals to be notified when the media is loaded and when an error occurs during loading.

原来setMedia 立即返回,不会等待媒体加载完毕。崩溃的原因应该就是有时加载快,完成了播放正常,有时加载慢未完成,播放就崩溃。
改用监听 mediaStatusChanged() 信号来播放,果然不在崩溃了。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    ...
    connect(player, &QMediaPlayer::mediaStatusChanged, this, &MainWindow::startToPlay);
}

void MainWindow::loadWaveBuffer()
{
    QBuffer buff;
    buff.setData(...);   // fill buffer
    buff.open(QIODevice::ReadOnly);
    player.setMedia(QMediaContent(), &buff);
}

void MainWindow::startToPlay(QMediaPlayer::MediaStatus status)
{
    if(status == QMediaPlayer::LoadedMedia)
        player.play();
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 关于QT实时播放音频流的技术,可以使用QT的Multimedia模块来实现。你可以使用QMediaPlayer类来播放音频流,可以通过设置QMediaPlayerMedia源为音频流的URL来实现。此外,你还可以使用QT的QAudioInput和QAudioOutput类来录制和播放音频流。这些类提供了一些方法来处理音频数据,如设置音频格式、读取和写入音频数据等。因此,使用这些类可以很方便地实现QT实时播放音频流的功能。 ### 回答2: QT实时播放音频流的技术是指利用QT框架的相关功能和库来实现实时播放音频流的功能。在QT中,可以使用QAudioOutput类来进行音频流的播放。 首先,需先创建一个QIODevice对象,并将其传递给QAudioOutput实例,以便进行数据的写入和播放。可以使用QT的QBuffer类来创建一个可读写的数据缓冲区,然后将数据写入缓冲区。 接下来,需设置QAudioFormat对象,用于描述音频流的参数,包括采样率、声道数、采样位数等。通过设置QIODevice的打开模式和格式,可以实现音频流的读取和写入。 然后,创建QAudioOutput实例,并将之前创建的QIODevice对象传递给它。可以设置音频输出设备的参数,如音量、音频编码等。 最后,通过调用QAudioOutput的start()函数,开始音频流的播放,同时将数据数据写入QIODevice对象,并且可以通过QAudioOutput的stateChanged信号来获取音频流的播放状态。 在接收到音频流数据时,可以通过读取音频数据并写入到QIODevice对象中实现实时播放。当音频流结束时,可以调用QAudioOutput的stop()函数来停止播放,同时进行资源释放。 总之,通过使用QT的QAudioOutput类和相关的功能,我们可以很方便地实现QT实时播放音频流的技术。 ### 回答3: QT是一种跨平台的应用程序开发框架,可以用于开发各种类型的应用程序,包括音频播放应用。QT提供了一些实时播放音频流的技术,下面我将详细介绍一些常用的技术。 首先,QT提供了一个音频处理类QAudioOutput,它允许从音频流中读取数据并将其通过音频设备实时播放。开发者可以通过QAudioOutput的相关接口设置音频流的格式、采样率和声道等参数,并通过write()函数将音频数据写入缓冲区,在音频设备准备好播放时,QAudioOutput会自动从缓冲区中读取数据并实时播放。 其次,QT还提供了一个音频采集类QAudioInput,它可以实时从音频设备中采集音频数据。开发者可以通过QAudioInput的相关接口设置音频数据的格式、采样率和声道等参数,并通过start()函数开始采集音频数据。采集到的音频数据可以通过read()函数读取,并进行后续处理或实时播放。 此外,QT还支持使用QMediaPlayer类实时播放音频流。QMediaPlayer是一个高级的多媒体播放器类,可以播放各种类型的音频和视频文件。开发者可以通过设置音频流的URL或本地文件路径来播放音频流。QMediaPlayer提供了一些常用的接口,如play()、pause()和stop()等,可以对音频进行控制。 总之,QT提供了丰富的实时播放音频流的技术,开发者可以根据自己的需求选择合适的技术进行音频流的处理和播放。无论是使用QAudioOutput、QAudioInput还是QMediaPlayerQT都提供了简洁易用的接口,方便开发者进行音频应用的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值