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