On August 30, 2014 8:57:12 AM IST, Steven Liu <lingjiujia...@gmail.com> wrote: > >On Aug 28, 2014, at 4:52 AM, Anshul <anshul.ffm...@gmail.com> wrote: > >> On August 22, 2014 8:01:20 AM IST, Steven Liu ><lingjiujia...@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....@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 <lingjiujia...@gmail.com>: >>> >>>> Hi Stefano, >>>> if unistd is not available under Linux, >>>> it will output error message when compile the source code. >>>> >>>> [root@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@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 <stefa...@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@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@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@localhost ffmpeg]# >>>>>> >>>>>> after use this patch: >>>>>> [root@localhost ffmpeg]# ls *.ts *.m3u8 >>>>>> a10.ts a11.ts a12.ts a13.ts a9.ts a.m3u8 >>>>>> [root@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@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....@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@ffmpeg.org >>>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>>> >>>> >>>> >>> _______________________________________________ >>> ffmpeg-devel mailing list >>> ffmpeg-devel@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@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@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel