无法使用QML MediaPlayer循环播放视频

时间:2014-11-28 06:46:10

标签: qt qml qtmultimedia

我正在尝试创建一个只在循环播放指定视频的简单视频播放器。虽然视频按预期播放,但它不会循环播放。

以下是我正在使用的代码:

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
    }
}

我从C ++中调用playVideo。它按预期开始播放。但是,一旦完成,框架就会冻结在最后一个框架上。我尝试通过在QTimer中调用loopVideo函数来循环它。这也不起作用。

我可能做错了什么?

2 个答案:

答案 0 :(得分:1)

您的代码没问题。(小提示:您可能希望使用MediaPlayer.Infinite代替100进行循环)

我相信你的情况和我一样。

我使用MediaPlayer组件玩了一点,但最终我无法搜索视频,因为seekable始终是falseseekablefalse,因为不知何故,QML将我的文件用作实时流,结果duration属性为0。 另请注意,onPausedonStopped永远不会被触发,position只是在视频结束后才会增加(实时流不会结束)。

现在我认为这与循环有关,因为基本上循环搜索回到0.因为没有durationMediaPlayer认为它是实时流)它不能寻找(和循环)。

我找到的一个讨厌的解决方法就是这个(附加到你的代码中):

Rectangle {
    id: root
    //...

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

VIDEO_LENGTH是视频文件的长度(以毫秒为单位)。

Click here for MediaPlayer element documentation

<强>更新 It looks like that is bug in Qt for mingw version (closed bug report).


更新2:我已经下载了Qt的MSVC版本,媒体播放器正常运行。

所以这是mtw中的错误

使用此解决方法(我不建议)或下载MSVC版本

I have created new bug report here.

答案 1 :(得分:0)

使用停止信号尝试以下代码:

 MediaPlayer {
     id: mediaplayer
     source: "groovy_video.mp4"
     onStopped: play()
}