Продолжительность QtMediaPlayer всегда равна 0 - PullRequest
0 голосов
/ 10 июля 2020

Я использую ubuntu 20.04, использую Qt 5.14. QtMdeiaPlayer duration всегда возвращает 0. В документации указано, что вызов SetMedia не блокируется, поэтому продолжительность будет равна нулю сразу после вызова, но я подключил сигнал, как указано в документации.

connect(player, &QMediaPlayer::durationChanged, this, [&](qint64 dur) {
    qDebug() << "duration = " << dur;
});

Эта лямбда никогда не вызывается . Кроме того, звук воспроизводится нормально, а сигнал для positionChanged работает должным образом. Я протестировал несколько аудиофайлов разных форматов и результат одинаковый. Есть идеи, почему это могло произойти?

- изменить - Минимальный код для воспроизведения

// somewhere
static QMediaPlayer *player = new QMediaPlayer;

static void DurationChanged(quint64 duration) {
  qDebug() << "durration " << duration;
}

static void PositionChaned(quint64 position) {
  qDebug() << "position" << position << "duration" << player->duration();
}

// in main
auto path = QUrl::fromLocalFile(QFileInfo("sample.mp3").absoluteFilePath());

QObject::connect(player, &QMediaPlayer::durationChanged, DurationChanged);
QObject::connect(player, &QMediaPlayer::positionChanged, PositionChaned);
player->setMedia(path);
player->play();

// my output
// position 0 duration 0
// position 1032 duration 0
// position 2083 duration 0

1 Ответ

0 голосов
/ 10 июля 2020

Я использовал ubuntu 20.04 docker и получаю продолжительность звука:

#include <QtMultimedia>

static void DurationChanged(quint64 duration) {
  qDebug() << "duration " << duration;
}

static void PositionChaned(quint64 position) {
  qDebug() << "position" << position;
}

int main(int argc, char *argv[])
{
    QGuiApplication a(argc, argv);
    // in main
    QDir dir_path = QCoreApplication::applicationDirPath();
    auto path = dir_path.filePath("sample.mp3");
    auto url = QUrl::fromLocalFile(path);

    QMediaPlayer player;
    QObject::connect(&player, &QMediaPlayer::durationChanged, DurationChanged);
    QObject::connect(&player, &QMediaPlayer::positionChanged, PositionChaned);
    player.setMedia(url);
    player.play();
    return a.exec();
}

Вывод:

position 0
position 0
position 9
duration  26000
position 987
position 1945
position 2883
position 3821
position 4789
position 5786
position 6784
position 7792
position 8790
position 9797
position 10775
position 11783
position 12780
position 13788
position 14786
position 15794
position 16791
position 17799
position 18797
position 19804
position 20782
position 21790
position 22788
position 23795
position 24793
position 25801
position 26000

Чтобы звуковой плагин работал, установите следующее пакеты:

sudo apt-get install -y --no-install-recommends \
    libgstreamer1.0-0 \
    gstreamer1.0-plugins-base \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    gstreamer1.0-doc \
    gstreamer1.0-tools \
    libpulse-mainloop-glib0 \
    alsa-base \
    alsa-utils \
    pulseaudio
...