how to create proper HLS pipeline

Andres Gonzalez andres.agoralabs at gmail.com
Wed Sep 22 15:53:51 UTC 2021


Just wanted to thank all of you guys for your responses. I really
appreciate all of the comments--they always help me increase my
understanding of GStreamer. Just to recap, the following pipeline does
indeed work:

 gst-launch-1.0   udpsrc port=50000 caps="video/mpegts,systemstream=true" !
tsdemux ! hlssink2 target-duration=5 playlist-location="playlist.m3u8"
location=segment_%05d.ts

In my application I had to manually link the tsdemux to the hlssink2. The
tsdemux has a *sometimes* src pad and the hlssink2 has a *request* sink pad
so they link at runtime.

Thanks again,
-Andres

On Tue, Sep 21, 2021 at 5:05 PM James via gstreamer-devel <
gstreamer-devel at lists.freedesktop.org> wrote:

>
>
> On 22 Sep 2021, at 3:08 am, Andres Gonzalez via gstreamer-devel <
> gstreamer-devel at lists.freedesktop.org> wrote:
>
> Hi Chris,
>
> Using a *tsparse* element after the udpsrc and before a hlssink2 (not
> hlssink) gives this runtime error:
>
> GStreamer-CRITICAL **: 18:42:53.362: Element splitmuxsink0 already has a
> pad named video, the behaviour of  gst_element_get_request_pad() for
> existing pads is undefined!
>
> But using a *tsdemux* after udpsrc and before hlssink2 does indeed work.
> This pipeline works great:
>
>  gst-launch-1.0   udpsrc port=50000 caps="video/mpegts,systemstream=true"
> ! tsdemux ! hlssink2 target-duration=5 playlist-location="playlist.m3u8"
> location=segment_%05d.ts
>
> However, when I code this pipeline up in my C++ application (using
> gst_element_factory_make(), gst_bin_add(), and gst_element_link()), I get
> that same runtime error I got when using tsparse.
>
> So the pipeline:     udpsrc  -->  tsdemux -->  hlssink2.    works when I
> use gst-launch.  But when I code it up manually, I get that runtime error.
>  So those 3 elements won't work using the typical   gst_element_link()  so
> some other pad linking is going on under the covers.
>
> How do I do the link manually so these 3 elements will link up properly?
>
> Thanks,
> -Andres
>
> On Mon, Sep 20, 2021 at 6:41 PM Chris Wine via gstreamer-devel <
> gstreamer-devel at lists.freedesktop.org> wrote:
>
>> It might be that hlssink wants to see keyframes and durations of all the
>> content so that it knows where to split... try adding a "tsparse" element
>> after udpsrc. If that doesn't work, you might have to demux the individual
>> audio/video streams, run them through their respective parsers, and then
>> use hlssink2 to remux them.
>>
>> --Chris
>>
>> On Mon, Sep 20, 2021 at 5:45 PM Andres Gonzalez via gstreamer-devel <
>> gstreamer-devel at lists.freedesktop.org> wrote:
>>
>>> Thanks for your response Chris.
>>>
>>> I tried your suggestion:
>>>
>>> gst-launch-1.0 udpsrc port=50000 caps="video/mpegts,systemstream=true" !
>>> hlssink target-duration=5 playlist-location="playlist.m3u8"
>>> location=segment.%03d.ts
>>>
>>> This pipeline is operational, however, it does not create the playlist
>>> and just generates a single segment file, and it keeps growing and
>>> growing.  I think the pipeline needs to know something about the video,
>>> otherwise how does it know if it has enough video in the segment file to
>>> match the specified target duration?
>>>
>>> In my application, I am using hlssink2 for the pipeline that is
>>> generating a new video stream (with appsrc, encoder, etc). But this
>>> pipeline has a udpsrc and so there isn't an encoder in the pipeline. That
>>> is the reason I am using hlssink instead of hlssink2 for this pipeline.
>>>
>>> -Andres
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Mon, Sep 20, 2021 at 3:14 PM Chris Wine via gstreamer-devel <
>>> gstreamer-devel at lists.freedesktop.org> wrote:
>>>
>>>> Hi Andres,
>>>>
>>>> I believe hlssink takes an mpeg transport stream, so you don't need to
>>>> have the tsdemux element in there unless you need to do something else to
>>>> the streams before remuxing them and sending them to hlssink. So maybe just
>>>> "udpsrc ! hlssink" (with properties of course) will give you want you're
>>>> looking for.
>>>>
>>>> For making sure the caps are correct, you should just be able to set
>>>> the "caps" property on udpsrc:
>>>> udpsrc caps="video/mpegts,systemstream=true"
>>>>
>>>> If you already have separate audio and video streams, I'd use hlssink2
>>>> which does the mpegts muxing internally.
>>>>
>>>> --Chris
>>>>
>>>> On Mon, Sep 20, 2021 at 4:00 PM Andres Gonzalez via gstreamer-devel <
>>>> gstreamer-devel at lists.freedesktop.org> wrote:
>>>>
>>>>> Just some additional info.  I am using gst-launch just to figure out
>>>>> what the appropriate elements should be. I have a C++ app that I develop
>>>>> where I code up the pipeline for my application. But since I am not even
>>>>> sure which elements should be in the pipeline, I am experimenting around
>>>>> with creating the pipeline with gst-launch.
>>>>> Thanks,
>>>>> -Andres
>>>>>
>>>>> On Mon, Sep 20, 2021 at 1:49 PM Andres Gonzalez <
>>>>> andres.agoralabs at gmail.com> wrote:
>>>>>
>>>>>> Hi,
>>>>>> I have a question about creating an HLS pipeline.  I am receiving a
>>>>>> MPEG-TS UDP stream and I want to create a pipeline that will receive the
>>>>>> UDP TS stream, and then create/publish  a corresponding HLS stream. For
>>>>>> example, something like this:
>>>>>>
>>>>>> gst-launch-1.0 udpsrc port=50000 ! tsdemux ! hlssink playlist-root=
>>>>>> http://192.168.0.100:8080 location=segment.%03d.ts
>>>>>>
>>>>>> This actually works and receives the UDP/TS stream and starts to
>>>>>> generate the segment_000.ts file.  But it never creates the playlist file
>>>>>> and keeps adding to the segment_000.ts file.
>>>>>>
>>>>>> I am assuming that I need to provide some caps information about the
>>>>>> video coming in on the UDP/TS stream but I am not sure how to do that.  So
>>>>>> could someone tell me what the pipeline should consist of to get this
>>>>>> working?
>>>>>>
>>>>>>
> What worked for me when struggling like this was to use the DOT debug to
> examine the pipeline in detail. Also I use the parse to build a pipeline eg
> pipeline = gst_parse_launch ("v4l2src name=source ! "
>                     "queue ! "
>                     "videoscale ! video/x-raw,width=768,height=576 ! "
>                     "videoconvert ! "
>                     "xvimagesink name=sink1 force-aspect-ratio=false
> sync=false", NULL);
> James
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210922/db39ea7b/attachment-0001.htm>


More information about the gstreamer-devel mailing list