1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FFmpeg-pythonでディレクトリ内にある画像から動画を作成する

Last updated at Posted at 2023-02-21

目的

  • 時系列で撮影した画像からタイムラプス動画を作りたい
    • 動画を作るためだけにリネームはしたくない

FFmpegを使うと連番画像から動画を作成できる、が

FFmpegを使えば、連番がついた画像から動画を作成することができる。

実行例
ffmpeg -framerate 10 -i 'img-%03d.jpeg' out.mkv

ただし、ファイルの命名規則によってはうまくいかない。

FFmpeg-pythonを使って作成

FFmpeg-pythonを使って作成する。動画の元になるファイルのリストをpathlibで作るようにすれば
ファイルの命名規則をあまり気にしなくても良くなる。

timelapse.py
import pathlib
import argparse
import ffmpeg as fp
import tempfile

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('pic_dir')
    parser.add_argument('--framerate',type=int,default = 30)
    parser.add_argument('--filter',type=str,default = None)
    parser.add_argument('--suffix',type=str,default = 'mp4')
    parser.add_argument('--filename',type=str,default = None)
    parser.add_argument('--qscale',type=int,default = 0)
    parser.add_argument('--output_path',type=str,default = None)

    args = parser.parse_args()

    pic_dir = pathlib.Path(args.pic_dir)

    if args.filename == None:
        filename = pic_dir.stem
    else:
        filename = args.filename

    if args.filter == None:
        expression = '**/*'
    else:
        expression ='**/*{}*'.format(args.filter)

    file_list = list(pic_dir.glob(expression))
    file_list = list(map(str,file_list))
    file_list = ["file '{}'".format(line) for line in file_list]


    with tempfile.TemporaryDirectory() as tmpdir:
        file_path = (pathlib.Path(tmpdir) / 'filelist.txt')

        with open(file_path,mode='w',encoding ='utf-8') as f:
            f.write('\n'.join(file_list))
        
        stream_input = fp.input(file_path, f='concat',r=args.framerate, safe=0)
        
        if args.output_path == None:
            output_path = pathlib.Path.cwd() / '{}.{}'.format(filename,args.suffix)
        else:
            output_path = pathlib.Path(args.output_path)
            
        stream_output = fp.output(stream_input,str(output_path), **{'qscale:v': args.qscale})
        fp.run(stream_output)

if __name__ == '__main__':
    main()

実行例
python timelapse.py 画像があるディレクトリ

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?