3

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

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

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++ 调用。它按预期开始播放。但是,一旦完成,帧就会冻结在最后一个帧上。我尝试通过在 QTimer 中调用 loopVideo 函数来循环它。那也不行。

我可能做错了什么?

4

2 回答 2

1

你的代码没问题。(小提示:你可能想用循环MediaPlayer.Infinite代替)100

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

我玩过一些MediaPlayer组件,最后我无法寻找视频,因为seekable总是false. 并且seekablefalse因为 QML 以某种方式使用我的文件作为实时流,并且结果duration属性为0. 另请注意,onPaused并且onStopped永远不会触发,并且position在视频结束后只会增加(直播永远不会结束)。

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

我发现的一个讨厌的解决方法是(附加到您的代码中):

Rectangle {
    id: root
    //...

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

VIDEO_LENGTH您的视频文件的长度在哪里,以毫秒为单位。

单击此处获取 MediaPlayer 元素文档

更新: 看起来这是 mingw 版本的 Qt 中的错误(已关闭错误报告)。


更新 2:我已经下载了 Qt 的 MSVC 版本,并且媒体播放器按预期工作。

所以这是 mingw 在 Qt 中的错误

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

我在这里创建了新的错误报告。

于 2014-12-16T14:48:58.487 回答
0

使用停止的信号试试这个代码:

 MediaPlayer {
     id: mediaplayer
     source: "groovy_video.mp4"
     onStopped: play()
}
于 2016-10-06T07:13:28.840 回答