QGst::BinPtr GstExporter::createVideoMixer() { qDebug() << "createVideoMixer start"; QGst::BinPtr videoMixerBin = QGst::Bin::create(); try { QGst::ElementPtr videoMixer = QGst::ElementFactory::make("videomixer", "mix"); videoMixer->setProperty("background", (int) 1); //black background videoMixerBin->add(videoMixer); int count = 0; // go through every element in the grid for (int i = 0; i < rec_->grid.height; ++i) { for (int j = 0; j < rec_->grid.width; ++j) { VideoFile* current = &rec_->grid.grid[i][j]; if (current->id != 0) { qDebug() << "Working on video[" << i << "][" << j << "] with id: " << current->id; QGst::PadPtr pad = videoMixer->getRequestPad("sink_%u"); pad->setProperty("ypos", i * elementHeightPx); pad->setProperty("xpos", j * elementWidthPx); qDebug() << "Pad created with xpos: " << pad->property("xpos") << ", ypos: " << pad->property("ypos"); QGst::BinPtr filesrc = createFileSrcBin(current->filepath, count); videoMixerBin->add(filesrc); QGst::PadPtr sourcepad = filesrc->getStaticPad("src"); sourcepad->link(pad); ++count; } } } QGst::PadPtr mixSrcPad = videoMixer->getStaticPad("src"); videoMixerBin->addPad(QGst::GhostPad::create(mixSrcPad, "src")); } catch (const QGlib::Error& error) { qDebug() << "Failed to create a videomixer:" << error; return QGst::BinPtr(); } return videoMixerBin; }
void QtGStreamerCaptureBackend::startCapture(const QString &filePath) { // clear pipeline if still existing if (m_pipeline) { qCWarning(LIBSOUND_LOG) << "removing forgotten pipeline"; //send an end-of-stream event to flush metadata and cause an EosMessage to be delivered m_pipeline->sendEvent(QGst::EosEvent::create()); } QGst::BinPtr audioSrcBin = createAudioSrcBin(); QGst::ElementPtr mux = QGst::ElementFactory::make("oggmux"); QGst::ElementPtr sink = QGst::ElementFactory::make("filesink"); if (!audioSrcBin || !mux || !sink) { qCritical() << "One or more elements could not be created. " << "Verify that you have all the necessary element plugins installed."; return; } // set output path sink->setProperty("location", filePath); m_pipeline = QGst::Pipeline::create(); m_pipeline->add(audioSrcBin, mux, sink); //link elements QGst::PadPtr audioPad = mux->getRequestPad("audio_%u"); audioSrcBin->getStaticPad("src")->link(audioPad); mux->link(sink); //connect the bus m_pipeline->bus()->addSignalWatch(); QGlib::connect(m_pipeline->bus(), "message", this, &QtGStreamerCaptureBackend::onBusMessage); m_pipeline->setState(QGst::StatePlaying); }