알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

비디오 위젯 예제 분석 데이터의 흐름을 파악(1) 본문

QT/Qt Multimedia 공부하기

비디오 위젯 예제 분석 데이터의 흐름을 파악(1)

백곳 2017. 9. 16. 11:38

비디오 위젯 예제 다운로드


Qt 설치시에 소스 파일을 설치 하게 되거나 


http://download.qt.io/official_releases/qt/5.7/5.7.0/submodules/ 의 공식 Qt 배포 사이트에 가면 

qtmultimedia-opensource-src-5.7.0.zip 가 존재 합니다. 


해상 소스에는 qtmultimedia 소스와 예제 소스가 들어 있습니다. 


온라인 설치 파일로 설치 했을때에는 



체크를 하면 소스가 5.7 폴더 안에 설치가 됩니다. 


qtmultimedia\examples\multimediawidgets\customvideosurface\customvideowidget 의 예제 에서 


시작 하려고 합니다. 


customvideowidget.pro 파일을 Qtcreater 에서 열어서 실행 시켜 주시면 됩니다. 


처음에 paly()가 어디에서 데이터를 어떻게 가져오는지를 분석 하고자 합니다. 


먼저 


videioplayer.h

class VideoPlayer : public QWidget
{
    Q_OBJECT

public:
    VideoPlayer(QWidget *parent = 0);
    ~VideoPlayer();

public slots:
    void openFile();
    void play();

private slots:
    void mediaStateChanged(QMediaPlayer::State state);
    void positionChanged(qint64 position);
    void durationChanged(qint64 duration);
    void setPosition(int position);

private:
    QMediaPlayer mediaPlayer;
    QAbstractButton *playButton;
    QSlider *positionSlider;
};


videioplayer.cpp

mediaPlayer 객체을 따라가 보겠습니다. 

VideoPlayer::VideoPlayer(QWidget *parent)
    : QWidget(parent)
    , mediaPlayer(0, QMediaPlayer::VideoSurface)
    , playButton(0)
    , positionSlider(0)
{
    VideoWidget *videoWidget = new VideoWidget;

    QAbstractButton *openButton = new QPushButton(tr("Open..."));
    connect(openButton, SIGNAL(clicked()), this, SLOT(openFile()));

    playButton = new QPushButton;
    playButton->setEnabled(true);
    playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));

    connect(playButton, SIGNAL(clicked()),
            this, SLOT(play()));

    positionSlider = new QSlider(Qt::Horizontal);
    positionSlider->setRange(0, 0);

    connect(positionSlider, SIGNAL(sliderMoved(int)),
            this, SLOT(setPosition(int)));

    QBoxLayout *controlLayout = new QHBoxLayout;
    controlLayout->setMargin(0);
    controlLayout->addWidget(openButton);
    controlLayout->addWidget(playButton);
    controlLayout->addWidget(positionSlider);

    QBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(videoWidget);
    layout->addLayout(controlLayout);

    setLayout(layout);

    mediaPlayer.setVideoOutput(videoWidget->videoSurface());
    connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)),
            this, SLOT(mediaStateChanged(QMediaPlayer::State)));
    connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
    connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64)));
}


connect 로 상태값 변화에 대한 signal을 slot mediaStateChanged 로 보냅니다. 

또한 playbutton 에 click() 이벤트를 paly() 에 연결 했습니다.


videioplayer.cpp

void VideoPlayer::play()
{
    switch(mediaPlayer.state()) {
    case QMediaPlayer::PlayingState:
        mediaPlayer.pause();
        break;
    default:
        mediaPlayer.play();
        break;
    }
}

void VideoPlayer::mediaStateChanged(QMediaPlayer::State state)
{
    switch(state) {
    case QMediaPlayer::PlayingState:
        playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
        break;
    default:
        playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
        break;
    }
}


mediaPlayer.play(); 을 하여 비디오를 플레이 한다고 


mediaPlayer.state() 는 초기값은 stop상태입니다.(추후 소스에 설정되어 있는것을 볼수 있음.)


[slot] void QMediaPlayer::play()

Start or resume playing the current source.


Qt 문서에 나왔습니다. 


mediaStateChanged 는 단순 플레이버튼 아이콘만 변경을 합니다. 


그럼 play() 까지의 과정을 집요하게 알아 보겠습니다. 


Comments