[FFmpeg-devel] [PATCH] delete the old segment file from hls list
Anshul
anshul.ffmpeg at gmail.com
Sat Aug 30 12:34:37 CEST 2014
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.
More information about the ffmpeg-devel
mailing list