Dynamic AudioMixer Pipelines
Mathieu Duponchelle
mathieu at centricular.com
Thu Mar 5 14:25:29 UTC 2020
appsrc has a "format" property, its default is "bytes". You probably want to use "time"?
On 3/5/20 4:15 AM, wunwunforever wrote:
> Hi All,
>
> I'm writing an application which dynamically adds and removes app_sources
> from an audiomixer element.
>
> I'm currently stuck on:
> audioaggregator
> gstaudioaggregator.c:1188:gst_audio_aggregator_sink_event:<mix> Segment of
> type bytes are not supported, only TIME segments are supported
>
> Followed by repeating lines of:
>
> ** (<unknown>:49832): CRITICAL **: 15:56:06.488: gst_audio_buffer_clip:
> assertion 'segment->format == GST_FORMAT_TIME || segment->format ==
> GST_FORMAT_DEFAULT' failed
> (<unknown>:49832): GStreamer-CRITICAL **: 15:56:06.488:
> gst_segment_to_running_time: assertion 'segment->format == format' failed
> (<unknown>:49832): GStreamer-CRITICAL **: 15:56:06.488:
> gst_segment_to_running_time: assertion 'segment->format == format' failed
>
> The function that adds the elements is:
>
> GstElement *
> gst_custom_add_audio_appsrc (GstElement * pipe)
> {
> GstPad *sinkpad, *convpad;
> GstElement *src, *conv, *sink;
> GstPadLinkReturn ret;
>
> src = gst_element_factory_make ("appsrc", "audio_src");
> g_object_set(src, "is-live", TRUE, "do-timestamp",TRUE, NULL);
> conv = gst_element_factory_make ("audiorate", NULL);
> sink = gst_bin_get_by_name (GST_BIN(pipe), "mix");
>
> gst_bin_add_many (GST_BIN (pipe), src, conv, NULL);
> gboolean r;
> r = gst_element_sync_state_with_parent (src);
> if (!r) {
> g_print("Couldn't sync src, with parent\n");
> }
> r = gst_element_sync_state_with_parent (conv);
> if (!r) {
> g_print("Couldn't sync conv, with parent\n");
> }
> r = gst_element_link_many (src, conv, NULL);
> if (!r) {
> g_print("Couldn't link many\n");
> }
> convpad = gst_element_get_static_pad(conv, "src");
> sinkpad = gst_element_get_request_pad (sink, "sink_%u");
> if (gst_pad_link (convpad, sinkpad) != GST_PAD_LINK_OK) {
> g_printerr ("mixer could not be linked.\n");
> return NULL;
> }
> gst_object_unref (convpad);
>
> return src;
> }
>
> This is called after the pipeline is already playing.
>
> From reading the documentation, it looks like the elements that are added,
> have not received a SEGMENT Event, so are unaware of the current segment, so
> fail to assign the current segment to the new buffers.
>
> How should I go about resolving this? Do I need to trigger a new Segment
> event, to propagate the current value to the new elements? If so, how do I
> best generate one to not interrupt playback of the pipeline?
>
> Thanks in advance,
>
>
>
>
>
> --
> Sent from: http://gstreamer-devel.966125.n4.nabble.com/
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
More information about the gstreamer-devel
mailing list