change "location" of filesrc element without breaking tcpserversink connection

Serhiy Stetskovych patriotyk at gmail.com
Mon Jul 29 06:54:11 PDT 2013


Thank you for so detailed explanation, I am not much familiar with
gstreamer so I don't understand some things. I was able to add event
hendler  and got all events. I was able to block and modify segment events.
But I can't understand when exactly I need to change the location, I get
two EOS events for video and audio. So when I am changing location in any
of them I got many errors.
Thank you


2013/7/26 Sergio Ortega <sortegagamero at gmail.com>

> Hi,
>
> What you are trying to do is simulating a live from a file, aren't you?
> You don't want to break the tcpserversink connection when you change the
> filesrc's location. Then you must do the next thing. You must install a
> pad-probe outside the decodebin or whatever demuxer you use. That pad probe
> must do several things.
>
> The first one is modifying the first segment event. That event will have
> the video's original duration. It must be modified to have 0 as start and
> -1 as end. In such way you won't let the final muxer to know the duration,
> and it will assume that video has no end ( you can, of course, put whatever
> duration you wan, of course, for example half of the first video and the
> whole of the second one).
>
> The second one is blocking the rest segment events which you will have
> when you replace the location. We will see later how to replace it.
>
> The third thing is blocking the flush events.
>
> The fourth thing is blocking the EOS events ( if you want to play a video
> until the end, of course).
>
> The fifth thing ( and this is very important) is modifying the  buffer's
> PTS and DTS. Several muxers ( like mp4mux or oggmux) will multiplex a video
> and an audio depending on each PTS and DTS frame. If they detect that
> repeated PTS's or DTS's, they will discard the buffer, so in the best case
> you will see the video delayed ( in the worst you will see nothing but
> errors in the logs). Think that video and audio have their own PTS's and
> DTS's, but they are related when you replace a file ( at the end both files
> must maintain the synchronization).
>
> And now how to change a file. First of all emit a flush start and a flush
> end in the filesrc to clean the buffers. After it, put filesrc and the
> demuxer or the decodebin to NULL, change filesrc's location and put those
> elements again into PLAYING state.
>
> Watch out with the events and the DTS's!!
>
> 2013/7/26 Serhiy Stetskovych <patriotyk at gmail.com>
>
>> I think the second option with locking might help me but I don't
>> understand how to use it.
>>
>>
>> 2013/7/25 Serhiy Stetskovych <patriotyk at gmail.com>
>>
>>> Just investigated and found that after changing location, stream begins
>>> with new webm header. So Is it possible to create one stream from several
>>> files?
>>>
>>>
>>> 2013/7/25 Serhiy Stetskovych <patriotyk at gmail.com>
>>>
>>>> Thank you,
>>>> I have tried with state READY and thought it don't work, but problem
>>>> wasn't in connection. Looks like when file reaches end, gstreamer sends
>>>> some end information, or there is some gap between streams or something
>>>> else. Because connections still alive, but video didn't displays in
>>>> browser, it begin playing again after refresh(reconnect)
>>>>
>>>>
>>>> 2013/7/25 Stirling Westrup <swestrup at gmail.com>
>>>>
>>>>>  On Thu, Jul 25, 2013 at 6:44 AM, Serhiy Stetskovych <
>>>>> patriotyk at gmail.com> wrote:
>>>>>
>>>>>> Hello, I have a problem with changing media file in filesrc. After
>>>>>> finishing playing one file I get event and in this point I need change
>>>>>> media file to another but without breaking clients connected to
>>>>>> tcpserversink. I can change file only after setting STATE_NULL, and  then
>>>>>> setting back to STATE_PLAYING. But this breaks all my connections.
>>>>>>
>>>>>> Actually I use multifdsink with writing to sockets, but in
>>>>>> explanation above I wrote about tcpserversink because It is easier to
>>>>>> explain, but I think it doesnt matter.
>>>>>> <http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel>
>>>>>>
>>>>> You have two options. First, you can change the media file in filesrc
>>>>> when you are in STATE_READY rather than STATE_NULL. You only really need to
>>>>> go into STATE_NULL when you are about to dismantle your pipeline (ie for
>>>>> program cleanup).
>>>>>
>>>>> If for some reason you have to put filesrc in a state that causes your
>>>>> sink to perform an action you don't like, you can LOCK the state of the
>>>>> sink so it ignores requests to change state. This is done with one of the
>>>>> gst_element_... function calls.
>>>>>
>>>>>
>>>>> --
>>>>> Stirling Westrup
>>>>> Programmer, Entrepreneur.
>>>>> https://www.linkedin.com/e/fpf/77228
>>>>> http://www.linkedin.com/in/swestrup
>>>>> http://technaut.livejournal.com
>>>>> http://sourceforge.net/users/stirlingwestrup
>>>>>
>>>>> _______________________________________________
>>>>> gstreamer-devel mailing list
>>>>> gstreamer-devel at lists.freedesktop.org
>>>>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>>>
>>>>>
>>>>
>>>
>>
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>
>>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20130729/e9210657/attachment.html>


More information about the gstreamer-devel mailing list