Steven Liu: > Nikola Pajkovsky <ni...@pajkis.cz> 于2020年10月23日周五 下午2:21写道: >> >> init.mp4 can be expanded with strftime() the same way as >> hls_segment_filename. >> >> Signed-off-by: Nikola Pajkovsky <ni...@pajkis.cz> >> --- >> v2: fix memleak on strftime failure >> >> doc/muxers.texi | 7 ++++++ >> libavformat/hlsenc.c | 54 +++++++++++++++++++++++++++++++++++--------- >> 2 files changed, 50 insertions(+), 11 deletions(-) >> >> diff --git a/doc/muxers.texi b/doc/muxers.texi >> index 813b4678f409..179b9239517b 100644 >> --- a/doc/muxers.texi >> +++ b/doc/muxers.texi >> @@ -859,6 +859,13 @@ fmp4 files may be used in HLS version 7 and above. >> @item hls_fmp4_init_filename @var{filename} >> Set filename to the fragment files header file, default filename is >> @file{init.mp4}. >> >> +Use @code{-strftime 1} on @var{filename} to expand the segment filename >> with localtime. >> +@example >> +ffmpeg -i in.nut -hls_segment_type fmp4 -strftime 1 >> -hls_fmp4_init_filename "%s_init.mp4" out.m3u8 >> +@end example >> +This will produce init like this >> +@file{1602678741_init.mp4} >> + >> @item hls_fmp4_init_resend >> Resend init file after m3u8 file refresh every time, default is @var{0}. >> >> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c >> index cb31d6aed7cf..5adc2da99b58 100644 >> --- a/libavformat/hlsenc.c >> +++ b/libavformat/hlsenc.c >> @@ -258,6 +258,29 @@ typedef struct HLSContext { >> int has_video_m3u8; /* has video stream m3u8 list */ >> } HLSContext; >> >> +static int strftime_expand(const char *fmt, char **dest) >> +{ >> + int r = 1; >> + time_t now0; >> + struct tm *tm, tmpbuf; >> + char *buf; >> + >> + buf = av_mallocz(MAX_URL_SIZE); >> + if (!buf) >> + return AVERROR(ENOMEM); >> + >> + time(&now0); >> + tm = localtime_r(&now0, &tmpbuf); >> + r = strftime(buf, MAX_URL_SIZE, fmt, tm); >> + if (!r) { >> + free(buf);
av_free, not free. >> + return AVERROR(EINVAL); >> + } >> + *dest = buf; >> + >> + return r; >> +} >> + >> static int hlsenc_io_open(AVFormatContext *s, AVIOContext **pb, char >> *filename, >> AVDictionary **options) >> { >> @@ -1614,19 +1637,15 @@ static int hls_start(AVFormatContext *s, >> VariantStream *vs) >> ff_format_set_url(oc, filename); >> } else { >> if (c->use_localtime) { >> - time_t now0; >> - struct tm *tm, tmpbuf; >> - int bufsize = strlen(vs->basename) + MAX_URL_SIZE; >> - char *buf = av_mallocz(bufsize); >> - if (!buf) >> - return AVERROR(ENOMEM); >> - time(&now0); >> - tm = localtime_r(&now0, &tmpbuf); >> - ff_format_set_url(oc, buf); >> - if (!strftime(oc->url, bufsize, vs->basename, tm)) { >> + int r; >> + char *expanded = NULL; >> + >> + r = strftime_expand(vs->basename, &expanded); >> + if (r < 0) { >> av_log(oc, AV_LOG_ERROR, "Could not get segment filename >> with strftime\n"); >> - return AVERROR(EINVAL); >> + return r; >> } >> + ff_format_set_url(oc, expanded); >> >> err = sls_flag_use_localtime_filename(oc, c, vs); >> if (err < 0) { >> @@ -2929,6 +2948,19 @@ static int hls_init(AVFormatContext *s) >> return ret; >> } >> >> + if (hls->use_localtime) { >> + int r; >> + char *expanded = NULL; >> + >> + r = strftime_expand(vs->fmp4_init_filename, &expanded); >> + if (r < 0) { >> + av_log(s, AV_LOG_ERROR, "Could not get segment >> filename with strftime\n"); >> + return r; >> + } >> + av_free(vs->fmp4_init_filename); >> + vs->fmp4_init_filename = expanded; >> + } >> + >> p = strrchr(vs->m3u8_name, '/'); >> if (p) { >> char tmp = *(++p); >> -- >> 2.28.0 >> >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> >> To unsubscribe, visit link above, or email >> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > > lgtm, waiting for other reviewer comments, will push after 24 hours if > there have no more comments, > > > Thanks > Steven > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".