알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)
비디오 위젯 예제 분석 데이터의 흐름을 파악(1) 본문
비디오 위젯 예제 다운로드
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() 까지의 과정을 집요하게 알아 보겠습니다.
'QT > Qt Multimedia 공부하기' 카테고리의 다른 글
| QMediaObject (0) | 2017.09.18 |
|---|---|
| 비디오 위젯 예제 분석 데이터의 흐름을 파악(2) (0) | 2017.09.16 |
| [Qt Multimedia]Multimedia Recipes (0) | 2017.09.15 |
| [Qt Multimedia]Camera 구현 세부 정보 (0) | 2017.09.15 |
| [Qt Multimedia]Video 구현 세부 정보 (0) | 2017.09.14 |