Extract media duration from metadata



  • Since duration is available only while media is playing, there is another way to retrieve the media duration? I'm creating a TableWidget to display all the files in the playlist, and beyond the filename would obtain the duration.

    Can you help me?


  • Moderators

    Hi! QAudioDecoder can do this for you.

    void MainWindow::on_pushButton_clicked()
    {
        QAudioDecoder *ad = new QAudioDecoder(this);
        ad->setSourceFilename("/home/user/file.mp3");
        connect(ad, &QAudioDecoder::durationChanged, this, &MainWindow::onDurationChanged);
        ad->start();
    }
    
    void MainWindow::onDurationChanged(qint64 d)
    {
        QTime t(0,0,0,0);
        t = t.addMSecs(d); 
        ui->label->setText( t.toString("hh:mm:ss") );
    }
    

    Edit: Removed code that deleted ad to early.



  • I have already tried the QAudioDecoder class, but Qt sends me this error:

    defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.audiodecode"


  • Moderators

    Depending on your platform, audio decoding might not be provided by the backend. See: http://wiki.qt.io/Qt_5.7_Multimedia_Backends#Audio_plugins



  • I'm running Qt 5.7 on Window 7. msvc2013 installed, but QAudioDecoder still not work



  • @UnitScan

    Hi.

    Do you want this?

    qlonglong duration = mediaPlayer->metaData("Duration");
    


  • @Devopia53

    void MainWindow::playerOnMediaStatusChanged(QMediaPlayer::MediaStatus status) {
        if (status == QMediaPlayer::BufferedMedia) {
            QVariant duration = player->metaData("Duration");
            qDebug() << duration.toLongLong();
        }
    }
    

    returns 0

    Yes, I know, there is player->duration(), but as I mentioned early works only for the current media



  • @UnitScan

    Yeah, you're right.
    However, it is possible resolved by using a few tricks.
    like this:

        auto    playlist = new QMediaPlaylist;
        playlist->addMedia(QUrl::fromLocalFile("/Sample/Music/1.mp3"));
        playlist->addMedia(QUrl::fromLocalFile("/Sample/Music/2.mp3"));
        playlist->addMedia(QUrl::fromLocalFile("/Sample/Music/3.mp3"));
        player->setPlaylist(playlist);
        playlist->setCurrentIndex(0);
        //player->play();
    
        static bool     isExtractMode = true;
        connect(player, &QMediaPlayer::mediaStatusChanged,
                [&, playlist](QMediaPlayer::MediaStatus status){
            if (isExtractMode) {
                if (status == QMediaPlayer::LoadedMedia) {
                    qDebug() << "Duration: " << player->metaData("Duration");
    
                    int     index = playlist->nextIndex();
                    if (index < 0) {
                        isExtractMode = false;
                        playlist->setCurrentIndex(0);
                    }
                    else
                        playlist->setCurrentIndex(index);
                }
            }
        });
    
    


  • [SOLVED]

    I had to resort to the help of TagLibs library. And since the documentation available how to build this library to make it interact with Qt are very confusing and outdated, I proceeded to make available the library that I managed, with great difficulty, to compile by my hand:

    http://www.unitscan.org/archives/301

    I hope will be usefull


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.