2010年3月4日木曜日

FFmpeg::Commandで動画から静止画の切り出し(WorkerManager)

スズキです。

今度は、動画から静止画の切り出しです。

一つ前の記事の「動画の切り取り」と同じような感じですが、
http://blog.suz-lab.com/2010/03/ffmpegcommandworkermanager.html
コードは下記のようになります。

--------【Perl】--------
use strict;
use warnings;
use base qw(TheSchwartz::Worker);
use TheSchwartz::Job;
use FFmpeg::Command;
use Log::Dispatch;
use constant BASE_PATH => "/var/www/html/master";

sub work {

  # ログの設定
  my $log = Log::Dispatch->new(outputs => [[
    "Screen",
    min_level => 'debug',
    stderr => 1,
    newline => 1
  ]]);

  # パラメータの取得
  my $class = shift;
  my TheSchwartz::Job $job = shift;
  my $material_id = $job->arg->{material_id};
  my $material_ext = "mp4";

  # 画像切り出し元の設定
  my $src_file = BASE_PATH . "/" . $material_id . "." . $material_ext;
  $log->debug("src_file: " . $src_file);
  my $ffmpeg = FFmpeg::Command->new();
  $ffmpeg->input_options({
    file => $src_file,
  });

  # 画像切り出し先の設定
  my $jpg_file = BASE_PATH . "/" . $material_id . ".jpg";
  $log->debug("jpg_file: " . $jpg_file);
  $ffmpeg->output_options({
    file => $jpg_file,
  });
  $ffmpeg->options(
    "-y", # FFmpegの問い合わせに自動でYesで返答
    "-an", # 音声の処理はしない
    "-ss" => 0, # 0秒時点を静止画に
    "-f" => "image2", # 画像として出力
    "-vframes" => 1 # 対象フレーム数
  );

  # FFmpegの実行
  if(!$ffmpeg->exec()){
    $log->debug("Failed:\n" . $ffmpeg->stderr());
    $job->failed($ffmpeg->stderr());
    return;
  }
  $log->debug("Completed:\n" . $ffmpeg->stderr());
  $job->completed();

}

sub max_retries { 3 }
sub retry_delay { 20 }

1;
--------

ポイントも、一つ前の記事と同様、下記となります。

> $ffmpeg->options(
>   "-y", # FFmpegの問い合わせに自動でYesで返答
>   "-an", # 音声の処理はしない
>   "-ss" => 0, # 0秒時点を静止画に
>   "-f" => "image2", # 画像として出力
>   "-vframes" => 1 # 対象フレーム数
> );

PerlでImageMagickまで終わったら、ちょっと気が楽になるなー、がんばろう...

--------
http://www.suz-lab.com

0 コメント: