Получить продолжительность объекта QMediaPlaylist

Я создаю плеер для аудиокниг - когда вы открываете папку с файлом mp3, весь их список добавляется в плейлист и List View. И у меня есть ярлык, который должен показывать продолжительность всей книги. Но player->duration возвращает только продолжительность текущего трека, и если я прохожу цикл и делаю playlist->next() каждый шаг, player->duration возвращает 0. Я знаю о Phonon и метаданных файла, но мне нужно сделать это, не используя его.


person user3735580    schedule 12.06.2014    source источник
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