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

Steven Liu lq at chinaffmpeg.org
Tue Sep 25 18:18:25 EEST 2018



> On Sep 25, 2018, at 22:37, James Courtier-Dutton <james.dutton at gmail.com> wrote:
> 
> Updated patch.
> This one applies on top of
> commit bb660800a55f5171f77316941afe2e62534ee72c
> 
> 
> On 25 September 2018 at 15:00, Steven Liu <lq at chinaffmpeg.org> wrote:
> 
>> 
>> 
>>> On Sep 25, 2018, at 20:33, James Courtier-Dutton <james.dutton at gmail.com>
>> wrote:
>>> 
>>> On 25 September 2018 at 10:22, Moritz Barsnick <barsnick at gmx.net> wrote:
>>> 
>>>> 
>>>> Steven already posted a patch proposal to this list, factoring out the
>>>> function:
>>>> https://patchwork.ffmpeg.org/patch/10471/
>>>> http://ffmpeg.org/pipermail/ffmpeg-devel/2018-September/234538.html
>>>> 
>>>> 
>>> That looks fine by me. I can resubmit my segment.c patch once 10471
>> reaches
>>> master tree or at least somewhere I can cherry pick from.
>>> 
>>> Kind Regards
>>> 
>>> James
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> Okay, you can go on do this, i have pushed that patch.
>> 
>> Thanks
>> Steven
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> 
> <0001-avformat-segment-strftime-date-sub-directories.patch>_______________________________________________


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"

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);
+            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





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







More information about the ffmpeg-devel mailing list