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