[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