中文版《Qt5 Cadaques》

媒體播放(Playing Media)

在QML應用程序中,最基本的媒體應用是播放媒體。使用MediaPlayer元素可以完成它,如果源是一個圖片或者視頻,可以選擇結合VideoOutput元素。MediaPlayer元素有一個source屬性指向需要播放的媒體。當媒體源被綁定後,簡單的調用play函數就可以開始播放。

如果你想播放一個可視化的媒體,例如圖片或者視頻等,你需要配置一個VideoOutput元素。MediaPlayer播放通過source屬性與視頻輸出綁定。

在下面的例子中,給MediaPlayer元素一個視頻文件作為source。一個VideoOutput被創建和綁定到媒體播放器上。一旦主要部件完全初始化,例如在Component.onCompleted中,播放器的play函數被調用。

import QtQuick 2.0
import QtMultimedia 5.0
import QtSystemInfo 5.0

Item {
    width: 1024
    height: 600

    MediaPlayer {
        id: player
        source: "trailer_400p.ogg"
    }

    VideoOutput {
        anchors.fill: parent
        source: player
    }

    Component.onCompleted: {
        player.play();
    }

    ScreenSaver {
        screenSaverEnabled: false;
    }
}
// M1>>

除了上面介紹的視頻播放,這個例子也包括了一小段代碼用于禁止屏幕保護。這將阻止視頻被中斷。通過設置ScreenSaver元素的screenSaverEnabled屬性為false來完成。通過導入QtSystemInfo 5.0可以使用ScreenSaver元素。

基礎操作例如當播放媒體時可以通過MediaPlayer元素的volume屬性來控制音量。還有一些其它有用的屬性。例如,duration與position屬性可以用來創建一個進度條。如果seekable屬性為true,當撥動進度條時可以更新position屬性。下面這個例子展示了在上面的例子基礎上如何添加基礎播放。

    Rectangle {
        id: progressBar

        anchors.left: parent.left
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        anchors.margins: 100

        height: 30

        color: "lightGray"

        Rectangle {
            anchors.left: parent.left
            anchors.top: parent.top
            anchors.bottom: parent.bottom

            width: player.duration>0?parent.width*player.position/player.duration:0

            color: "darkGray"
        }

        MouseArea {
            anchors.fill: parent

            onClicked: {
                if (player.seekable)
                    player.position = player.duration * mouse.x/width;
            }
        }
    }

默認情況下position屬性每秒更新一次。這意味著進度條將只會在大跨度下的時間週期下才會更新,需要媒體持續時間足夠長,進度條像素足夠寬。然而,這個可以通過mediaObject屬性的notifyInterval屬性改變。它可以設置每個position之間更新的毫秒數,增加用戶界面的平滑度。

    Connections {
        target: player
        onMediaObjectChanged: {
            if (player.mediaObject)
                player.mediaObject.notifyInterval = 50;
        }
    }

當使用MediaPlayer創建一個媒體播放器時,最好使用status屬性來監聽播放器。這個屬性是一個枚舉,它枚舉了播放器可能出現的狀態,從MediaPlayer.Buffered到MediaPlayer.InvalidMedia。下面是這些狀態值的總結:

  • MediaPlayer.UnknownStatus - 未知狀態

  • MediaPlayer.NoMedia - 播放器沒有指定媒體資源,播放停止

  • MediaPlayer.Loading - 播放器正在加載媒體

  • MediaPlayer.Loaded - 媒體已經加載完畢,播放停止

  • MediaPlayer.Stalled - 加載媒體已經停止

  • MediaPlayer.Buffering - 媒體正在緩衝

  • MediaPlayer.Buffered - 媒體緩衝完成

  • MediaPlayer.EndOfMedia - 媒體播放完畢,播放停止

  • MediaPlayer.InvalidMedia - 無法播放媒體,播放停止

正如上面提到的這些枚舉項,播放狀態會隨著時間變化。調用play,pause或者stop將會切換狀態,但由于媒體的原因也會影響這些狀態。例如,媒體播放完畢,它將會無效,導致播放停止。當前的播放狀態可以使用playbackState屬性跟蹤。這個值可能是MediaPlayer.PlayingState,MediaPlayer.PasuedState或者MediaPlayer.StoppedState。

使用autoPlay屬性,MediaPlayer在source屬性改變時將會嘗試進入播放狀態。類似的屬性autoLoad將會導致播放器在source屬性改變時嘗試加載媒體。默認下autoLoad是被允許的。

當然也可以讓MediaPlayer循環播放一個媒體項。loops屬性控制source將會被重復播放多少次。設置屬性為MediaPlayer.Infinite將會導致不停的重播。非常適合持續的動畫或者一個重復的背景音樂。