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