Извлечение размера видео с использованием 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, &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.
1 ответ
Решил это. В onNewDecodedPad()
у вас все еще нет доступа к информации о видеокадрах.
Класс MyMultimedia
наследуется от QGst::Utils::ApplicationSink
поэтому мне пришлось реализовать метод с именем QGst::FlowReturn MyMultimedia::newBuffer()
это вызывается QtGstreamer всякий раз, когда новый кадр готов.
Другими словами, используйте этот метод, чтобы скопировать кадр видео в QImage
, Что я не знал, так это pullBuffer()
возвращает QGst::BufferPtr
, который имеет QGst::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>();
// ...
}