[FFmpeg-devel] [PATCH] delete the old segment file from hls list

Steven Liu lingjiujianke at gmail.com
Mon Sep 1 05:28:43 CEST 2014


CC  Anshul

The Follow is the result of the parameter with -hls_wrap 7,It in the older
mail of this mail list.

When use the option  -hls_wrap 7
./ffmpeg -i shaolinzuqiu.rm -vcodec libx264 -preset ultrafast -an -f hls
-hls_wrap 7 a.m3u8
it dose not remove the nouse file:
[root at localhost ffmpeg]# ls *.ts;cat a.m3u8
a0.ts  a1.ts  a2.ts  a3.ts  a4.ts  a5.ts  a6.ts

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:20
#EXTINF:10.427075,
a6.ts
#EXTINF:10.427075,
a0.ts
#EXTINF:10.427075,
a1.ts
#EXTINF:10.427075,
a2.ts
#EXTINF:10.427075,
a3.ts


2014-08-30 18:34 GMT+08:00 Anshul <anshul.ffmpeg at gmail.com>:

> On August 30, 2014 8:57:12 AM IST, Steven Liu <lingjiujianke at gmail.com>
> wrote:
> >
> >On Aug 28, 2014, at 4:52 AM, Anshul <anshul.ffmpeg at gmail.com> wrote:
> >
> >> On August 22, 2014 8:01:20 AM IST, Steven Liu
> ><lingjiujianke at gmail.com> wrote:
> >>> repost new patch:
> >>>
> >>> when update the hls m3u8 list, the old file is not unlinked
> >>> this patch can do this operation
> >>> delete the old ts segment which not show in m3u8,
> >>> use hls_sync_list.
> >>>
> >>> Signed-off-by: Steven Liu <qi.liu at chinacache.com>
> >>> ---
> >>> libavformat/hlsenc.c |   15 ++++++++++++++-
> >>> 1 files changed, 14 insertions(+), 1 deletions(-)
> >>>
> >>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> >>> index 11f1e5b..fc1063e 100644
> >>> --- a/libavformat/hlsenc.c
> >>> +++ b/libavformat/hlsenc.c
> >>> @@ -30,6 +30,10 @@
> >>>
> >>> #include "avformat.h"
> >>> #include "internal.h"
> >>> +#if HAVE_UNISTD_H
> >>> +#include <unistd.h>
> >>> +#endif
> >>> +
> >>>
> >>> typedef struct HLSSegment {
> >>>    char filename[1024];
> >>> @@ -50,6 +54,7 @@ typedef struct HLSContext {
> >>>    float time;            // Set by a private option.
> >>>    int max_nb_segments;   // Set by a private option.
> >>>    int  wrap;             // Set by a private option.
> >>> +    int  sync_list;
> >>>
> >>>    int64_t recording_time;
> >>>    int has_video;
> >>> @@ -96,6 +101,7 @@ static int hls_mux_init(AVFormatContext *s)
> >>> static int hls_append_segment(HLSContext *hls, double duration)
> >>> {
> >>>    HLSSegment *en = av_malloc(sizeof(*en));
> >>> +    int ret = 0;
> >>>
> >>>    if (!en)
> >>>        return AVERROR(ENOMEM);
> >>> @@ -115,7 +121,13 @@ static int hls_append_segment(HLSContext *hls,
> >>> double
> >>> duration)
> >>> if (hls->max_nb_segments && hls->nb_entries >= hls->max_nb_segments)
> >{
> >>>        en = hls->segments;
> >>>        hls->segments = en->next;
> >>> -        av_free(en);
> >>> +        if (hls->sync_list) {
> >>> +            ret = unlink(en->filename);
> >>> +            if (ret < 0) {
> >>> +                av_log(hls->avf, AV_LOG_WARNING, "remove %s
> >failed\n",
> >>> en->filename);
> >>> +            }
> >>> +        }
> >>> +        av_free(en);
> >>>    } else
> >>>        hls->nb_entries++;
> >>>
> >>> @@ -340,6 +352,7 @@ static const AVOption options[] = {
> >>>    {"hls_list_size", "set maximum number of playlist entries",
> >>> OFFSET(max_nb_segments),    AV_OPT_TYPE_INT,    {.i64 = 5},     0,
> >>> INT_MAX,
> >>> E},
> >>>    {"hls_wrap",      "set number after which the index wraps",
> >>> OFFSET(wrap),    AV_OPT_TYPE_INT,    {.i64 = 0},     0, INT_MAX, E},
> >>>    {"hls_base_url",  "url to prepend to each playlist entry",
> >>> OFFSET(baseurl), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,       E},
> >>> +    {"hls_sync_list", "remove old ts segment for sync the file with
> >>> the
> >>> m3u8 list",  OFFSET(sync_list),    AV_OPT_TYPE_INT,    {.i64 = 0},
> >
> >>> 0,
> >>> INT_MAX, E},
> >>>    { NULL },
> >>> };
> >>>
> >>> --
> >>> 1.7.1
> >>>
> >>>
> >>>
> >>> 2014-08-21 16:51 GMT+08:00 Steven Liu <lingjiujianke at gmail.com>:
> >>>
> >>>> Hi Stefano,
> >>>> if unistd is not available under Linux,
> >>>> it will output error message when compile the source code.
> >>>>
> >>>>      [root at testrtmp ffmpeg]# make
> >>>> CC      libavformat/hlsenc.o
> >>>> libavformat/hlsenc.c: In function ‘hls_append_segment’:
> >>>> libavformat/hlsenc.c:125: error: implicit declaration of function
> >>> ‘unlink’
> >>>> make: *** [libavformat/hlsenc.o] Error 1
> >>>> [root at testrtmp ffmpeg]#
> >>>>
> >>>>
> >>>>
> >>>> the follow is the new patch:
> >>>>
> >>>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> >>>> index 11f1e5b..fc1063e 100644
> >>>>
> >>>> --- a/libavformat/hlsenc.c
> >>>> +++ b/libavformat/hlsenc.c
> >>>> @@ -30,6 +30,10 @@
> >>>>
> >>>> #include "avformat.h"
> >>>> #include "internal.h"
> >>>> +#if HAVE_UNISTD_H
> >>>> +#include <unistd.h>
> >>>> +#endif
> >>>> +
> >>>>
> >>>> typedef struct HLSSegment {
> >>>>     char filename[1024];
> >>>> @@ -50,6 +54,7 @@ typedef struct HLSContext {
> >>>>     float time;            // Set by a private option.
> >>>>     int max_nb_segments;   // Set by a private option.
> >>>>     int  wrap;             // Set by a private option.
> >>>> +    int  sync_list;        // Set by a private option.
> >>>>
> >>>>     int64_t recording_time;
> >>>>     int has_video;
> >>>> @@ -96,6 +101,7 @@ static int hls_mux_init(AVFormatContext *s)
> >>>>
> >>>> static int hls_append_segment(HLSContext *hls, double duration)
> >>>> {
> >>>>     HLSSegment *en = av_malloc(sizeof(*en));
> >>>> +       int ret = 0;
> >>>>
> >>>>     if (!en)
> >>>>         return AVERROR(ENOMEM);
> >>>> @@ -115,7 +121,13 @@ static int hls_append_segment(HLSContext *hls,
> >>> double
> >>>> duration)
> >>>>
> >>>>     if (hls->max_nb_segments && hls->nb_entries >=
> >>> hls->max_nb_segments) {
> >>>>         en = hls->segments;
> >>>>         hls->segments = en->next;
> >>>> -        av_free(en);
> >>>> +        if (hls->sync_list) {
> >>>> +            ret = unlink(en->filename);
> >>>> +            if (ret < 0) {
> >>>> +                av_log(hls->avf, AV_LOG_WARNING, "remove %s
> >>> failed\n",
> >>>> en->filename);
> >>>> +            }
> >>>> +        }
> >>>> +           av_free(en);
> >>>>     } else
> >>>>         hls->nb_entries++;
> >>>>
> >>>> @@ -340,6 +352,7 @@ static const AVOption options[] = {
> >>>>     {"hls_list_size", "set maximum number of playlist entries",
> >>>> OFFSET(max_nb_segments),    AV_OPT_TYPE_INT,    {.i64 = 5},     0,
> >>> INT_MAX,
> >>>> E},
> >>>>     {"hls_wrap",      "set number after which the index wraps",
> >>>> OFFSET(wrap),    AV_OPT_TYPE_INT,    {.i64 = 0},     0, INT_MAX,
> >E},
> >>>>     {"hls_base_url",  "url to prepend to each playlist entry",
> >>>> OFFSET(baseurl), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,
> >E},
> >>>> +    {"hls_sync_list", "remove old ts segment for sync the file
> >with
> >>> the
> >>>> m3u8 list",  OFFSET(sync_list),    AV_OPT_TYPE_INT,    {.i64 = 0},
> >
> >>> 0,
> >>>> INT_MAX, E},
> >>>>     { NULL },
> >>>> };
> >>>>
> >>>> If you want sync the file with the m3u8 list, please use the
> >>> hls_sync_list
> >>>> parameter, default it is 0, and !0 is enable the sync operation.
> >>>>
> >>>> Thanks,
> >>>>
> >>>>
> >>>>
> >>>> 2014-08-14 18:25 GMT+08:00 Stefano Sabatini <stefasab at gmail.com>:
> >>>>
> >>>> On date Monday 2014-08-11 17:39:37 +0800, Steven Liu encoded:
> >>>>>> Hi Guys,
> >>>>>>
> >>>>>>     The FFmpeg hls module can make m3u8 and ts, but it dosen't
> >>> delete
> >>>>> the
> >>>>>> old ts segment file.
> >>>>>>      If always run this module, the disk will full, so this patch
> >>> can
> >>>>> fix
> >>>>>> the problem.
> >>>>>>      When update the segment list m3u8 file, it will delete the
> >>> ts
> >>>>> segment
> >>>>>> out range from the list file.
> >>>>>>
> >>>>>>     before use this patch:
> >>>>>> [root at localhost ffmpeg]# ls *.ts *.m3u8
> >>>>>> a0.ts  a10.ts  a11.ts  a12.ts  a13.ts  a14.ts  a15.ts  a16.ts
> >>> a17.ts
> >>>>>> a18.ts  a19.ts  a1.ts  a20.ts  a2.ts  a3.ts  a4.ts  a5.ts  a6.ts
> >>> a7.ts
> >>>>>> a8.ts  a9.ts  a.m3u8
> >>>>>> [root at localhost ffmpeg]# cat a.m3u8
> >>>>>> #EXTM3U
> >>>>>> #EXT-X-VERSION:3
> >>>>>> #EXT-X-TARGETDURATION:11
> >>>>>> #EXT-X-MEDIA-SEQUENCE:16
> >>>>>> #EXTINF:10.427075,
> >>>>>> a16.ts
> >>>>>> #EXTINF:10.427075,
> >>>>>> a17.ts
> >>>>>> #EXTINF:10.427075,
> >>>>>> a18.ts
> >>>>>> #EXTINF:10.427075,
> >>>>>> a19.ts
> >>>>>> #EXTINF:3.670330,
> >>>>>> a20.ts
> >>>>>> #EXT-X-ENDLIST
> >>>>>> [root at localhost ffmpeg]#
> >>>>>>
> >>>>>> after use this patch:
> >>>>>> [root at localhost ffmpeg]# ls *.ts *.m3u8
> >>>>>> a10.ts  a11.ts  a12.ts  a13.ts  a9.ts  a.m3u8
> >>>>>> [root at localhost ffmpeg]# cat a.m3u8
> >>>>>> #EXTM3U
> >>>>>> #EXT-X-VERSION:3
> >>>>>> #EXT-X-TARGETDURATION:11
> >>>>>> #EXT-X-MEDIA-SEQUENCE:9
> >>>>>> #EXTINF:10.427075,
> >>>>>> a9.ts
> >>>>>> #EXTINF:10.427075,
> >>>>>> a10.ts
> >>>>>> #EXTINF:10.427075,
> >>>>>> a11.ts
> >>>>>> #EXTINF:10.427075,
> >>>>>> a12.ts
> >>>>>> #EXTINF:2.335665,
> >>>>>> a13.ts
> >>>>>> #EXT-X-ENDLIST
> >>>>>> [root at localhost ffmpeg]#
> >>>>>>
> >>>>>> -------------------------------------------
> >>>>>> The patch context:
> >>>>>>
> >>>>>> when update the hls m3u8 list, the old file is not unlinked
> >>>>>> this patch can do this operation
> >>>>>>
> >>>>>> Signed-off-by: Steven Liu <qi.liu at chinacache.com>
> >>>>>> ---
> >>>>>> libavformat/hlsenc.c |    5 +++++
> >>>>>> 1 files changed, 5 insertions(+), 0 deletions(-)
> >>>>>>
> >>>>>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> >>>>>> index 11f1e5b..2ee0970 100644
> >>>>>> --- a/libavformat/hlsenc.c
> >>>>>> +++ b/libavformat/hlsenc.c
> >>>>>> @@ -30,6 +30,10 @@
> >>>>>>
> >>>>>> #include "avformat.h"
> >>>>>> #include "internal.h"
> >>>>>> +#if HAVE_UNISTD_H
> >>>>>> +#include <unistd.h>
> >>>>>> +#endif
> >>>>>> +
> >>>>>>
> >>>>>> typedef struct HLSSegment {
> >>>>>>     char filename[1024];
> >>>>>> @@ -115,6 +119,7 @@ static int hls_append_segment(HLSContext
> >*hls,
> >>>>> double
> >>>>>> duration)
> >>>>>>     if (hls->max_nb_segments && hls->nb_entries >=
> >>>>> hls->max_nb_segments) {
> >>>>>>         en = hls->segments;
> >>>>>>         hls->segments = en->next;
> >>>>>> +        unlink(en->filename);
> >>>>>
> >>>>> Check for the return value, and log an explicit error message in
> >>> case
> >>>>> of failure.
> >>>>>
> >>>>>>         av_free(en);
> >>>>>>     } else
> >>>>>>         hls->nb_entries++;
> >>>>>
> >>>>> Also, in order not to alter the standard behavior, I think it
> >might
> >>> be
> >>>>> safer to add an option to enable this behavior. Also, what happens
> >>> if
> >>>>> unistd.h is not available?
> >>>>> --
> >>>>> FFmpeg = Frightening and Forgiving Monstrous Proud Elastic Gadget
> >>>>> _______________________________________________
> >>>>> ffmpeg-devel mailing list
> >>>>> ffmpeg-devel at ffmpeg.org
> >>>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >>>>>
> >>>>
> >>>>
> >>> _______________________________________________
> >>> ffmpeg-devel mailing list
> >>> ffmpeg-devel at ffmpeg.org
> >>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >>
> >> Why not use hls_wrap option, which gives you the same behavior.
> >>
> >> I achive same thing using hls_wrap.
> >>
> >> -Anshul
> >>
> >>
> >Hi Anshul,
> >
> >       Because if want remove the old segment ts file, must use hls_wrap
> and
> >hls_list_size, otherwise the hls_wrap can not remove the
> >       file which is not in the m3u8 list.
> >
> >       So this patch can do it by just one option.
> >
> >
> >Steven
> >_______________________________________________
> >ffmpeg-devel mailing list
> >ffmpeg-devel at ffmpeg.org
> >http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> I use av_dict_set(&opts, "hls_wrap", "5", 0);
> And it works for me without using list_size option directly, I set the
> parameter of hls_wrap what you intend for list_size.
>
> -Anshul
>
> --
> Sent from my Android device with K-9 Mail. Please excuse my brevity.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list