LINUX.ORG.RU

Не связываются элементы GStreamer'а.

 ,


0

1

Пытаюсь записать картинку с камеры наблюдения. В консоли работает такая команда:

gst-launch-1.0 rtspsrc location='rtsp://admin:admin@192.168.27.103:554/cam/realmonitor' ! rtph264depay ! mpegtsmux ! filesink location=file.mp4

Картинка записывается, всё работает без замечаний. Но при попытке собрать ту же цепочку в программе на C связывания элементов не происходит.

  /*Инициализирую элементы.*/
  pipeline = gst_pipeline_new ("rtsp_capture");
  source   = gst_element_factory_make ("rtspsrc",       "rtsp-source");
  depayer  = gst_element_factory_make ("rtph264depay",  "depay");
  muxer    = gst_element_factory_make ("mpegtsmux",     "mpeg-ts-muxer");
  sink     = gst_element_factory_make ("filesink",      "file-output");

  /*Задаю location у source и sink из консоли.*/
  g_object_set (source, "location", argv[1], NULL);
  g_object_set (sink,   "location", argv[2], NULL);

  /*Засовываю элементы в pipeline.*/
  gst_bin_add_many (GST_BIN (pipeline),
                    source, depayer, muxer, sink, NULL);

  /*Связываю элементы.*/
  if (!gst_element_link_many (source,  depayer, muxer, sink, NULL)) {
    g_printerr ("Failed to link elemnts! Exiting.\n");
    return 1;
  }

После сборки и запуска программа вылетает с ошибкой Failed to link elements. Причём не связываются source и depayer (пробовал использовать функция gst_element_link()). Что не так не пойму. Как получить больше отладочной информации о том почему не происходит связывание?

Вообще, код моей программы это слегка изменённый пример из Your first application.

★★★★★

Установить переменную окружения GST_DEBUG=*:1. gst должен быть собран с --enable-gst-debug (по умолчанию включен).

fopen ★★
()
Ответ на: комментарий от fopen

INFO.

Уровень 1 не помог, уровень 4 (INFO) помог. Сейчас разбираюсь на что оно пожаловалось.

export GST_DEBUG=*:4
Camel ★★★★★
() автор топика
Ответ на: комментарий от fopen

Не ставится location.

Связывание не происходит, потому что «Could not find a compatible pad to link to». Примечательно, что до этого есть строчка в которой устанавливается location элемента filesink, но нет строчки в которой ставилось бы значение location'а у rtspsrс'а. Подозреваю что проблема в этом. Может туда надо URL в каком-то особом формате передавать, или слеши удваивать?

Camel ★★★★★
() автор топика
Последнее исправление: Camel (всего исправлений: 1)
Ответ на: комментарий от fopen

location ставится.

Если поднять уровень дебага до 6, то проскакивают строчки:

0:00:00.553422689  5658      0x2275600 DEBUG                rtspsrc gstrtspsrc.c:6780:gst_rtspsrc_uri_set_uri:<rtsp-source> set uri: rtsp://admin:admin@192.168.27.103:554/cam/realmonitor/
0:00:00.553436304  5658      0x2275600 DEBUG                rtspsrc gstrtspsrc.c:6782:gst_rtspsrc_uri_set_uri:<rtsp-source> request uri is: rtsp://192.168.27.103:554/cam/realmonitor/
Посмотрю-ка внимательнее как оно там link'уется.

Camel ★★★★★
() автор топика
Ответ на: location ставится. от Camel

Заиграло.

Ага. Добавил gst_element_set_state(source, GST_STATE_PLAYING) и паузу после этого — заиграло (без паузы не заиграло). Так что надо переписывать чтобы второй элемент в цепочке подключался к первому (к источнику) по событию «появление source pad'а». Судя по миганию лампочек на коммутаторе данные пошли, но в файл не пишутся всё равно.

Camel ★★★★★
() автор топика
Ответ на: Заиграло. от Camel

Ура, заработало.

Таки да, нужно было связывать элементы по событию появления pad'а. source pad в rtspsrc существует не всегда, но только в состоянии PLAYING, потому пока он в это состояние не перешёл связать его не получится. Недостаточно собрать элементы в правильной последовательности, надо обязательно следить за presence в документации.

Вот работающий код записывальщика потока h264 с RTSP'шной камеры:

#include <gst/gst.h>
#include <glib.h>

static void
on_pad_added (GstElement *element,
              GstPad     *pad,
              gpointer    data)
{
  GstPad *sinkpad;
  GstElement *queue = (GstElement *) data;

  g_print ("Dynamic pad created, linking source and queue.\n");

  sinkpad = gst_element_get_static_pad (queue, "sink");

  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);
}

static gboolean
bus_call (GstBus     *bus,
          GstMessage *msg,
          gpointer    data)
{
  GMainLoop *loop = (GMainLoop *) data;

  switch (GST_MESSAGE_TYPE (msg)) {

    case GST_MESSAGE_EOS:
      g_print ("End of stream\n");
      g_main_loop_quit (loop);
      break;

    case GST_MESSAGE_ERROR: {
      gchar  *debug;
      GError *error;

      gst_message_parse_error (msg, &error, &debug);
      g_free (debug);

      g_printerr ("Error: %s\n", error->message);
      g_error_free (error);

      g_main_loop_quit (loop);
      break;
    }
    default:
      break;
  }

  return TRUE;
}

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

  GstMessage *msg;
  GError *error;


  GstElement *pipeline, *source, *queue, *depayer, *muxer, *sink;
  GstBus *bus;
  guint bus_watch_id;

  /* Initialisation */
  gst_init (&argc, &argv);

  loop = g_main_loop_new (NULL, FALSE);


  /* Check input arguments */
  if (argc != 3) {
    g_printerr ("Usage: %s <rtsp URL> <filename.mp4>\n", argv[0]);
    return -1;
  }


  /* Create gstreamer elements */
  /* Working command line example: gst-launch-1.0 rtspsrc location='rtsp://admin:admin@192.168.27.103:554/cam/realmonitor' ! rtph264depay ! mpegtsmux ! filesink location=file.mp4 */
  pipeline = gst_pipeline_new ("rtsp_capture");
  source   = gst_element_factory_make ("rtspsrc",       "rtsp-source");
  queue    = gst_element_factory_make ("queue",         "queue"); // Do we need it?
  depayer  = gst_element_factory_make ("rtph264depay",  "h264-depay");
  muxer    = gst_element_factory_make ("mpegtsmux",     "mpeg-ts-muxer");
  sink     = gst_element_factory_make ("filesink",      "file-output");
  
  if (!pipeline || !source || !queue || !depayer || !muxer || !sink) {
    g_printerr ("One element could not be created. Exiting.\n");
    return -1;
  }

  /* Set up the pipeline */

  /* we set the input filename to the source element */
  g_object_set (source, "location", argv[1], NULL);
  g_object_set (sink,   "location", argv[2], NULL);

  /* we add a message handler */
  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
  gst_object_unref (bus);

  /* we add all elements into the pipeline */
  gst_bin_add_many (GST_BIN (pipeline),
                    source, queue, depayer, muxer, sink, NULL);

  /* we link the elements together */
  /* file-source -> h264-depayer ~> mpeg-ts-muxer -> file-output */

  g_signal_connect (source, "pad-added", G_CALLBACK (on_pad_added), queue);
  gst_element_link (queue, depayer);
  gst_element_link (depayer, muxer);
  gst_element_link (muxer,   sink);

  /* Set the pipeline to "playing" state*/
  g_print ("Now playing: %s\n", argv[1]);
  gst_element_set_state (pipeline, GST_STATE_PLAYING);


  /* Iterate */
  g_print ("Running...\n");
  g_main_loop_run (loop);


  /* Out of the main loop, clean up nicely */
  g_print ("Returned, stopping playback\n");
  gst_element_set_state (pipeline, GST_STATE_NULL);

  g_print ("Deleting pipeline\n");
  gst_object_unref (GST_OBJECT (pipeline));
  g_source_remove (bus_watch_id);
  g_main_loop_unref (loop);

  return 0;
}

Camel ★★★★★
() автор топика
29 декабря 2012 г.
Ответ на: Ура, заработало. от Camel

Поздравляю! Мне нужно аналогичное написать под embedded linux, плата DM8168EVM от Texas Instruments.

Я вообще электронщик и разрабатываю железо, но начальство требует хотя бы примитивную программу для проверки работоспособности железа..

Я установил toolchain, поставил EZSDK, установил пробную 30-дневную версию CodeBench от Mentor. HelloWorld нормально скомпилировал, залил на целевую плату, все работает.

Однако пытаюсь использовать gstreamer в проекте и начинаются сложности. #include <gst/gst.h> - файл не находит. Workspace для CodeBench находится в ${HOMEDIR}/workspace, библиотека gstreamer лежит по адресу ${HOMEDIR}/ti-ezsdk_dm816x-evm_5_05_01_04/linux-devkit/arm-none-linux-gnueabi/usr/include/gstreamer-0.10

Я зашел в свойства проекта и в Includes добавил этот путь, однако файл glib.h, на который ссылается gst.h, тоже недоступен и пришлось в Includes добавить прямой путь к нему также, и так по цепочке. Заголовочные файлы все нашлись проектом, однако функцию gst_element_get_static_pad() компилятор найти не может и выдает ошибку «ubdefined reference to 'gst_element_get_static_pad'

Подскажите пжл в каком направлении хотя бы копать дальше. Спасибо заранее!

Xuch
()
Ответ на: комментарий от Xuch

Мастера определяют по его инструментам.

Я установил toolchain, поставил EZSDK, установил пробную 30-дневную версию CodeBench от Mentor. HelloWorld нормально скомпилировал, залил на целевую плату, все работает.

Мастера узнаю по его инструментам.

Однако пытаюсь использовать gstreamer в проекте и начинаются сложности. #include <gst/gst.h> - файл не находит. Workspace для CodeBench находится в ${HOMEDIR}/workspace, библиотека gstreamer лежит по адресу ${HOMEDIR}/ti-ezsdk_dm816x-evm_5_05_01_04/linux-devkit/arm-none-linux-gnueabi/usr/include/gstreamer-0.10
Подскажите пжл в каком направлении хотя бы копать дальше. Спасибо заранее!

Подозреваю, что проблема тут не в GStreamer'е и GLib'е, но настройках вашей среды разработки. Я не специалист по EZSDK и CodeBench, всё больше по-старинке, Emacs'ом, GCC и scons'ом. Мне кажется вам надо лучше изучить имеющуюся среду разработки, либо использовать другую, если таковая возможность имеется.

Camel ★★★★★
() автор топика
Ответ на: Мастера определяют по его инструментам. от Camel

Вроде разобрался, линкер библиотеки все увидел, инклуды подключил, осталась только проблема с тем, что компилятор не находит определения для NULL, FALSE, gboolean, gchar, GError, GMainLoop и guint...

Подскажите пжл это определения типов автора данного топика или они находятся в библиотеках и я еще что-то не подключил?

Спасибо!

anonymous
()
Ответ на: GLib. от Camel

Спасибо, там другая проблема была, очень уж криво настраивается IDE. Сейчас все ок, спасибо!

Xuch
()
9 марта 2013 г.
Ответ на: Ура, заработало. от Camel

Проблема с изменением файла записи...

Стал копаться дальше и наткнулся на одну проблему. Требуется, чтобы через определенные интервалы времени поток с камеры начинал писаться в новый файл..

Ставлю pipeline в state NULL, меняю out filesink, ставлю pipeline в PLAYING. В принципе файл создается, но все последующие файлы, кроме первого - поврежденные и проиграть их не получается.. Подозреваю, что теряются заголовки.. Или я что-то не так делаю

Есть какие-нибудь идеи? Заранее спасибо

Xuch
()
Ответ на: Проблема с изменением файла записи... от Xuch

Я делаю по-другому.

Хм-м, у меня такой проблемы нет, хотя я делаю по-другому. В одном месте в pipeline'е у меня стоит элемент tee, я к нему цепляю второй bin с кодером, муксером и filesink'ом, а потом отцепляю первый bin. pipeline для этого я не останавливаю, нет нужды.

Заголовки у вас видимо теряются те, которые пишутся в файл муксером или кодером.

И вообще, напишите здесь свой pipeline.

Camel ★★★★★
() автор топика
Ответ на: Я делаю по-другому. от Camel

Camel, а скажите в Вашем способе какой получается разрыв во времени между концом предыдущего файла и началом следующего? Мне кажется там будет несколько секунд потеряно...

Pipeline у меня такой: rtspsrc location ! rtph264depay ! mpegtsmux ! filesink location

Сейчас в обработчик OnPadAdded засунул связывание элементов по событию добавления пада (это для следующего файла записи) и далее через 0,5с задержки в этом же обработчике торможу запись предыдущего файла.. Решение топорное и не устраивает конечно, т.к. используется в 2 раза больше памяти, чем требуется при более элегантном решении..

Попробую разобраться с вашим вариантом с tee...

Xuch
()
Ответ на: комментарий от Xuch

- какое-то значение.

Сamel, а скажите в Вашем способе какой получается разрыв во времени между концом предыдущего файла и началом следующего? Мне кажется там будет несколько секунд потеряно...

Наоборот, у меня какой-то кусок попадает в оба файла. Величину этого куска не знаю, так как я специально запускаю запись нового файла за несколько секунд до времени Ч, а останавливаю через несколько секунд после. Получается, что кусок длительностью в 2 раза по несколько секунд есть в обоих файлах, в конце первого и начале второго.

Попробую разобраться с вашим вариантом с tee...

Почитайте в FAQ GStreamer'а про работу с pipeline'ом содержащим tee, зачем и в каких местах там обязательно должны быть элементы queue.

Camel ★★★★★
() автор топика
Ответ на: комментарий от Xuch

Связывай по запросу.

Camel, а вы бы не могли показать пример как это делается? Что-то я про связывание через tee ничего толком не могу найти...

Сходу не могу, но суть в том, что у tee есть один обычный sink pad и любое желаемое количество src pad'ов по запросу. Нет запроса — нет src pad'а. Потому связывать надо не просто элементы, но конкретные pad'ы. То есть сначала создаёшь request pad у tee, потом берёшь static pad у queue и связываешь их.

Camel ★★★★★
() автор топика
Ответ на: Ну как? от Camel

Помощь нужна, т.к. ничего не получается с tee.. Вот такая ошибка вылетает:

0:00:05.247580150 3466 0xa033368 WARN rtspsrc gstrtspsrc.c:3303:gst_rtspsrc_loop_udp:<rtsp-source> warning: Could not receive any UDP packets for 5.0000 seconds, maybe your firewall is blocking it. Retrying using a TCP connection. WARNING: Could not read from resource. 0:00:05.585690117 3466 0xa033368 WARN rtspsrc gstrtspsrc.c:3459:gst_rtspsrc_loop:<rtsp-source> error: Internal data flow error. 0:00:05.585716949 3466 0xa033368 WARN rtspsrc gstrtspsrc.c:3459:gst_rtspsrc_loop:<rtsp-source> error: streaming task paused, reason not-linked (-1) ERROR: Internal data flow error.

Ниже мой код. Функция gst_element_request_pad() у меня не работает - линкер выдает ошибку unreferenced, поэтому использую gst_element_get_request_pad()

int CameraType::InitRecording(void)
{
  Pipeline = gst_pipeline_new("rtsp_capture");
  Source = gst_element_factory_make("rtspsrc", "rtsp-source");
  Tee = gst_element_factory_make("tee", "tee");
  VideoQueue1 = gst_element_factory_make("queue", "VideoQueue1");
  VideoQueue2 = gst_element_factory_make("queue", "VideoQueue2");
  Depayer1 = gst_element_factory_make("rtph264depay", "h264-depay-11");
  Muxer1 = gst_element_factory_make("mpegtsmux", "mpeg-ts-muxer-11");
  Sink1 = gst_element_factory_make("filesink", "file-output-11");
  Depayer2 = gst_element_factory_make("rtph264depay", "h264-depay-22");
  Muxer2 = gst_element_factory_make("mpegtsmux", "mpeg-ts-muxer-22");
  Sink2 = gst_element_factory_make("filesink", "file-output-22");

  if (!Pipeline || !Source || !Tee || !VideoQueue1 || !VideoQueue2 || !Depayer1 || !Muxer1 || !Sink1 || !Depayer2 || !Muxer2 || !Sink2)
    {
      AppendLog("One or some elements couldn't be created. Exiting from Rgst::Start()...\n", CRITICAL, CRITICAL);
      if (!Pipeline) AppendLog("Pipeline could not be created\n", ERROR, ERROR);
      if (!Source) AppendLog("Source could not be created\n", ERROR, ERROR);
      if (!Tee) AppendLog("Tee could not be created\n", ERROR, ERROR);
      if (!VideoQueue1) AppendLog("VideoQueue1 could not be created\n", ERROR, ERROR);
      if (!VideoQueue2) AppendLog("VideoQueue2 could not be created\n", ERROR, ERROR);
      if (!Depayer1) AppendLog("Depayer1 could not be created\n", ERROR, ERROR);
      if (!Muxer1) AppendLog("Muxer1 could not be created\n", ERROR, ERROR);
      if (!Sink1) AppendLog("Sink1 could not be created\n", ERROR, ERROR);
      if (!Depayer2) AppendLog("Depayer2 could not be created\n", ERROR, ERROR);
      if (!Muxer2) AppendLog("Muxer2 could not be created\n", ERROR, ERROR);
      if (!Sink2) AppendLog("Sink2 could not be created\n", ERROR, ERROR);
      return -1;
    }

  g_object_set(Source, "location", UrlVidFormat[2].url.c_str(), "retry", RTPSRC_RETRY, "tcp-timeout", RTPSRC_TCPTIMEOUT, NULL);

  Bus = gst_pipeline_get_bus(GST_PIPELINE (Pipeline));
  BusWatchId = gst_bus_add_watch(Bus, BusCall, GLoop);
  gst_object_unref(Bus);
  gst_bin_add_many(GST_BIN (Pipeline), Source, VideoQueue1, Depayer1, Muxer1, Sink1, NULL);
  //st_bin_add_many(GST_BIN (Pipeline), VideoQueue2, Depayer2, Muxer2, Sink2, NULL);
  gst_element_link_many(Source, Tee, NULL);
  gst_element_link_many(VideoQueue1, Depayer1, Muxer1, Sink1, NULL);
  //gst_element_link_many(VideoQueue2, Depayer2, Muxer2, Sink2, NULL);
  g_signal_connect(Tee, "pad-added", G_CALLBACK(OnVideo1PadAdded), this);
  //g_signal_connect(Tee, "pad-added", G_CALLBACK(OnVideo2PadAdded), this);
  //TeeSrcPadTemplate = gst_element_class_get_pad_template(GST_ELEMENT_GET_CLASS (Tee), "src%d");

  return 0;
}

int CameraType::StartingRec(void)
{
  AppendLog("DEBUG: Start func StartingRec()...\n", DEBUG, DEBUG);
  g_object_set(Sink1, "location", MakeFilenameStorePath().c_str(), NULL);
  Video1Pad = gst_element_get_request_pad(Tee, "src%d");
  //Video1Pad = gst_element_request_pad(Tee, TeeSrcPadTemplate, NULL, NULL);
  //VideoQueue1Pad = gst_element_get_static_pad(VideoQueue1, "sink");
  //gst_element_set_state(Pipeline, GST_STATE_PLAYING);

  return 0;
}

int CameraType::StartRec(string Path)
{
  //RecOutVideoPath = Path;

  AppendLog("DEBUG: StartRec() starting...\n", DEBUG, DEBUG);
  sprintf(str, "URL: %s\n", UrlVidFormat[2].url.c_str());
  AppendLog(str, ALERT, ALERT);

  if (UrlVidFormat[2].url.length() < 7)
    {
      AppendLog("This camera has not a valid Url. Exit from _Start_ function\n", ALERT, ALERT);
      return -1;
    }

  InitRecording();
  StartingRec();

  AppendLog("Now we try to start recording... Call _gst_element_set_state_ to put pipeline into PLAYING state\n", ALERT, ALERT);
  gst_element_set_state(Pipeline, GST_STATE_PLAYING);
  AppendLog("OK.\nNow exiting from _StartRec_ function...\n", ALERT, ALERT);

  return 0;
}

void CameraType::OnVideo1PadAdded(GstElement *element, GstPad *pad, gpointer data)
{
  GstPad *sinkpad;
  CameraType *Cam = (CameraType *) data;

  printf("Pad1\n");
  sinkpad = gst_element_get_static_pad(Cam->VideoQueue1, "sink");
  gst_pad_link(pad, sinkpad);
  gst_object_unref(sinkpad);
}

Xuch
()
Ответ на: комментарий от Xuch

Вроде что-то заработало пока с одним каналом, однако тут другая проблема вылезла... Я когда pipeline перевожу в состояние PLAYING она почему-то пытается создать файлы для обоих filesink, а у меня получается на данный момент задан путь к файлу только для первого канала Sink1, и pipeline вылетает с ошибкой «не могу создать файл».. Есть мысли как тут поступить?

gst_bin_add_many(GST_BIN (Pipeline), Source, Tee, VideoQueue1, Depayer1, Muxer1, Sink1, VideoQueue2, Depayer2, Muxer2, Sink2, NULL);
g_object_set(Sink1, "location", MakeFilenameStorePath().c_str(), NULL);
// Sink2 сейчас не задаю, т.к. мне он понадобится только через некоторый интервал времени
...
...
...
gst_element_set_state(Pipeline, GST_STATE_PLAYING);

Ошибка:

0:00:00.040022500  6610  0x9140b50 WARN                filesink gstfilesink.c:424:gst_file_sink_open_file:<file-output-22> error: No file name specified for writing.

ERROR: No file name specified for writing.

Xuch
()
Ответ на: комментарий от Xuch

Даже если задать Sink2, то запись не идет ни в Sink1, ни в Sink2, хотя лампочки на свитче моргают. Если же делаю

gst_bin_add_many(GST_BIN (Pipeline), Source, Tee, VideoQueue1, Depayer1, Muxer1, Sink1, NULL);
то в Sink1 пишется нормально.

Xuch
()
Ответ на: комментарий от Xuch

Интересно а сколько работающий Pipeline выедает памяти? Может все-таки лучше вариант с двумя Pipeline и соотв. одну останавливать, а вторую запускать, меняя при этом filesink?

Xuch
()
Ответ на: комментарий от Xuch

Запутался.

Запутался в вашем коде, а времени посвятить распутыванию сейчас не могу. Xuch, у вас GStreamer стоит достаточно поздней версии? У меня проблем с функциями и связыванием не было.

Не понял что за Source Pad и Tee Pad.

Camel ★★★★★
() автор топика
Ответ на: комментарий от Xuch

А как должно быть?

Вроде что-то заработало пока с одним каналом, однако тут другая проблема вылезла... Я когда pipeline перевожу в состояние PLAYING она почему-то пытается создать файлы для обоих filesink, а у меня получается на данный момент задан путь к файлу только для первого канала Sink1, и pipeline вылетает с ошибкой «не могу создать файл».. Есть мысли как тут поступить?

Правильно я понимаю, что вы цепляете к tee пару filesink'ов (или каких-то других элементов ведущих к filesink'ам)? Вы это делаете одновременно? Я делал это в разное время. То есть сначала цепляется один filesink, через 5 минут цепляется ещё один, через секунду отцепляется первый.

Camel ★★★★★
() автор топика
Ответ на: А как должно быть? от Camel

Нет у меня 3 цепочки должно быть в итоге как я понимаю: 1. Source (rtpsrc) -> Tee 2. VideoQueue1->Depayer1->Muxer1->filesink1 3. VideoQueue2->Depayer2->Muxer2->filesink2

На данном этапе я пытаюсь пока просто заставить писать в файл первую цепочку, и всё. Соответственно по событию OnSourcePadAdded я линкую Source и Tee между собой и затем сразу линкую цепочку «VideoQueue1->Depayer1->Muxer1->filesink1» к request pad от Tee. Соответственно что-то пишется. НО! Если я добавляю элементы второй цепочки записи (ничего не связывая с ней) - см. код ниже, то при изменении состояния pipelin'а в PLAYING у меня лампочки на свитче моргают, а ничего в файлы не пишется. При этом у меня получается один request pad от Tee (src0), связанный с цепочкой «VideoQueue1->Depayer1->Muxer1->filesink1». Линкуются они нормально, я проверяю что LINK_OK.. Тупик короче

gst_bin_add_many(GST_BIN (Pipeline), Source, Tee, VideoQueue1, Depayer1, Muxer1, Sink1, VideoQueue2, Depayer2, Muxer2, Sink2, NULL);
g_object_set(Sink1, "location", MakeFilenameStorePath().c_str(), NULL);
// Sink2 сейчас не задаю, т.к. мне он понадобится только через некоторый интервал времени
...
...
...
gst_element_set_state(Pipeline, GST_STATE_PLAYING);

Xuch
()
Ответ на: комментарий от Xuch

Я не понимаю еще ко всему прочему зачем ему создавать файл, если Tee не связан с цепочкой «VideoQueue2->Depayer2->Muxer2->filesink2».

Xuch
()
Ответ на: Заработало от Xuch

Ан нет

Ага работает, но опят проблема с тем, что кроме первых двух файлов все остальные поврежденные - видимо отстутствуют заголовки. Camel, вы не подскажете что от чего нужно отцеплять чтобы заголовки не терялись?

Я делаю:

gst_element_unlink(Tee, VieoQeueue1);
gst_element_set_state(filesink, GST_STATE_NULL);
gst_bin_remove(filesink);

В следующем цикле:

filesink=gst_element_factory_make("filesink", "file-output-11");
gst_bin_add(GST_BIN (Pipeline), filesink); 
g_object_set(filesink, "location", path_to_file, NULL);
И далее связываю пады Tee и Videoqueue1

Что я делаю не так?

Xuch
()
Ответ на: Ан нет от Xuch

Перед mux'ом.

У меня tee стоит после decoder'а. У вас, кажися, decoder'а вообще нет, потому что с камеры вы получаете поток mp4, его же пихаете mux'ом в файл.

Camel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.