获取QMediaPlaylist对象的持续时间

问题描述 投票:2回答:1

我为有声读物创建了一个播放器 - 当你用mp3文件打开一个文件夹时,它们的整个列表被添加到播放列表和列表视图中。我有一个标签,它假设显示整本书的持续时间。但是player-> duration只返回当前曲目的持续时间,如果我经历循环并且每一步都执行播放列表 - > next(),则player-> duration返回0.我知道Phonon和文件元数据,但我需要这样做而不使用它。

qt playlist duration qmediaplayer
1个回答
0
投票

我附上了一个工作项目的源代码,你可以使用。当玩家更改文件时,持续时间会更改并打印出来。要在文件中循环,需要等到解码器完成读取媒体文件。请参阅下面的代码和评论。

这是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_2_clicked()
{
    player->stop();
}

void MainWindow::on_durationchanged(qint64 duration)
{
    done = true;
    qDebug() << "duration = " << player->duration();
}

mainwindow.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

In the form, create 2 buttons, one called pushbutton to play and the other is pushButton_2 to stop

© www.soinside.com 2019 - 2024. All rights reserved.