Получение размера видео с помощью QtGStreamer возвращает НОЛЬ

#c #qt4 #gstreamer #qtgstreamer

#c #qt4 #gstreamer #qtgstreamer

Вопрос:

Я играю с 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, amp;MyMultimedia::onNewDecodedPad);
QGlib::connect(decodebin, "pad-removed", this, amp;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.

Комментарии:

1. Это похоже на примеры gstreamer c. Вы можете взглянуть на них, и, возможно, вы поймете

Ответ №1:

Решил это. В onNewDecodedPad() у вас по-прежнему нет доступа к информации о видеокадрах.

Класс MyMultimedia наследуется от QGst::Utils::ApplicationSink , поэтому мне пришлось реализовать метод с именем QGst::FlowReturn MyMultimedia::newBuffer() , который вызывается QtGstreamer всякий раз, когда готов новый кадр.

Другими словами, используйте этот метод для копирования кадра видео в QImage . Чего я не знал, так это того, что pullBuffer() возвращает a QGst::BufferPtr , который имеет QGst::CapsPtr . Это внутренняя структура из этого var, которая содержит информацию, которую я искал:

 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>();

    // ...
}