Невозможно зациклить видео с помощью 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()
}