[FFmpeg-cvslog] hlsenc: expand hls_fmp4_init_filename with strftime()
Nikola Pajkovsky
git at videolan.org
Tue Dec 8 15:02:45 EET 2020
ffmpeg | branch: master | Nikola Pajkovsky <nikola at pajkovsky.cz> | Tue Oct 27 12:28:59 2020 +0100| [3ffed80ebadbd8c10167fd6297d0c2d4797ec6f7] | committer: liuqi05
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 at pajkovsky.cz>
Signed-off-by: liuqi05 <liuqi05 at kuaishou.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3ffed80ebadbd8c10167fd6297d0c2d4797ec6f7
---
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 813b4678f4..179b923951 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.
+ at example
+ffmpeg -i in.nut -hls_segment_type fmp4 -strftime 1 -hls_fmp4_init_filename "%s_init.mp4" out.m3u8
+ at end example
+This will produce init like this
+ at 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 9bce374605..cafe0e8c69 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -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);
More information about the ffmpeg-cvslog
mailing list