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

[Qt Multimedia]Video 구현 세부 정보 본문

QT/Qt Multimedia 공부하기

[Qt Multimedia]Video 구현 세부 정보

백곳 2017. 9. 14. 12:42

 Playing Video in C++

QMediaPlayer class 는 비디오 파일을 디코딩 할수 있습니다. 그리고 보여줄때  QVideoWidget, QGraphicsVideoItem 또는 커스텀 클래스를 사용합니다. 


QVideoWidget 사용할때

player = new QMediaPlayer;

playlist = new QMediaPlaylist(player);
playlist->addMedia(QUrl("http://example.com/myclip1.mp4"));
playlist->addMedia(QUrl("http://example.com/myclip2.mp4"));

videoWidget = new QVideoWidget;
player->setVideoOutput(videoWidget);

videoWidget->show();
playlist->setCurrentIndex(1);
player->play();

QGraphicsVideoItem 사용할때 


이것은 비디오 파일을 재생할때 여러가지 효과를 주기 위해 사용 되는것으로 예상됩니다. 


비디오 파일 재생할때 그림을 넣거나 자막을 넣거나 하는 기능 정도로 생각 됩니다. 

player = new QMediaPlayer(this);

QGraphicsVideoItem *item = new QGraphicsVideoItem;
player->setVideoOutput(item);
graphicsView->scene()->addItem(item);
graphicsView->show();

player->setMedia(QUrl("http://example.com/myclip4.ogv"));
player->play();

Working with Low Level Video Frames [low 레벨 수준의 비디오 프레임 작업 가능 ]


멀티 미디어는 비디오 프레임을 좀 더 쉽게 처리할 수 있도록 하기 위해 다양한 수준의 하위 클래스를 제공합니다.


이러한 클래스는 주로 비디오나 카메라 프레임을 처리하는 코드를 작성할 때 사용되며, 별도로 지원되지 않는 특수한 방식으로 비디오를 표시할 필요가 있습니다.


QVideoFrame 클래스는 비디오 프레임을 캡슐화하여 조작 또는 처리를 위해 시스템 메모리를 시스템 메모리에 매핑 할 수 있습니다.


QAbstractVideoSurface 클래스를 이용해서  QMediaPlayer and QCamera의 데이터를 수신 받을수도 있습니다. 

class MyVideoSurface : public QAbstractVideoSurface
{
    QList<QVideoFrame::PixelFormat> supportedPixelFormats(
            QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const
    {
        Q_UNUSED(handleType);

        // Return the formats you will support
        return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_RGB565;
    }

    bool present(const QVideoFrame &frame)
    {
        Q_UNUSED(frame);
        // Handle the frame and do your processing

        return true;
    }
};

클래스를 만들어 놓고 MyVideoSurface *myVideoSurface = new MyVideoSurface(); 로 변수를 만들고 


player->setVideoOutput(myVideoSurface);

하면 데이터를 수신 받을수 있습니다. 



이러한 기능을 제공하는 다양한 기능이 내장되어 있기 때문에 응용 프로그램에서 비디오를 디코딩 하는 경우QVideoRendererControl 클래스


를 사용할수 있습니다. 


Recording Video [녹화]

다른 클래스와 함께 QMedieMecorder 클래스를 사용하여 디스크에 비디오를 녹화할 수 있습니다.


Monitoring Video Frames


QMediaPlayer, QMediaRecorder or QCamera  같은 클래스 들을 사용할때 비디오 프레임이 접근 하여 QVideoProbe 을 사용할수 있다고 

합니다. 


하지만 비디오에서 probe 라니 개념을 잘 모르겠습니다.  영상을 하시는 분들을 대충 감이 오실것도 같습니다. QVideoProbe 을 사용해 


고수준의 media 클래스를 만들어 사용할수 있다고 합니다. 그리고 이렇게 고수준의 클래스는 보동 바코드 같은 시스템을 구현할때 


유용하다고 합니다. 


이 클래스를 사용하여 비디오 프레임에 영향을 미칠 수 없으며, 이 클래스는 렌더링 되는 시간과는 약간 다른 시간에 도달할 수 있습니다.


 video probe while recording the camera 예제


camera = new QCamera;
viewfinder = new QCameraViewfinder();
camera->setViewfinder(viewfinder);

camera->setCaptureMode(QCamera::CaptureVideo);

videoProbe = new QVideoProbe(this);

if (videoProbe->setSource(camera)) {
    // Probing succeeded, videoProbe->isValid() should be true.
    connect(videoProbe, SIGNAL(videoFrameProbed(QVideoFrame)),
            this, SLOT(detectBarcodes(QVideoFrame)));
}

camera->start();
// Viewfinder frames should now also be emitted by
// the video probe, even in still image capture mode.
// Another alternative is to install the probe on a
// QMediaRecorder connected to the camera to get the
// recorded frames, if they are different from the
// viewfinder frames.


마침

구현 되는 API 수준을 봤을때 느낌상 상당히 많은 API를 제공하는것을 알고 제대로만 이해한다면 강력하게 사용할수 있을것으로 예상 

됩니다.


또한 개발자를 위해서 정말 로우 레벨의 데이터까지 만질수 있게 API를 설계했다는것은 매우 고마운 일이라고 생각되네요. 



Comments