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