目的
- 時系列で撮影した画像からタイムラプス動画を作りたい
- 動画を作るためだけにリネームはしたくない
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 画像があるディレクトリ
参考