ffmpegの画像重視エンコードラッパー
ffmpegを利用した、PS3でも再生可能なH.264/AACのエンコードオプション付きラッパーです。
変換したいファイルを引数で渡すと、mp4ファイルが作成されます。最初に動画の画素数を取得して、bitレートを変更します。
変換したいファイルを引数で渡すと、mp4ファイルが作成されます。最初に動画の画素数を取得して、bitレートを変更します。
#!/usr/bin/perl
use Getopt::Std;
use File::Basename;
%opts = ();
getopts ("htvsacn", \%opts);
if ($opts{"h"}) {
print "ffmpeg.pl [option] movie_file\n";
print "-h help\n";
print "-t test\n";
print "-v video encode only\n";
print "-s 4:3->16:9\n";
print "-a audio encode only\n";
print "-c aac out\n";
print "-n analog\n";
}
foreach (@ARGV) {
print "-------------------------------------------------------------------------------------\n";
# 引数取得
$srcfile = $_;
# 出力ファイル名生成
$regex_suffix = qw/\.[^\.]+$/;
($name, $path, $suffix) = fileparse($srcfile, $regex_suffix);
$tgtfile = $name . ".mp4";
printf("srcfile=$srcfile\n");
printf("tgtfile=$tgtfile\n");
# 画像サイズ取得
@tmp = `ffmpeg -i "$srcfile" 2>&1`;
$srcsize = "";
foreach (@tmp) {
chomp;
# print "$_\n";
if (/Stream.*Video.* (\d+x\d+)/) { $srcsize = $1; }
}
# アスペクト比、ビットレート算出
@tmp = split(/x/, $srcsize);
if ($opts{"s"}) {
$tmp[1] = int ($tmp[1] / 9);
$tmp[0] = $tmp[1] * 16;
$tmp[1] = $tmp[1] * 9;
$srcsize = "$tmp[0]x$tmp[1]";
}
$bitrate = ((int $tmp[0])*(int $tmp[1])/200);
printf("srcsize=$srcsize\n");
printf("bitrate=$bitrate\n");
if ($srcsize eq "") { exit; }
# オーディオチャンネル数
$ac = "2";
if ($opts{"n"}) {
$ac = "1";
}
# メインオプション
$mopt = "-y
-f mp4
-threads 2 ";
# ビデオオプション
$vopt = "-vcodec libx264
-flags loop+bitexact
-flags2 mixed_refs
-trellis 2
-g 300
-keyint_min 25
-sc_threshold 40
-subq 7
-partitions parti4x4+parti8x8+partp4x4+partp8x8+partb8x8
-me_method esa
-me_range 21
-cmp chroma
-refs 6
-deblockbeta 0
-deblockalpha 0
-bufsize 10000k
-maxrate 10000k
-qcomp 0.6
-qmin 21
-qmax 51
-qdiff 4
-deinterlace
-level 42
-coder 1
-r 30000/1001
-s ${srcsize}
-b ${bitrate}k
-bt ${bitrate}k ";
if ($opts{"a"}) { $vopt = "-vcodec copy "; }
if ($opts{"c"}) { $vopt = "-vn "; }
# オーディオオプション
$aopt = "-acodec libfaac
-ac $ac
-ar 48000
-ab 128k ";
if ($opts{"v"}) { $aopt = "-acodec copy "; }
# 全オプション
$option = "$mopt$vopt$aopt";
$option =~ s/\n/ /g;
$option =~ s/ +/ /g;
# プログラム実行
if ($srcfile ne $tgtfile) {
print "ffmpeg -i \"$srcfile\" $option \"$tgtfile\"\n";
if (!$opts{"t"}) { system "ffmpeg -i \"$srcfile\" $option \"$tgtfile\""; }
}
}
コメント
コメントの投稿

