我正在玩 QtGStreamer 0.10.0 而我正在尝试检索视频大小,但是高度<返回 ZERO / strong>和宽度值。
然而,我能够在 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在网络上找到相关示例。
答案 0 :(得分:3)
解决了它。在onNewDecodedPad()
,您仍然无法访问有关视频帧的信息。
类MyMultimedia
继承自QGst::Utils::ApplicationSink
,因此我必须实现一个名为QGst::FlowReturn MyMultimedia::newBuffer()
的方法,只要新帧准备就绪,QtGstreamer就会调用该方法。
换句话说,使用此方法将视频帧复制到QImage
。我不知道的是pullBuffer()
会返回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>();
// ...
}