Russian Qt Forum
Ноябрь 23, 2024, 08:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qml VideoPlayer под Android  (Прочитано 3886 раз)
qml_hello
Гость
« : Июль 15, 2014, 11:25 »

Проблемма в том, что при прикручивании всяких рюшечек (кнопочек, слайдера, файлового браузера) начинает сильно подвисать воспроизведение.  Соственно самые проблемы возникают при прикручивании слайдера.(можно конечно свой написать, но но интересно потестировать стандартные)
(Основная задача была попробовать написать приложение на чистом qml) Так вот основной вопрос: это я где то ошибаюсь или несовершенство qml?
Файловый браузер не пркладываю тк он работает стабильно.
Код:
main.qml
***
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtMultimedia 5.0
import QtQuick.Window 2.1

ApplicationWindow {
   id:win
   visibility:"FullScreen" 

Rectangle{
    anchors.fill: parent
    id:window
    color:"black"
    MediaPlayer {
        id: mediaPlayer
        autoLoad: true
        source: "/vidio/Pixar.mp4" //маленькое видио лежит в ресурсах
        //autoPlay: true
        onError: console.log(mediaPlayer.errorString)
    }

   VideoOutput{
        id: root
        anchors.fill:parent
        source: mediaPlayer
        fillMode: VideoOutput.PreserveAspectFit
    }
    Rectangle{
        width: parent.width/2
        height: parent.height/2
        anchors.centerIn: window
        opacity: 0.0
        MouseArea{
            anchors.fill:parent
            onClicked:{
                if(media_tool_bar.state=="open")
                {media_tool_bar.state="close"}
                else{
                media_tool_bar.state="open"}
            }
        }
    }

    MediaToolBar{
        id:media_tool_bar
        width: window.width
        z:2
        parentHeight: window.height

        anchors.bottom: window.bottom
        onSliderPush:  mediaPlayer.seek(media_tool_bar.slider_value)
        onPlayPush: {
           console.log(mediaPlayer.availability.toString())

           mediaPlayer.play()

        }
        onPausePush: {
            mediaPlayer.pause()
            //window.visibility="Maximized"

        }
        onFolderPush:{
            createFileDialog()
        }
    }

        Timer {
            id:timer
            interval: 1000; running: true; repeat: true
            onTriggered: {
                if( media_tool_bar.slider_maxValue!=mediaPlayer.duration)
                media_tool_bar.slider_maxValue=mediaPlayer.duration
                if(mediaPlayer.playbackState==MediaPlayer.PlayingState)
                media_tool_bar.slider_value=mediaPlayer.position
            }
        }
}
    function createFileDialog(){                                                                      //интересный способ создания динамического окна
        if(mediaPlayer.playbackState==MediaPlayer.PlayingState)
        mediaPlayer.pause()
        var object = Qt.createComponent("FileDs.qml").createObject(window, {"z":3, "width":window.width,"height":window.height});
        object.fileHasBeen.connect(fileChoosen)       // связывание сигнала и функции
    }
    function fileChoosen(pathh)
    {
        mediaPlayer.stop()
        mediaPlayer.source=pathh
        media_tool_bar.state="open"
    }
    function playingVideo()
    {
        mediaPlayer.play()
    }
}


***
MediaToolBar.qml

import QtQuick 2.0
import QtQuick.Controls 1.1
Rectangle {
    width: 400
    height: 60
    color: "#9e9fa2"
    id: main
    radius: 5
    property int parentHeight: 300
    property bool play_pressed:  false
    signal playPush()
    signal pausePush()
    signal folderPush()
    property alias slider_maxValue: slider.maximumValue
    property alias slider_value: slider.value
    signal sliderPush(real slider_value)
    Slider{           
            id:slider
            width: parent.width-folder.width-40
            anchors.left: parent.left
            anchors.leftMargin: 20
            height: parent.height
            opacity: 0.7
            z:4
            anchors.verticalCenter: parent.verticalCenter

            orientation: Qt.Horizontal
            minimumValue: 0         
            tickmarksEnabled : true           
            stepSize: 10
            onPressedChanged: main.sliderPush(slider.value)   // САМОЕ слабое место. В основной документации нет ни слова о //сигналах  у этого элемента.
    }


    Image{
        id:play
        source: "/image/play.png"
        width: main.height*2-10
        height: main.height*2-10
        anchors.top:parent.top
        anchors.topMargin: -parentHeight/2
        anchors.horizontalCenter: parent.horizontalCenter
        MouseArea{
            id: play_pause
            anchors.fill: parent
            z:1
            onClicked: {
                main.play_pressed=main.play_pressed==false?true:false
                if(main.play_pressed){
                    play.source="/image/pause.png"
                    main.state="close"
                    main.playPush()
                }
                else{
                     play.source="/image/play.png"
                    main.pausePush()
                    main.state="open"
                }
            }
        }
    }


    Image {
        id: folder
        width: main.height-3
        height: main.height-3
        anchors.verticalCenter: parent.verticalCenter
        anchors.right: parent.right
        anchors.rightMargin: 10
        source: "/image/open-14.png"
        MouseArea{
            z:1
            anchors.fill: parent
            onClicked:
                main.folderPush()
    }
    }
    states:[
        State {
            name: "open"
            PropertyChanges {
                target: main; height:60; opacity:0.4
                }
            PropertyChanges{
                target: slider; height:60; visible:true
            }
        },
        State {
            name: "close"
            PropertyChanges {
                 target: main; height:0; opacity:0.2

            }
            PropertyChanges {
                 target: slider; height:0; visible:false

            }
        }
    ]
    state: "open"
    transitions: [
        Transition {
            from: "open"
            to: "close"
            SequentialAnimation{
                PropertyAnimation{
                    target: main; properties: "opacity"; duration: 100
                    }

                PropertyAnimation{
                   target: slider; properties: "visible"; duration: 100
               }
                PropertyAnimation{
                    target: slider; properties: "height"; duration: 100
                }
                PropertyAnimation{
                    target: main; properties: "height"; duration: 100
                }

        }},
        Transition {
            from: "close"
            to: "open"
            SequentialAnimation{
                PropertyAnimation{
                    target: main; properties: "height"; duration: 10
                    }

                PropertyAnimation{
                    target: main; properties: "opacity"; duration: 10
                }
                PropertyAnimation{
                    target: slider; properties: "height"; duration: 1
                }
                PropertyAnimation{
                    target: slider; properties: "visible"; duration: 1
                }
            }
        }
    ]
}

Записан
qml_hello
Гость
« Ответ #1 : Июль 16, 2014, 17:15 »

ОК, другой вопрос как вы считает что  должно работать стабильнее
qt-project.org/doc/qt-5/qml-qtmultimedia-video.html
или
http://qt-project.org/doc/qt-5/qml-qtmultimedia-mediaplayer.html#details
 вот такая конструкция. По сути они почти одинаковы по функционалу.
Или всетаки проблемма в элементе слайдер?
http://qt-project.org/doc/qt-5/qml-qtquick-controls-slider.html#details
Меня лично смущает полное отсутствие сигналов в описании.
Но при этом на проверку получается найти onPressedChanged:
он получается единственный, способный сообщить о перетаскивании ползунка
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.