[FFmpeg-devel] [PATCH] libavformat/segment: strftime date sub-directories

Steven Liu lq at chinaffmpeg.org
Wed Sep 26 01:24:25 EEST 2018



> On Sep 26, 2018, at 00:52, James Courtier-Dutton <james.dutton at gmail.com> wrote:
> 
>> 
>> Automatically create sub-directories if needed based on date.
>> E.g.
>> ffmpeg ... -timelimit 2147483647 -f segment -strftime 1 -segment_time 10
>> "%Y/%m/%d/%Y-%m-%d_%H-%M-%S.mkv"
>> 
>> 
>> 
>> 
>> Maybe you want add an option named “strftime_mkdir” not
>> “use_localtime_mkdir”.
>> You should add the option describe into doc/muxer.texi
>> 
>> reference to: https://trac.ffmpeg.org/ticket/7393
>> 
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> 
>> Thanks
>> Steven
>> 
>> Hi Steven,
> 
> I don't understand what you are suggesting?


Signed-off-by: James Courtier-Dutton <James.Dutton at gmail.com>
---
libavformat/segment.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)

diff --git a/libavformat/segment.c b/libavformat/segment.c
index 7fb4dc7..57fce8d 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -200,12 +200,27 @@ static int set_segment_filename(AVFormatContext *s)
    if (seg->use_strftime) {
        time_t now0;
        struct tm *tm, tmpbuf;
+        const char *dir;
+        char *fn_copy;
        time(&now0);
        tm = localtime_r(&now0, &tmpbuf);
        if (!strftime(buf, sizeof(buf), s->url, tm)) {
            av_log(oc, AV_LOG_ERROR, "Could not get segment filename with strftime\n");
            return AVERROR(EINVAL);
        }
+        /* Automatically create directories if needed */
+        /* E.g. %Y/%m/%d/%Y-%m-%d_%H-%M-%S.mkv */
+        fn_copy = av_strdup(buf);
+        if (!fn_copy) {
+            return AVERROR(ENOMEM);
+        }
+        dir = av_dirname(fn_copy);
+        if (ff_mkdir_p(dir) == -1 && errno != EEXIST) {
+            av_log(oc, AV_LOG_ERROR, "Could not create directory %s with use_localtime_mkdir\n", dir);
==========look at here, what dose this error message mean?




+            av_free(fn_copy);
+            return AVERROR(errno);
+        }
+        av_free(fn_copy);
    } else if (av_get_frame_filename(buf, sizeof(buf),
                                     s->url, seg->segment_idx) < 0) {
        av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", s->url);
-- 
2.7.4



> There are no extra command line options to enable this feature.
> It just works it out from the format string.
> If you put a "/" in the format string, it creates the directories for you.
> As per my example command line above.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Thanks
Steven







More information about the ffmpeg-devel mailing list