Невозможно зациклить видео с помощью QML MediaPlayer

Я пытаюсь создать простой видеопроигрыватель, который просто воспроизводит указанное видео в цикле. Пока видео воспроизводится как положено, оно не зацикливается.

Вот код, который я использую:

import QtQuick 2.0

import QtMultimedia 5.0

Rectangle
{
    width : 320
    height : 240

    signal buttonPressed(string msg)

    property string currentVideo

    function playVideo(videoName)
    {
        currentVideo = videoName
        videoPlayer.source = videoName
        videoPlayer.seek(1)
        videoPlayer.play()    
    }

    function loopVideo()
    {
        if(videoPlayer.duration === 0)
        {
            playVideo(currentVideo)
        }
    }

    function stopVideoPlayback()
    {
        videoPlayer.stop()  
    }

    MediaPlayer {
        id: videoPlayer
        source: ""
        autoPlay: false
        autoLoad: false
        loops: 100
    }

    VideoOutput {
        id: videoOutput
        source: videoPlayer
        anchors.fill: parent
        visible: true
    }
}

Я звоню playVideo из C++. Он начинает играть, как ожидалось. Однако, как только он завершается, кадр останавливается на последнем. Я попытался зациклить его, вызвав функцию loopVideo в QTimer. Это тоже не работает.

Что я могу делать не так?

2 ответа

Ваш код в порядке. (небольшой совет: вы можете использовать MediaPlayer.Infinite вместо 100 для зацикливания)

Я считаю, что ваша ситуация такая же, как у меня.

Я немного поиграл с MediaPlayer компонент, и в конце концов я не могу искать видео, потому что seekable всегда false, А также seekable является false потому что каким-то образом QML использует мой файл в качестве живого потока, и это приводит к duration свойство быть 0, Также обратите внимание, что onPaused а также onStopped никогда не запускаются и position только увеличивается после окончания видео (прямой эфир никогда не заканчивается).

Теперь я думаю, что это связано с циклом, потому что в основном цикл стремится к 0. Потому что нет duration (MediaPlayer думает, что это живой эфир) он не может искать (и цикл).

Один неприятный обходной путь, который я нашел, - это (добавьте к своему коду):

Rectangle {
    id: root
    //...

    MediaPlayer {
        //...
        onPositionChanged: {
            if (position > VIDEO_LENGTH) {
                root.stopVideoPlayback()
                root.playVideo(root.currentVideo)
            }
        }
    }
}

куда VIDEO_LENGTH длина вашего видеофайла в миллисекундах.

Нажмите здесь для просмотра документации по элементам MediaPlayer

ОБНОВЛЕНИЕ: похоже, что это ошибка в Qt для версии mingw (закрытый отчет об ошибках).


ОБНОВЛЕНИЕ 2: Я скачал версию Qt для MSVC, и медиаплеер работает как положено.

Так что это ошибка в Qt для mingw.

Или используйте этот обходной путь (который я не рекомендовал бы) или загрузите версию MSVC.

Я создал новый отчет об ошибке здесь.

Используя остановленный сигнал, попробуйте этот код:

 MediaPlayer {
     id: mediaplayer
     source: "groovy_video.mp4"
     onStopped: play()
}
Другие вопросы по тегам