Я создаю плеер для аудиокниг - когда вы открываете папку с файлом mp3, весь их список добавляется в плейлист и List View. И у меня есть ярлык, который должен показывать продолжительность всей книги. Но player->duration возвращает только продолжительность текущего трека, и если я прохожу цикл и делаю playlist->next() каждый шаг, player->duration возвращает 0. Я знаю о Phonon и метаданных файла, но мне нужно сделать это, не используя его.
Получить продолжительность объекта QMediaPlaylist
comment
Док говорит, что свойство duration может быть недоступно, когда начинается начальное воспроизведение, и предлагает подключить слот к сигналу durationChanged(qint64). qt-project.org/doc/qt-5/qmediaplayer. html#duration-prop
- person Murat Şeker   schedule 13.06.2014
Ответы (1)
Прилагаю исходный код рабочего проекта, можете использовать. Когда проигрыватель изменяет файл, продолжительность изменяется и распечатывается. Для зацикливания файлов необходимо дождаться завершения чтения медиафайла декодером. См. код ниже и комментарии.
Это mainwindow.cpp
#include "mainwindow.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
bool done =false;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
player = new QMediaPlayer(this);
playlist = new QMediaPlaylist(player);
playlist->setPlaybackMode(QMediaPlaylist::Sequential);
player->setPlaylist(playlist);
connect(player, &QMediaPlayer::durationChanged, this, &MainWindow::on_durationchanged);
//connect(player,&QMediaPlayer::)
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
playlist->addMedia(QUrl::fromLocalFile("Ar_today.mp3"));
playlist->addMedia(QUrl::fromLocalFile("Ar_sunday.mp3"));
playlist->setCurrentIndex(0); //set the first file
while (done == false) //wait till the duration is read
{
QApplication::processEvents();
}
done = false; playlist->setCurrentIndex(1); //change to the second file
while (done == false) //wait till the duration is read
{
QApplication::processEvents();
} //this way you can loop through files
player->setVolume(80);
player->play();
qDebug() << player->errorString();
}
void MainWindow::on_pushButton#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QDebug>
extern bool done;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_durationchanged(qint64 duration);
private:
Ui::MainWindow *ui;
QMediaPlayer* player;
QMediaPlaylist* playlist;
};
#endif // MAINWINDOW_H
clicked()
{
player->stop();
}
void MainWindow::on_durationchanged(qint64 duration)
{
done = true;
qDebug() << "duration = " << player->duration();
}
главное окно.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QDebug>
extern bool done;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_durationchanged(qint64 duration);
private:
Ui::MainWindow *ui;
QMediaPlayer* player;
QMediaPlaylist* playlist;
};
#endif // MAINWINDOW_H
В форме создайте 2 кнопки, одна из которых называется pushbutton для воспроизведения, а другая — pushButton_2 для остановки.
person
Drl Sherif Omran
schedule
27.04.2019