soraなりの日々 - fc2 -

こころにひっかかったもの

[wii]wii を media center にする - 2.ごにょごにょ編 -

前回前々回の続き。

そんで、前回 ffmpeg と ruby をインストールした人だけ。

このエントリーをはてなブックマークに追加
実は、wii でストリーミングで見るためには、
動画ファイルを youtube とかと同じで flv 形式に
しないといけない。

これがまた面倒なのよ。
動画ファイル(.avi とか)を変換する時間もかかるしね。
手動でなんかやってられない。

なので、ffmpeg を使って ruby で自動で変換する
ツールを作った。
あるフォルダに置くと既に変換したファイルがあるかを見て、
なければ、flv 形式に変換してくれる。
(30分単位で監視)

ほとんどというか、変換するところすべてココを参考にして
作ってみた。
mpwii 含め、素敵なものを作ってくれた、作者さんに感謝!)

以下がソース↓

class FfmpegWrapper
  @@profiles = {
    # PC flv High
    '.flv' => {
      :f       => 'flv',        # file suffix
      :vcodec  => 'flv',        # codec
      :s       => '320x240',    # resolution
      :r       => 30,           # frame rate
      :b       => '384k',       # video bit rate
      :acodec  => 'libmp3lame', # audio codec
      :ar      => '11025',
      :ab      => '32k',        # audio bit rate
    },
  }

  def initialize()
  end

  def setandgo(setting)
    set(setting)
    run()
  end

  def set(setting)
    #setting{ :ffmpeg  => '/path/to/ffmpeg',
    #         :ifile   => '/path/to/inputfile',
    #         :ofile   => 'outputfile',
    #         :profile => 'targetName', }
    @ffmpegOptions = Array.new
    @@profiles[ setting[:target] ].each{ |k,v|
      @ffmpegOptions.push(%Q{ -#{k} #{v}})
    }
    @cmd = Array.new
    @cmd.push %Q{#{setting[:ffmpeg]} -i "#{setting[:ifile]}" #{@ffmpegOptions} "#{setting[:ofile]}" }
  end

  def run()
    stdout = ""
    io = IO.popen("#{@cmd}", "r");
    io.each("\n") {|line|
      stdout << line
    }
    io.close
    return stdout
  end

  # 登録プロファイルのKeyリストを返す
  def profiles()
    rtnarr = Array.new()
    @@profiles.each{ |k,v|
      rtnarr.push(k)
    }
    return rtnarr
  end
end


FFMEPEG_PATH = 'install path/ffmpeg.exe' # ffmpeg をインストールしたディレクトリ
WORK_DIR = 'work directory/' # ワーク用ディレクトリ ここに置いたファイルを自動で変換
CONTENTS_DIR = 'contents directory/' # 展開先ディレクトリ mpwii の "pic" ディレクトリ配下を指定

def create_flvfile(ffmpeg, targets, basefile, fname)
  setting = Hash.new
  setting[:ffmpeg] = FFMEPEG_PATH
  setting[:ifile] = WORK_DIR + basefile

  targets.each{ |target|
    setting[:ofile] = CONTENTS_DIR + fname + target
    setting[:target] = target
    ffmpeg.setandgo(setting)
    puts 'completed!'
    sleep(5)
  }
end

def is_converted?(fname)
  Dir::glob(CONTENTS_DIR + fname + ".*").each {|f|
    return true
  }
  return false
end

ffmpeg = FfmpegWrapper.new()
targets = ffmpeg.profiles()
entries = Dir::entries(WORK_DIR)

loop do
  entries = Dir::entries(WORK_DIR) ← 修正 2008/03/02

  entries = entries.sort_by {|fname| File.mtime(File.join(WORK_DIR, fname)) }
  entries.each {|file|
    if File.file?(WORK_DIR + file) && File.extname(WORK_DIR + file) != "" then
      name = File.basename(file, ".*")
      if !is_converted?(name) then
        create_flvfile(ffmpeg, targets, file, name)
      end
    end
  }
  sleep(1800)
end



で、実際動かしているところ↓
conv_ffmpeg


実際、半日動かしてみてなかなか良い感じ。
ただ、肝心のサーバ側が若干不安定。

やっぱ、"モンスター"って名前付けたのは伊達じゃない?? orz

2008/03/02 ソース修正
初歩的な間違いをしてたので、修正しました。
このエントリーをはてなブックマークに追加

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sora2hs.blog70.fc2.com/tb.php/263-80c4158f
この記事にトラックバックする(FC2ブログユーザー)