mirror of https://git.ffmpeg.org/ffmpeg.git
hlsenc: expand hls_fmp4_init_filename with strftime()
the init.mp4 can be expanded with strftime the same way as hls_segment_filename. Signed-off-by: Nikola Pajkovsky <nikola@pajkovsky.cz> Signed-off-by: liuqi05 <liuqi05@kuaishou.com>
This commit is contained in:
parent
45a673ebee
commit
3ffed80eba
|
@ -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}.
|
||||
|
||||
|
|
|
@ -260,6 +260,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) {
|
||||
av_free(buf);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
*dest = buf;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int hlsenc_io_open(AVFormatContext *s, AVIOContext **pb, char *filename,
|
||||
AVDictionary **options)
|
||||
{
|
||||
|
@ -1687,19 +1710,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) {
|
||||
|
@ -3007,6 +3026,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);
|
||||
|
|
Loading…
Reference in New Issue