WebRTC to MKV or hlssink2 - problems with audio+video streams together

Mandar Joshi emailmandar at gmail.com
Tue Nov 10 05:04:44 UTC 2020


> I think one solution for you would be to add a buffer probe on the audio
> stream and drop any audio before the first video frame arrives.

This solution works for me. Here's the prototype code I used to test

gulong audioprobe_id;
GstPad *audioparse_pad;

GstPadProbeReturn audioparse_drop_buffer (GstPad *pad, GstPadProbeInfo
*info,
                                          gpointer user_data) {
  g_message ("Need to drop this audio buffer");
  return GST_PAD_PROBE_DROP;
}

//Need To Drop Audio buffers until video arrives
static void
handle_media_stream (GstPad *pad, GstElement *pipe, const char
*convert_name,
  const char *sink_name) {
    GstElement *q, *audioconvert, *videoconvert, *faac, *aacparse;
    GstElement *audiosink, *videosink;
    GstPad *qpad, *p1, *p2;
    static GstElement *hlssink2 = NULL;

    GstElement *x264enc, *h264parse;
    GstPad *videoparse_pad;

    gboolean ret;

    if (g_str_equal (convert_name, "audioconvert")) {
      g_message ("Received Audio");
      q = gst_element_factory_make ("queue", "queue");
      audioconvert = gst_element_factory_make ("audioconvert",
"audioconvert");
      hlssink2 = gst_element_factory_make ("hlssink2", "hlssink2");
      g_object_set (hlssink2, "max-files", 5, "target-duration", 4, NULL);
      faac = gst_element_factory_make ("avenc_aac", "avenc_aac");
      aacparse = gst_element_factory_make ("aacparse", "aacparse");

      /*audiosink = gst_element_factory_make ("autoaudiosink",
"autoaudiosink");
      gst_bin_add_many (GST_BIN (pipe), q, audioconvert, audiosink, NULL);*/

      gst_bin_add_many (GST_BIN (pipe), q, audioconvert, faac, aacparse,
                        hlssink2, NULL);
      gst_element_sync_state_with_parent (q);
      gst_element_sync_state_with_parent (audioconvert);
      gst_element_sync_state_with_parent (faac);
      gst_element_sync_state_with_parent (aacparse);
      //gst_element_sync_state_with_parent (audiosink);
      //gst_element_link_many (q, audioconvert, audiosink, NULL);
      gst_element_link_many (q, audioconvert, faac, aacparse, NULL);

      //Drop Audio Buffers
      audioparse_pad = gst_element_get_static_pad (aacparse, "src");
      audioprobe_id = gst_pad_add_probe (audioparse_pad,
GST_PAD_PROBE_TYPE_BUFFER,
              audioparse_drop_buffer, NULL, NULL);

      //Regular pad linking
      p1 = gst_element_get_request_pad (hlssink2, "audio");
      audioparse_pad = gst_element_get_static_pad (aacparse, "src");
      ret = gst_pad_link (audioparse_pad, p1);

      g_message ("Audio Pad Link: %d", ret);
      g_assert_cmphex (ret, ==, GST_PAD_LINK_OK);

      qpad = gst_element_get_static_pad (q, "sink");
      ret = gst_pad_link (pad, qpad);
      g_assert_cmphex (ret, ==, GST_PAD_LINK_OK);
    }
    else if (g_str_equal (convert_name, "videoconvert")) {
      g_message ("Received Video");
      q = gst_element_factory_make ("queue", "videoqueue");
      videoconvert = gst_element_factory_make ("videoconvert",
"videoconvert");
      x264enc = gst_element_factory_make ("x264enc", "x264enc");
      h264parse = gst_element_factory_make ("h264parse", "h264parse");

      gst_bin_add_many (GST_BIN (pipe), q, videoconvert, x264enc, h264parse,
                        NULL);
      gst_element_sync_state_with_parent (q);
      gst_element_sync_state_with_parent (videoconvert);
      gst_element_sync_state_with_parent (x264enc);
      gst_element_sync_state_with_parent (h264parse);
      //gst_element_sync_state_with_parent (audiosink);
      //gst_element_link_many (q, audioconvert, audiosink, NULL);
      gst_element_link_many (q, videoconvert, x264enc, h264parse, NULL);

      //Regular pad linking
      p1 = gst_element_get_request_pad (hlssink2, "video");
      videoparse_pad = gst_element_get_static_pad (h264parse, "src");
      ret = gst_pad_link (videoparse_pad, p1);
      g_message ("Video Pad Link: %d", ret);
      g_assert_cmphex (ret, ==, GST_PAD_LINK_OK);

      qpad = gst_element_get_static_pad (q, "sink");
      ret = gst_pad_link (pad, qpad);
      g_assert_cmphex (ret, ==, GST_PAD_LINK_OK);
      gst_pad_remove_probe (audioparse_pad, audioprobe_id);
    }
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20201110/bb644b9e/attachment.htm>


More information about the gstreamer-devel mailing list