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