How do I render a video from a list of time-stamped images?

后端 未结 2 1764
失恋的感觉
失恋的感觉 2021-01-11 13:12

I have a directory full of images following the pattern .png, where represents milliseconds elapsed since the fi

相关标签:
2条回答
  • 2021-01-11 13:56

    Following LordNeckbeard's suggestion to supply the duration directive to ffmpeg's concat demuxer using the time duration syntax, input.txt looks like this:

    file '0.png'
    duration 0.097
    file '97.png'
    duration 0.081
    file '178.png'
    duration 0.064
    file '242.png'
    duration 0.054
    file '296.png'
    duration 0.067
    file '363.png'
    

    Now ffmpeg handles the variable framerate.

    ffmpeg -f concat -i input.txt output.webm
    

    Here is the C# snippet that constructs input.txt:

    Frame previousFrame = null;
    
    foreach (Frame frame in frames)
    {
        if (previousFrame != null)
        {
            TimeSpan diff = frame.ElapsedPosition - previousFrame.ElapsedPosition;
            writer.WriteLine("duration {0}", diff.TotalSeconds);
        }
    
        writer.WriteLine("file '{0}'", frame.FullName);
        previousFrame = frame;
    }
    
    0 讨论(0)
  • 2021-01-11 14:04

    Appears your images are non standard frame rate...One option would be to duplicate the appropriate image "once per millisecond" [i.e. for

     file '0.png'
     file '97.png'
    

    duplicate file 0.png 96 times, so it becomes 0.png 1.png 2.png etc. (or use symlinks, if on linux).

    Then you can combine them using the normal image inputter [with input rate of 1ms/frame]. https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images

    0 讨论(0)
提交回复
热议问题