Как отобразить пользовательский видео слой AVPlayer в QT - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю над пользовательским компонентом QT для создания своего собственного проигрывателя iOS (так как мне нужна измененная версия его MediaPlayer по умолчанию для DRM).

Пока мне удалось создать простой компонент. *Заголовочный файл 1003 *

:

#include <QObject>
#include <QQuickItem>

class CustomPlayer : public QQuickItem
{
    Q_OBJECT

private:

public:
    CustomPlayer(QQuickItem *parent = 0);
    Q_INVOKABLE void play();
};

mm file:

#include <Foundation/Foundation.h>
#include <sys/utsname.h>
#include <UIKit/UIKit.h>
#include <AVFoundation/AVFoundation.h>
#include <AVKit/AVKit.h>

#include "customplayer.h"


//===================================

CustomPlayer::CustomPlayer(QQuickItem *parent)
    : QQuickItem(parent)
{
}

void CustomPlayer::play()
{
    AVPlayer *_player;
    AVURLAsset *_asset;
    AVPlayerItem *_playerItem;

    _player = [[AVPlayer alloc] init];

    NSURL *baseURL = [[NSURL alloc] initWithString: @"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];

    _asset = [AVURLAsset assetWithURL:baseURL];

    _playerItem = [AVPlayerItem playerItemWithAsset: _asset];

    [_player replaceCurrentItemWithPlayerItem:_playerItem];

    [_player play];
}

Это все еще очень грубая версия, но с этим я могу использовать CustomPlayer в своем коде QML.Но я борюсь с тем, чтобы создать слой для отображения видео.

Я пытаюсь понять, как в QT создан MediaPlayer, взглянув на исходный код в qtmultimedia но мне трудно понять это.Как создать выход для плеера, чтобы он отображался внутри компонента CustomPlayer?

1 Ответ

0 голосов
/ 12 декабря 2018

Это код C ++ (родительский класс QQuickPaintedItem):

// header

class VideoViewport : public QQuickPaintedItem
{
    Q_OBJECT
public:
    explicit VideoViewport(QQuickItem *parent = nullptr);

    void paint(QPainter *painter) override;
public slots:
    void updateImage(const QImage& frame);
private:
    QImage _currentImage;
};

// impementation in the *.cpp file
VideoViewport::VideoViewport(QQuickItem *parent):
    QQuickPaintedItem(parent)
{
}

void VideoViewport::paint(QPainter *painter)
{
    QSizeF _size = _currentImage.size();
    _size.scale(this->boundingRect().size(), Qt::KeepAspectRatio);
    QRectF output = QRectF(QPointF(0, 0), _size);
    output.moveCenter(boundingRect().center());
    painter->drawImage(output, _currentImage);
}

void VideoViewport::updateImage(const QImage &frame)
{
    _currentImage = frame;
    update();
}

В main.cpp

int main(...)
{
    //...
    qmlRegisterType<VideoViewport>("your.path.to.widgets", 1, 0 , "VideoViewport");
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...