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



我正在开发一个应用程序,其中我有一个代表歌曲的时间线,我可以给它一些效果。通过移动效果,歌曲应该从特定时间开始播放。我尝试使用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:
};

首先,使用"低延迟"调用QMediaPlayer,不是为了音乐,它只是为了哔哔声,铃声......这在QT文档中有说明。

QMedia播放器::低延迟 | 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();

相关内容

最新更新