簡體   English   中英

在Gstreamer C API中使用視頻縮放元素上限

[英]Using caps on videoscale element in Gstreamer C API

我正在嘗試使用ximagesrc從窗口抓取視頻並將其縮放到一定大小,然后再進行H.264編碼並使用RTP流式傳輸到另一台計算機。 我實現我的C API管道,除非我添加它工作正常videoscale元素與capsfilter

具體來說,我在理解如何正確使用videoscale元素以及如何以編程方式將其與videoconvert元素鏈接方面遇到問題。 當我嘗試使用capsfiltervideoconvertvideoscale元素連接以縮放至所需分辨率時,函數gst_element_link_filtered返回false。

我的代碼如下所示:

static gboolean
link_elements_with_filter (GstElement *element1, GstElement *element2)
{
  gboolean link_ok;
  GstCaps *caps;

  caps = gst_caps_from_string("video/x-raw,width=640,height=480,framerate=20/1");

  link_ok = gst_element_link_filtered (element1, element2, caps);
  gst_caps_unref (caps);

  if (!link_ok) {
      g_warning ("Failed to link element1 and element2!");
    }

  return link_ok;
}


int main(int argc, char *argv[]) {

(...)

 /* Create the elements */
  source = gst_element_factory_make ("ximagesrc", "source");
  converter = gst_element_factory_make ("videoconvert", "converter");
  scaler = gst_element_factory_make ("videoscale", "scaler");
  encoder = gst_element_factory_make("nvh264enc", "encoder");
  payloader = gst_element_factory_make("rtph264pay", "payloader");
  sink = gst_element_factory_make ("udpsink", "sink");

  g_object_set (source, "use-damage", FALSE, "xid", 0x5c0000c, NULL);
  g_object_set (encoder, "gop-size", 25, "rc-mode", 2, "bitrate", 2000, NULL);
  g_object_set (payloader, "config-interval", 1, NULL); 
  g_object_set (sink, "host", "172.17.25.248", "port", 5004, NULL);

  pipeline = gst_pipeline_new ("test-pipeline");

  if (!pipeline || !source || !converter || !encoder || !payloader || !sink) {
      g_printerr ("Not all elements could be created.\n");
      return -1;
  }


   gst_bin_add_many (GST_BIN (pipeline), source, converter, scaler, encoder, payloader, sink,   NULL);
   if ((gst_element_link (source, converter) && link_elements_with_filter(converter, scaler)
                                          && gst_element_link (scaler, encoder)
                                          && gst_element_link (encoder, payloader)
                                          && gst_element_link (payloader, sink)) != TRUE) {
    g_printerr ("Elements could not be linked.\n");
    gst_object_unref (pipeline);
    return -1;
}

(...)

運行此代碼時,得到以下輸出:

** (gst_server:55698): WARNING **: 11:21:57.315: Failed to link element1 and element2!
Elements could not be linked.
Process finished with exit code 255

所以我在連接videoconvertvideoscale元素時遇到問題。 管道中的元素順序是否有問題,或者我使用大寫字母是否有問題?

謝謝。

編輯:

相應的gst-launch管道(工作正常)如下所示:

gst-launch-1.0 ximagesrc use-damage=FALSE xid=0x5c0000c ! videoconvert ! videoscale ! video/x-raw,width=320,height=240 ! nvh264enc gop-size=25 rc-mode=cbr bitrate=2000 ! rtph264pay config-interval=1 ! udpsink host=172.X.X.X port=5001

然后,我可以在客戶端計算機上啟動另一個gst-launch管道,並查看縮放后的視頻。

編輯2:我設置GST_DEBUG=5並檢查調試輸出。 它說videoconvert元件的源極焊盤和capsfilter元件的沉極焊盤不兼容。 媒體格式之間的轉換似乎存在問題。

0:00:00.175919763 57549 0x5578d0241800 DEBUG               GST_CAPS gstutils.c:3065:gst_pad_query_caps:<capsfilter0:sink> query returned video/x-raw, width=(int)640, height=(int)480, framerate=(fraction)20/1
0:00:00.175938538 57549 0x5578d0241800 DEBUG               GST_CAPS gstpad.c:2278:gst_pad_link_check_compatible_unlocked:<converter:src> src caps video/x-raw, format=(string)BGRx, width=(int)1247, height=(int)1573, framerate=(fraction)[ 1/2147483647, 2147483647/1 ], pixel-aspect-ratio=(fraction)1/1; video/x-raw, width=(int)1247, height=(int)1573, framerate=(fraction)[ 1/2147483647, 2147483647/1 ], pixel-aspect-ratio=(fraction)1/1, format=(string){ I420, YV12, YUY2, UYVY, AYUV, VUYA, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, Y210, Y410, NV12, NV21, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10BE, I420_10LE, I422_10BE, I422_10LE, Y444_10BE, Y444_10LE, GBR, GBR_10BE, GBR_10LE, NV16, NV24, NV12_64Z32, A420_10BE, A420_10LE, A422_10BE, A422_10LE, A444_10BE, A444_10LE, NV61, P010_10BE, P010_10LE, IYU2, VYUY, GBRA, GBRA_10BE, GBRA_10LE, BGR10A2_LE, GBR_12BE, GBR_12LE, GBRA_12BE, GBRA_12LE, I420_12BE, I420_12LE, I422_12BE, I422_12LE, Y444_12BE, Y444_12LE, GRAY10_LE32, NV12_10LE32, NV16_10LE32, NV12_10LE40 }
0:00:00.175947929 57549 0x5578d0241800 DEBUG               GST_CAPS gstpad.c:2280:gst_pad_link_check_compatible_unlocked:<capsfilter0:sink> sink caps video/x-raw, width=(int)640, height=(int)480, framerate=(fraction)20/1
0:00:00.175955981 57549 0x5578d0241800 DEBUG               GST_CAPS gstpad.c:2298:gst_pad_link_check_compatible_unlocked: caps are not compatible
0:00:00.175960969 57549 0x5578d0241800 INFO                GST_PADS gstpad.c:2434:gst_pad_link_prepare: caps are incompatible
0:00:00.175968231 57549 0x5578d0241800 INFO                GST_PADS gstpad.c:2529:gst_pad_link_full: link between converter:src and capsfilter0:sink failed: no common format

首先,我建議使用gst_parse_launch() 您可以像通過gst-launch-1.0那樣為應用程序創建管道。 然后,可以根據需要通過迭代或搜索來訪問各個元素-盡管大多數內容都可以使用管道字符串來描述。

為您的代碼。 您已在定標器之前設置了上限。 這意味着定標器輸入應具有這些上限。 但是, ximagesrc定義了實際大小。 如果不完全相同,您將失敗。

通常,您希望將其設置在編碼器之前,然后讓元素工作以找到滿足上限的配置。 例如:

ximagesrc! 視頻轉換! 視頻規模! xvideo / x-raw,format = I420,width = 640,height = 480,framerate = 20/1! nvh264enc ..

在這里videoconvert將知道它必須以某種方式從ximagesrc (通常為RGB格式)轉換為I420,並且videoscale縮放比例將從ximagesrc提供的任何分辨率ximagesrc到640x480。 建議ximagesrc以20 fps捕獲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM