1

Ubuntu 14.04 を実行している nVidia TX1 で qt-gstreamer 1.2 と gstreamer 1.2.4 を使用しています。

カメラ プレビュー + 録画 + イーサネット ストリーミング + Wifi ストリーミングのパイプラインがあり、パイプラインを動的にしたいと考えています。ex i 実行中のパイプラインでレコーディング/ストリーミングを追加/削除できます。

パイプラインを一時停止して要素を追加/削除し、パッドとそのブロック機能を使用せずに再開します。これはうまくいきます。ただし、要素を数回追加/削除すると、パイプラインがハングします。パイプラインを一時停止するとハングします。

一時停止時に要素をリンク/リンク解除するのではなく、パイプラインをハングアップさせる一時停止/再開が見つかりました。プレビューと記録に必要な要素のみを追加するなど、パイプラインに追加する要素を減らすと、パイプラインが長時間ハングしてからすべての要素でハングします。

すべてのシンク要素の同期と非同期は false です。

m_pipeline  =   QGst::Pipeline::create();
m_source    =   QGst::ElementFactory::make("v4l2src", "v4l2src");
m_filter1   =   QGst::ElementFactory::make("capsfilter", "capsfilter");
m_convert   =   QGst::ElementFactory::make("nvvidconv", "videoconvert");
m_filter2   =   QGst::ElementFactory::make("capsfilter", "capsfilter1");
m_filter3   =   QGst::ElementFactory::make("capsfilter", "capsfilter2");
m_tee       =   QGst::ElementFactory::make("tee", "tee");
m_tee1      =   QGst::ElementFactory::make("tee", "tee1");
m_enc       =   QGst::ElementFactory::make("omxh264enc", "omxh264enc");
m_enc1      =   QGst::ElementFactory::make("omxh264enc", "omxh264enc1");
m_parse     =   QGst::ElementFactory::make("h264parse", "h264parse");
m_parse1    =   QGst::ElementFactory::make("h264parse", "h264parse1");
m_parse2    =   QGst::ElementFactory::make("h264parse", "h264parse2");
m_mux       =   QGst::ElementFactory::make("qtmux", "qtmux");
m_filesink  =   QGst::ElementFactory::make("filesink", "filesink");
m_queue1    =   QGst::ElementFactory::make("queue", "queue1");
m_queue2    =   QGst::ElementFactory::make("queue", "queue2");
m_queue3    =   QGst::ElementFactory::make("queue", "queue3");
m_queue4    =   QGst::ElementFactory::make("queue", "queue4");
m_queue5    =   QGst::ElementFactory::make("queue", "queue5");
m_queue6    =   QGst::ElementFactory::make("queue", "queue6");
m_queue7    =   QGst::ElementFactory::make("queue", "queue7");
m_queue8    =   QGst::ElementFactory::make("queue", "queue8");
m_fakesink  =   QGst::ElementFactory::make("fakesink", "fakesink");
m_rtppay1   =   QGst::ElementFactory::make("rtph264pay", "rtph264pay");
m_rtppay2   =   QGst::ElementFactory::make("rtph264pay", "rtph264pay1");
m_udpsink   =   QGst::ElementFactory::make("udpsink", "udpsink");
m_udpsink1  =   QGst::ElementFactory::make("udpsink", "udpsink1");
m_videoSink =   QGst::ElementFactory::make("nvoverlaysink", "sink");
m_tee2      =   QGst::ElementFactory::make("tee", "tee3");
m_fakesink1 =   QGst::ElementFactory::make("fakesink", "fakesink1");
m_mux1       =   QGst::ElementFactory::make("qtmux", "qtmux1");
m_filesink1 =   QGst::ElementFactory::make("filesink", "filesink1");

m_filter1->setProperty("caps", QGst::Caps::fromString("video/x-raw, width=1920, height=1080, format=UYVY, framerate=60/1"));
m_filter2->setProperty("caps", QGst::Caps::fromString("video/x-raw(memory:NVMM), width=1920, height=1080, format=I420, framerate=60/1"));
m_filter3->setProperty("caps", QGst::Caps::fromString("video/x-h264, stream-format=(string)byte-stream"));

m_videoSink->setProperty("sync", false);
m_videoSink->setProperty("async", false);

m_pipeline->setProperty("video-sink", m_videoSink);

m_filesink->setProperty("sync", false);
m_filesink->setProperty("async", false);
m_enc->setProperty("bitrate", 19000000);
m_enc->setProperty("low-latency", 1);
m_enc->setProperty("control-rate", 2);
m_filesink->setProperty("location", "/home/ubuntu/video.mp4");
m_rtppay1->setProperty("mtu", 1400);
m_rtppay2->setProperty("mtu", 1400);

m_filesink1->setProperty("sync", false);
m_filesink1->setProperty("async", false);
m_filesink1->setProperty("location", "/home/ubuntu/video1.mp4");

m_udpsink->setProperty("port", 5000);
m_udpsink->setProperty("sync", false);
m_udpsink->setProperty("async", false);
m_udpsink->setProperty("host", "127.0.0.1");

m_udpsink1->setProperty("port", 8554);
m_udpsink1->setProperty("sync", false);
m_udpsink1->setProperty("async", false);
m_udpsink1->setProperty("host", "172.10.10.135");

m_pipeline->add(m_source, m_filter1, m_tee2, m_queue6, m_fakesink1);
m_pipeline->add(m_queue7, m_convert, m_filter2, m_tee, m_queue1, m_videoSink);
m_pipeline->add(m_queue2, m_enc, m_filter3, m_tee1, m_queue8, m_fakesink);
m_pipeline->add(m_queue3, m_parse, m_mux, m_filesink);
m_pipeline->add(m_queue4, m_parse1, m_rtppay1, m_udpsink);
m_pipeline->add(m_queue5, m_parse2, m_rtppay2, m_udpsink1);

m_pipeline->linkMany(m_source, m_filter1, m_tee2, m_queue6, m_fakesink1);
m_pipeline->linkMany(m_tee2, m_queue7, m_convert, m_filter2, m_tee, m_queue1, m_videoSink);
m_pipeline->linkMany(m_tee, m_queue2, m_enc, m_filter3, m_tee1, m_queue8, m_fakesink);
m_pipeline->linkMany(m_tee1, m_queue3, m_parse, m_mux, m_filesink);
m_pipeline->linkMany(m_tee1, m_queue4, m_parse1, m_rtppay1, m_udpsink);
m_pipeline->linkMany(m_tee1, m_queue5, m_parse2, m_rtppay2, m_udpsink1);

テストのために、1秒ごとにパイプラインを一時停止して再生しています。

m_pipeline->setState(QGst::StatePaused);
QThread::msleep(10);
m_pipeline->setState(QGst::StatePlaying);

数回の一時停止/再開の後、パイプラインがハングします。linkmany の最後の 2 行を削除して追加すると、すべての要素を追加した場合よりも多くの時間を一時停止/再開できます。

では、ここで何が問題なのですか?パイプラインを効率的に一時停止/再生するにはどうすればよいですか?

4

0 に答える 0