Gstreamer 1.14.4 - Splitmuxsink не создает несколько файлов - PullRequest
0 голосов
/ 03 января 2019

Splitmuxsink не создает несколько файлов нужной длины, скорее он создает один файл с исходной длиной потока. Я использую сигнал splitmuxsink 'location-format-full' для получения PTS буферов, а также буферов из идентификатора для проверки оч. Я использовал динамическое связывание для rtspsrc и rtph264depay. Правильно ли прикреплен код?

#include <gst/gst.h>
#include<stdio.h>
#include<stdlib.h>

static void cb_new_rtspsrc_pad(GstElement *element,GstPad*pad,gpointer  data)
{
gchar *name;
GstElement *p_rtph264depay;

name = gst_pad_get_name(pad);
g_print("A new pad %s was created\n", name);
p_rtph264depay = GST_ELEMENT(data);

if(!gst_element_link_pads(element, name, p_rtph264depay, "sink"))
{
    printf("Failed to link elements 3\n");
}
g_free(name);
}

  static void pts_analysis_cb(GstElement *splitmuxsink, guint id , GstSample *sample,  gpointer user_data)   
  {
  GstBuffer *buffer=gst_sample_get_buffer(sample); 
  GstClockTime pts1 = GST_BUFFER_PTS(buffer);
  printf("lff - *%ld*   \n  ",pts1);
  gst_println("Hello from above");
  }

static void pts_analysis_call(GstElement *identity,  GstBuffer *buffer, gpointer user_data) 
    {
   GstClockTime pts = GST_BUFFER_PTS(buffer);
    printf("id- *%ld* ",pts);
}

  int main(int argc, char *argv[]) {
  GstElement *pipeline,*rtspsrc,*depay,*h264,*splitmux,*id;
  GstBus *bus;
  GstMessage *msg;
  gst_init (&argc, &argv);

  pipeline=gst_pipeline_new("pipeline");

  rtspsrc=gst_element_factory_make("rtspsrc","src");
  g_object_set(G_OBJECT(rtspsrc),"location","rtsp://127.0.0.1:8554/test",NULL);

 depay=gst_element_factory_make("rtph264depay","depay");
 id=gst_element_factory_make("identity","id");
  h264=gst_element_factory_make("h264parse","h264");

  splitmux=gst_element_factory_make("splitmuxsink","mux");
  g_object_set(G_OBJECT(splitmux),"location","/home/fti/gstpatch/video%02d.mp4","max-size-time","6000000000",NULL);

  bus = gst_element_get_bus (pipeline);

  gst_bin_add_many(GST_BIN(pipeline),rtspsrc,depay,NULL);
  g_signal_connect(rtspsrc,"pad-added",G_CALLBACK(cb_new_rtspsrc_pad),depay);
  gst_bin_add_many(GST_BIN(pipeline),id,NULL);
  printf("*%d*",gst_element_link(depay,id));
    gst_bin_add_many(GST_BIN(pipeline),h264,NULL);
  printf("*%d*",gst_element_link(id,h264));

    g_signal_connect_data(id, "handoff",G_CALLBACK(pts_analysis_call), NULL, NULL, G_CONNECT_AFTER);

  gst_bin_add_many(GST_BIN(pipeline),splitmux,NULL);
  if(!gst_element_link(h264,splitmux))
   { printf("Failed");}

  g_signal_connect_data(splitmux,"format-location-full", G_CALLBACK(pts_analysis_cb),NULL,NULL,G_CONNECT_AFTER);

  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

  if (msg != NULL)
  {
  gst_message_unref (msg);
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  }
  gst_object_unref (pipeline);
  return 0;
  }

Выход:

./run
*1**1*A new pad recv_rtp_src_0_3739157605_14 was created

Failed to link elements 3

A new pad recv_rtp_src_1_4067307517_96 was created

id- *284978620* id- *288409482* lff - *284978620*   
  Hello from above
id- *330106510* id- *494942923* id- *410824070*

Кажется, что splitmuxsink не получает никаких кадров после первого.

...