알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)
비디오 위젯 예제 분석 데이터의 흐름을 파악(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 |