[FFmpeg-devel] [PATCH] delete the old segment file from hls list
Steven Liu
lingjiujianke at gmail.com
Thu Aug 21 10:51:12 CEST 2014
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
>
More information about the ffmpeg-devel
mailing list