金子邦彦研究室プログラミングRuby プログラミング複数の静止画像から動画像の生成(Ruby を使用)

複数の静止画像から動画像の生成(Ruby を使用)

#! ruby -Ks
# coding: windows-31j

# usage: ruby genavi.rb filelist.rb 1024x768 hoge.avi    avi
#        ruby genavi.rb [file name] [size]   [file name] [sub directory name]

# This program 
# generate AVI file

# generate image file list
#   input : a YAML file that discribe pattern(s) of file names
#           [example of "filelist.rb"]
#           $a = <<-EOS
#           - path: /home/www/teaimage/20100524syouhin
#             pattern: *.JPG
#           - path: /home/www/teaimage/20100524syouhin_data
#             pattern: *.JPG
#           EOS
#   output : AVI file

require 'rubygems'
require 'progressbar'
require 'yaml'
require 'digest/sha2'

load ARGV[0] 
avi_size = ARGV[1] 
avi_file_name = ARGV[2] 
avi_sub_dir = ARGV[3] 


b = YAML.load( $a )

for i in b
  # from a pattern to a file list
  files = Dir.glob( i["path"] + "/" + i["pattern"] ).sort
  progress_bar = ProgressBar.new( File.basename(i["path"]), files.length )
  # create thumbnails directory 
  if i["path"][0] = "/" then
    path = i["path"]
  else
    path = Dir.pwd + "/" + i["path"]
  end

  # generate a sequence of images whose file name starts from the "0001". and change the image size
  # 0001 から開始する連番画像に変える. ついでにサイズを変える
  system("rm -f /tmp/image*.png")
  k=1
  for j in files
    name = sprintf( "/tmp/image%04d.png", k )
    system( "convert " + j + " -resize " + avi_size + " " + name )
    k = k + 1
    progress_bar.inc
  end
  progress_bar.finish

  # "-r 1" is frame rate
  # -r 1 はフレームレート
  avi_dir = path + "/" + avi_sub_dir
  system("mkdir",  avi_dir)
  system( "rm -f " + avi_dir + "/" + avi_file_name )
  system( "ffmpeg -r 2 -i /tmp/image%04d.png -vcodec mjpeg -sameq " + avi_dir + "/" + avi_file_name )
end

使用法の例

  1. まず、ファイルリストを記述したファイルを作る。 ファイル名は何でも良い

    [image]
  2. ファイルリストを読み込ませる

    作成される動画ファイルのサイズは 1024x768, ファイル名は hoge.avi, サブディレクトリは avi に設定している

    [image]
  3. できた動画ファイルを確認する
    mplayer hoge.avi