3

私はQtGStreamer 0.10.0で遊んでいて、ビデオのサイズを取得しようとしていますが、高さ幅の値に対してゼロを返しています。

ただし、QImageで問題なくビデオを再生できます。

QGst::init();        

pipeline = QGst::Pipeline::create();
filesrc = QGst::ElementFactory::make("filesrc");
filesrc->setProperty("location", "sample.avi");
pipeline->add(filesrc);

decodebin = QGst::ElementFactory::make("decodebin2").dynamicCast<QGst::Bin>();
pipeline->add(decodebin);
QGlib::connect(decodebin, "pad-added", this, &MyMultimedia::onNewDecodedPad);
QGlib::connect(decodebin, "pad-removed", this, &MyMultimedia::onRemoveDecodedPad);
filesrc->link(decodebin);

// more code ...

上記のコードは、パイプラインのセットアップの開始を示しています。メソッドMyMultimedia::onNewDecodedPadを信号"pad-added"に接続することで、ビデオのデータにアクセスできます。少なくとも私はそう思います。

void MyMultimedia::onNewDecodedPad(QGst::PadPtr pad)
{  
    QGst::CapsPtr caps = pad->caps();
    QGst::StructurePtr structure = caps->internalStructure(0);
    if (structure->name().contains("video/x-raw"))
    {
        // Trying to print width and height using a couple of different ways,
        // but all of them returns 0 for width/height.

        qDebug() << "#1 Size: " << structure->value("width").get<int>() << "x" << structure->value("height").get<int>();

        qDebug() << "#2 Size: " << structure->value("width").toInt() << "x" << structure->value("height").toInt();

        qDebug() << "#3 Size: " << structure.data()->value("width").get<int>() << "x" << structure.data()->value("height").get<int>();

        // numberOfFields also returns 0, which is very wierd.
        qDebug() << "numberOfFields:" << structure->numberOfFields(); 

    }

    // some other code
}

私は何が間違っているのだろうか。任意のヒント?この API を使用して、ウェブ上で関連する例を見つけることができませんでした。

4

1 に答える 1

3

解決しました。ビデオ フレームに関する情報にはonNewDecodedPad()まだアクセスできません。

このクラスMyMultimediaは から継承しているため、新しいフレームの準備ができるたびに QtGstreamer によって呼び出されるQGst::Utils::ApplicationSinkという名前のメソッドを実装する必要がありました。QGst::FlowReturn MyMultimedia::newBuffer()

つまり、このメソッドを使用して、ビデオのフレームをQImage. 私が知らなかったのは、が をpullBuffer()返すということです。私が探していた情報を保持するのは、この var の内部構造です。QGst::BufferPtrQGst::CapsPtr

QGst::FlowReturn MyMultimedia::newBuffer()
{
    QGst::BufferPtr buf_ptr = pullBuffer();        
    QGst::CapsPtr caps_ptr = buf_ptr->caps();
    QGst::StructurePtr struct_ptr = caps_ptr->internalStructure(0);

    qDebug() << struct_ptr->value("width").get<int>() << 
                "x" << 
                struct_ptr->value("height").get<int>();

    // ...
}
于 2011-11-11T17:00:24.617 に答える