在QT应用程序中开始播放音频的最快方法是什么

时间:2018-01-09 12:10:33

标签: qt portaudio

我正在开发一个应用程序,其中我有一个代表一首歌的时间轴,我可以为它添加一些效果。通过移动效果,歌曲应该从特定时间开始播放。我尝试使用QMediaPlayer,这样会很好但是当我移动效果时,播放不会立即开始,这就是问题所在。只有很短的延迟,但在这种情况下这是一个问题。我试图寻找答案,我发现了一些关于低延迟音频的话题。我试图实现Portaudio,但我很遗憾使用它,即使我不知道这是否有帮助。

有人可以给我一些建议我应该使用什么或者我应该关注什么?

谢谢。

TimelineWidget::TimelineWidget(QWidget *parent) : QWidget(parent)
{

    m_mediaPlayer = new QMediaPlayer(NULL, QMediaPlayer::LowLatency);
    m_mediaPlayer->setMedia(QUrl::fromLocalFile("/Users/simonvaros/Desktop/hudba.wav"));
    m_effect = QRect(0, 0, 100, height());
    m_grab = false;
    m_effectWidth = m_effect.width();
    m_dif = 0;
    m_pos = 0;
    m_lastTime = QTime::currentTime();

}

void TimelineWidget::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);

    QPainter p (this);
    QPen pen = QPen();

    QRect outline = QRect(0, 0, width() - 1, height() - 1);
    p.setPen(pen);
    p.setBrush(QBrush(QColor("white")));
    p.drawRect(outline);
    p.setBrush(QBrush(QColor("red")));
    p.drawRect(m_effect);
}

void TimelineWidget::mouseReleaseEvent(QMouseEvent *event)
{
    QWidget::mouseReleaseEvent(event);

    m_grab = false;
}

void TimelineWidget::mousePressEvent(QMouseEvent *event)
{
    QWidget::mousePressEvent(event);

    int pos = event->pos().x();

    if (pos > m_effect.x() && pos < m_effect.x() + m_effect.width())
    {
        m_grab = true;
        m_dif = pos - m_effect.x();
    }
}

void TimelineWidget::mouseMoveEvent(QMouseEvent *event)
{
    QWidget::mouseMoveEvent(event);

    if (m_grab)
    {
        m_pos = event->pos().x();
        m_effect.setX(m_pos - m_dif);

        m_mediaPlayer->setPosition((double)(m_pos / width()) * m_mediaPlayer->duration());
        m_mediaPlayer->play();

        m_effect.setWidth(m_effectWidth);
    }

    repaint();

}


#include <QWidget>
#include <QMediaPlayer>


class TimelineWidget : public QWidget
{
    Q_OBJECT
public:
    explicit TimelineWidget(QWidget *parent = nullptr);

private:
    void paintEvent(QPaintEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);



    QMediaPlayer *m_mediaPlayer;
    QRect m_effect;
    bool m_grab;
    int m_effectWidth;
    int m_dif;
    double m_pos;


signals:

public slots:

};

1 个答案:

答案 0 :(得分:1)

首先,使用&#34; LowLatency&#34;调用QMediaPlayer不适用于音乐,它仅适用于哔哔声,铃声......这在QT文档中有说明。

  

QMediaPlayer :: LowLatency | 0x01 |预计玩家将被使用   使用简单的音频格式,但播放应该从没有开始   显着延迟。这种播放服务可用于发出哔哔声,   铃声等。

因此您需要使用QMediaPlayer::StreamPlayback

进行实例化

以下是如何从缓冲区调用QMediaPlayer的代码示例:

    player =  new QMediaPlayer(this, QMediaPlayer::StreamPlayback);
    QFile file("/Users/simonvaros/Desktop/hudba.wav");
    file.open(QIODevice::ReadOnly);
    QByteArray *ba = new QByteArray();
    ba->append(file.readAll());
    QBuffer *buffer = new QBuffer(ba);
    buffer->open(QIODevice::ReadOnly);
    buffer->reset();  // same as buffer.seek(0);
    qDebug() << "Buffer size:" << buffer->size(); // is the file loaded
    player->setMedia(QMediaContent(), buffer);
    player->play();