Hatena::Groupnicovideo

にわかな奴の砂場

    使えそうなものがあれば適当にどうぞ。(自己責任的な意味で) 過去ログ

2009-01-03

[][][][]AviSynthで差分合成する 21:37 AviSynthで差分合成する - にわかな奴の砂場 を含むブックマーク はてなブックマーク - AviSynthで差分合成する - にわかな奴の砂場

内容としては「 ダンスの背景飛ばし……? - にわかな奴の砂場 - ニコニコ部」の応用となる訳ですが、AviSynth標準フィルタだと何かと使い辛いので関数を書いてみたりしたので、拙作をぺたり。自分用のローカルライブラリですが、公開する事で何かの役に立つかもしれませんので。

mylib.avs

#####
###  AviSynth用ローカル関数
#    

#
# EARTHSOFTDV : AviUtl用のPV3/4のDVファイルローダを使って読み込む為の関数.
# ※WarpSharpパッケージが必要.(cf.http://www.avisynth.info/?warpsharp%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8)
#
LoadAviUtlInputPlugin("C:\Program Files\EARTH SOFT\PV3 3.x\AviUtl\EARTH SOFT DV.aui", "EARTHSOFTDV")

#
# DiffMask : 2つのクリップの差分から生成した白黒256階調のクリップ(RGB32)を返す.
#            ※VerticalCleanerが必要.(cf.http://www.avisynth.info/?niiyan%2F2008-02-27)
#
#	s1, s2    … 差分抽出用のクリップ.同じ解像度である事が必要.
#	tolerance … 差分の許容誤差.内部的にはColorKeyMask()のパラメータとして利用.
#
function DiffMask (clip s1, clip s2, int "tolerance") {
	s1 = IsYUY2(s1) ? s1 : ConvertToYUY2(s1)
	s2 = IsYUY2(s2) ? s2 : ConvertToYUY2(s2)
	tolerance = default(tolerance, 0)

	e = Overlay(s1, s2, mode="difference").ColorYUV(off_y=-128).ConvertToRGB32()
	e = ColorKeyMask(e, $000000, tolerance)
	e = e.ShowAlpha().VerticalCleaner().VerticalCleaner().Greyscale()

	return e
}

#
# MaskedLayer : 前景にアルファチャネルを適用し,背景と重ねたクリップ(RGB32)を返す.
#
#	bg   … 背景となるクリップ.
#	fg   … 前景となるクリップ.アルファチャネルが適用される.
#	mask … アルファチャネルとなるクリップ.基本的に白黒256色.
#	※3クリップとも同一の解像度である事が必要.
#
function MaskedLayer (clip bg, clip fg, clip mask) {
	bg = IsRGB32(bg) ? bg : ConvertToRGB32(bg)
	fg = IsRGB32(fg) ? fg : ConvertToRGB32(fg)
	mask = IsRGB32(mask) ? mask : ConvertToRGB32(mask)

	fg = Mask(ResetMask(fg), mask)
	res = Layer(bg, fg, op="add")

	return res
}

使用例

キュンキュンメガネと大正リボンを同時に付けてみると言う。これは以下のようなAviSynthスクリプトで合成しています。

#
# 大正リボンのクリップにキュンキュンメガネのクリップを合成してみる
# ※ColorItが必要.(cf.http://www.avisynth.info/?%B1%C7%C1%FC%B8%FA%B2%CC#bce2e312)
#

#外部スクリプトのインポート.同フォルダに置くか,或いはフルパス指定
Import("mylib.avs")

#大正リボンのクリップ
ribon=EARTHSOFTDV("ribon.dv")
#キュンキュンメガネのクリップ
megane=EARTHSOFTDV("megane.dv")
#セピアサングラスのクリップ
sepisan=EARTHSOFTDV("sepisan.dv")

#メガネとセピサンの差分からマスク作成
mask=DiffMask(megane, sepisan)
#穴が埋まるまでマスクを膨張させる
mask=mask.Morpher(type="dilate").Morpher(type="dilate").Morpher(type="dilate").Morpher(type="dilate").Morpher(type="dilate").VerticalCleaner()
#穴が埋まったらマスクを収縮させる.ついでにエッジぼかし
mask=mask.Morpher(type="erode").Morpher(type="erode").Morpher(type="erode").Morpher(type="erode").Morpher(type="erode").Blur(1)

#目元を合成
MaskedLayer(ribon, megane, mask).ConvertBackToYUY2()

リボンの動画にメガネの動画の目元部分だけを重ねる為、メガネとセピアサングラスの動画差分を利用してマスクを作っていますが、そのままだと穴ぼこだらけで使えないので、ColorItプラグインフィルタMorpher()で穴を埋めています。

f:id:hdkINO33:20090103212934p:image

こんな感じ。で、後はこのマスクをメガネ動画のアルファチャネルとして適用し、リボンの動画と重ねてめでたく完成。1アングル作る為に3本録らなきゃいけないので時間も保管容量もバカになりません。それに加えて合成処理の遅い事と言ったら、8000フレームの処理が大体30分くらい。全自動なんで放っておけばいい訳でもありますが。

複数のアクセサリを合成する場合は同様の手順を重ねればいいだけですが、重ねて不自然の無い順番を探すのは結構めんどくさいです。*1

nukIM@S-2使えばいいんじゃね?

Exactly.

2008-05-21

[][]WindowsGIMPで複数ファイルを自動処理する 01:28 WindowsのGIMPで複数ファイルを自動処理する - にわかな奴の砂場 を含むブックマーク はてなブックマーク - WindowsのGIMPで複数ファイルを自動処理する - にわかな奴の砂場

追記(7/24)

WindowsのGUIでも使える「David's Batch Processor」と言うのがあるようです。自動カラー補正やアンシャープマスクなどを一律に掛けられるようなので、これを使いましょう。

下記はDBPではできない事をやりたい時だけ用いましょう。

概要

GIMPにはアクションレコーダが存在せず、またバッチ処理用にScript-Fuと言う機能は存在するがSchemeで書かないといけない為に難解*1であり、かと言ってアクションレコーダなScript-Fuも存在しない*2為に「GIMPを用いて複数ファイルを対象としたバッチ処理をする」のは異様にめんどくさいものである訳だが*3、何か閑だったので「複数ファイルを自動補正処理して書き出す何か」を書いてみた。

ちなみに書いたやつなんだが、自分の環境ではScript-Fuの関数内でimage,drawableをdefineしないとUnbound Variableが返ってきてしまい処理できなかった。スマートじゃないなあ……と言うかファイルを開くだけなのに相当な時間取られてしまった。こういうのはバッドノウハウじゃよー。

とりあえずかなりダサい実装なので、もっと気の利いた方法があったら教えて頂けると喜びます。俺が。

免責

本文の記述を元に行われた全ての作業より発生した事象について、筆者は全ての責任を負わないものとします。(棒読み)

必要なもの

実行においては、

  • ActivePerl。5.8.8で動作確認。
  • GIMP。2.4で動作確認。ちなみにProcedure Browserが無いと処理が書けない(リファレンス的な意味で)。

書き直しについては、

  • 英語。Procedure Browserの内容が何となく読める程度の。
  • Schemeの知識。とりあえず関数呼出・定義くらいは何となく判る程度の。

と言うところ。Perlの知識は別にいらない、「掛ける処理名」のところを任意名に変更するくらいだろうか。

使い方

  1. gimp-batch.pl」を%PATH%に含まれるディレクトリへ配置する。
  2. 「my-image-normalize.scm」を%HOMEDRIVE%%HOMEPATH%\.gimp-2.4\scripts\へ配置する。
  3. cmd.exeを起動し、処理対象のファイルが詰まっているディレクトリへ移動。
  4. 引き続き「gimp-batch.pl」をコマンドプロンプトより実行。

動作

gimp-batch.pl」で、取得されたファイルリストを使って一括処理用の「run-all.scm」を生成し、それをGIMPのバッチモードで実行している。生成されるコードは以下のようなもので、力技過ぎワロタと言う感じ。

(define (run-all)
	(my-image-normalize "H:\\tmp\\test\\seq2\\imas_0000.bmp" "H:\\tmp\\test\\seq2\\new\\imas_0000.bmp")
	(my-image-normalize "H:\\tmp\\test\\seq2\\imas_0001.bmp" "H:\\tmp\\test\\seq2\\new\\imas_0001.bmp")
	(my-image-normalize "H:\\tmp\\test\\seq2\\imas_0002.bmp" "H:\\tmp\\test\\seq2\\new\\imas_0002.bmp")
   :
	(my-image-normalize "H:\\tmp\\test\\seq2\\imas_7978.bmp" "H:\\tmp\\test\\seq2\\new\\imas_7978.bmp")
	(my-image-normalize "H:\\tmp\\test\\seq2\\imas_7979.bmp" "H:\\tmp\\test\\seq2\\new\\imas_7979.bmp")
	(my-image-normalize "H:\\tmp\\test\\seq2\\imas_7980.bmp" "H:\\tmp\\test\\seq2\\new\\imas_7980.bmp")
	(gimp-quit 0)
)
(script-fu-register "run-all"
	"/Xtns/Script-Fu/misc/run-all"
	"dummy for batch"
	"null"
	"null"
	"2000"
	""
)

改造と言うか任意処理の追加について

実際にスクリプトを書き始める前に画像を1枚使って、処理を見た目で確認する事。ここで使ったパラメータを後で書くスクリプトへのパラメータとして使用する*4ので、メモっておくと幸せになれるかも。

とりあえず今回のScript-Fuスクリプト

  • 入力ファイルを開く(file-*-load 或いは gimp-file-load)
  • 処理を書く(いろいろ)
  • 出力ファイルへ書き出す(file-*-save 或いは gimp-file-save)

と言う流れなので、Procedure Browserから使いたい処理を検索して、適宜パラメータを与えて「処理を書く」のところへ記述すればいい。言うまでも無い事だけど、上に書いた処理から実行されて、下にある処理は上の処理の結果を受けたものを処理する形になる。

注意事項

  • Windows XPの場合。MacとかLinuxとかだとまた違うのかも判らない。
  • 極めて遅い。1280x720のBMPを処理させたところ、660枚/25分と言う結果。plug-inな処理の別プロセス生成処理オーバーヘッドが大きい?ような気がする*5。自動色補正掛けるだけだったらPhotoshop Elementsの方が圧倒的に速い、けどあっちもそれほど安定している訳でもない。
  • 660ファイル処理したところでGIMPの確保メモリが2GBを突破して落ちたので、500ファイルくらいに抑えておくのが賢明。64bit版が欲しいなあ。

参考文献

GIMP の batch mode が上手く動かないよ~」→「その程度の処理ならImagemagick使えよ。このバカ」みたいな流れがパターン化してる気がしてきた。

これには完全に同意せざるを得ない。ImageMagickって自動HSV伸張あったっけ?

gimp-batch.pl - 一括処理用フロントエンドとしてのPerlスクリプト

実行時のカレントディレクトリ内にあるBMPファイルを一括取得して、(無い場合は作成し)newディレクトリへ処理結果を出力する、と言う流れ。%PATH%に含まれるディレクトリへ配置するか、フルパス実行で。

追記(7/24):一部記述誤りを修正。

use encoding 'shiftjis';
use strict;
use warnings;

# 掛ける処理名
my $sf_proc = 'my-image-normalize';

# Script-Fuのスクリプト置場 (基本的に%HOMEDRIVE%%HOMEPATH%\.gimp-2.4\scripts\)
my $sf_dir = $ENV{'HOMEDRIVE'} . $ENV{'HOMEPATH'} . '\\.gimp-2.4\\scripts\\';
# 一括処理用のSchemeスクリプト名
my $dummy = $sf_dir . 'run-all.scm';

# GIMP コマンドラインオプション
my $gimp = 'gimp-2.4.exe --no-interface --no-data --no-fonts --batch';

# カレントディレクトリの取得
my $path = qx{chdir};
$path =~ s/\\/\\\\/g;
chomp $path;
# 処理対象全ファイル取得
my @files = glob "*.bmp";

# 一括処理用の一時スクリプト作成
open my $out, '>', "$dummy";
print $out "(define (run-all)\n";
foreach (@files) {
	my $src = $path . '\\\\' . $_;
	my $dst = $path . '\\\\new\\\\' . $_;
	print $out "\t($sf_proc \"$src\" \"$dst\")\n";
}
print $out <<'TAIL';
	(gimp-quit 0)
)
(script-fu-register "run-all"
	"/Xtns/Script-Fu/misc/run-all"
	"dummy for batch"
	"null"
	"null"
	"2000"
	""
)
TAIL
close $out;

# 出力
if (!-d 'new') {mkdir 'new';}
system qq{$gimp "(run-all)"};

__END__

my-image-normalize.scm - Script-Fuで実行されるSchemeスクリプト

※%HOMEDRIVE%%HOMEPATH%\.gimp-2.4\scripts\へ配置して下さい。

BMPファイルを開いて、自動正規化して、自動HSV伸張して、アンシャープマスクを掛けて、別ディレクトリBMPで保存する、と言うだけの処理。自動ホワイトバランス補正も入れてみたけれど、コマ毎にバタつくのでコメントアウトしている。

(define (my-image-normalize inFile outFile)
; Load an image
	(define image)
	(set! image (car (file-bmp-load 1 inFile inFile)))
; get drawable
	(define drawable)
	(set! drawable (car (gimp-image-active-drawable image)))
; color normalize
	(plug-in-normalize 1 image drawable)
; hsv-auto-stretch
	(plug-in-autostretch-hsv 1 image drawable)
; whitebalance
;	(gimp-levels-stretch drawable)
; sharpness
	(plug-in-unsharp-mask 1 image drawable 1.0 0.5 40)
; save file
	(file-bmp-save 1 image drawable outFile outFile)
)

; Register our script with script-fu.
(script-fu-register "my-image-normalize"
	"/Xtns/Script-Fu/misc/my-image-normalize"
	"image normalizer"
	"Hide"
	"Hide"
	"2008"
	""
	SF-VALUE "inFile" "\"hoge.bmp\""
	SF-VALUE "outFile" "\"new\\hoge.bmp\""
)

*1UNIX系ならGIMP-Perlとかある。Windowsには無い

*2:古いGIMPで動くものはあった気もする

*3:ググってもズバリ、ってのにヒットする事は無かった印象。日本語資料少ないしね……

*4:アンシャープマスクとか

*5プラグインは個別のexeファイルとして存在

2007-09-29

[][] 小節とか拍をフレーム・サンプルの位置と対応付けるスクリプト 02:17  小節とか拍をフレーム・サンプルの位置と対応付けるスクリプト - にわかな奴の砂場 を含むブックマーク はてなブックマーク -  小節とか拍をフレーム・サンプルの位置と対応付けるスクリプト - にわかな奴の砂場

これは何?

音や動画を編集してると「あの小節の先頭って何フレーム目だっけ?」とか「サビのとこだけ抜いてループさせたいんだけどキレイに切れないなあ……」なんて思った事があった訳でして、そういう時に自分用に書いてみたものです。

……なんですが、動画については先駆者がいらっしゃいます。ので僭越ながら御紹介。

考え方

bpmと言うのは1分当たりの拍数なので、1拍の長さは1分をbpmで割ったものです。bpmが180なら1拍の長さは約0.333秒となります。また動画や音声は1秒当たり何サンプル(サンプリングレートとか言う)、という記録のされ方なので、60倍すれば1分分になります。30fpsの動画なら1分で1800サンプルになります。

1分=1800サンプルと表せると言う事は、1拍当たりのサンプル数は「サンプリングレート×60÷bpm」と言う事になりまして、この「1拍当たりのサンプル数」を足していけば、拍や小節の切れ目が何サンプル目なのか判りやすいんじゃね? と言うのが元にあります。

曲シンクロ的な意味も含めて、以下が大変参考になります。とりあえず読むべき。

使用上の注意

  • 御利用は自己責任でお願いします。改造は御自由に。転載は引用元を明記の上。笑
  • 1拍の長さはActivePerlが返してくるものをそのまま突っ込んでるので誤差は無視できる程度には小さくなってると思いますが、長尺(5分以上)のものでは試した事が無いので判りません。
  • 同期が取れなくても泣かない。

出力サンプル

左から順に、小節番号,小節開始時刻.サンプル,各拍開始サンプルです。

1小節の長さは「或る小節開始サンプル」から「次の小節開始サンプル-1」です。

C:hide$ana.pl -b 170 -c -r 30 -m 10 -t 8/8
tempo = 8/8
bpm = 340
sampling rate = 30
offset = 0
samples/beat = 5.29411764705882
samples/bar = 42.3529411764706

1       0:00.00         0:00.00 0:00.05 0:00.10 0:00.15 0:00.21 0:00.26 0:01.01 0:01.07
2       0:01.12         0:01.12 0:01.17 0:01.22 0:01.28 0:02.03 0:02.08 0:02.14 0:02.19
3       0:02.24         0:02.24 0:03.00 0:03.05 0:03.10 0:03.15 0:03.21 0:03.26 0:04.01
4       0:04.07         0:04.07 0:04.12 0:04.17 0:04.22 0:04.28 0:05.03 0:05.08 0:05.14
5       0:05.19         0:05.19 0:05.24 0:05.29 0:06.05 0:06.10 0:06.15 0:06.21 0:06.26
6       0:07.01         0:07.01 0:07.07 0:07.12 0:07.17 0:07.22 0:07.28 0:08.03 0:08.08
7       0:08.14         0:08.14 0:08.19 0:08.24 0:08.29 0:09.05 0:09.10 0:09.15 0:09.21
8       0:09.26         0:09.26 0:10.01 0:10.07 0:10.12 0:10.17 0:10.22 0:10.28 0:11.03
9       0:11.08         0:11.08 0:11.14 0:11.19 0:11.24 0:12.00 0:12.05 0:12.10 0:12.15
10      0:12.21         0:12.21 0:12.26 0:13.01 0:13.07 0:13.12 0:13.17 0:13.22 0:13.28

使い方(コマンド的な意味で

まずPerlの実行環境が必要です。適当にインストールしてください。

次に下のソースを適当に保存してCLI(Windowsならcmd.exeとか)で実行してください。オプションは以下があります。「数字」とある所に入れる数字は全て半角で。

-b 数字
bpmを指定します(少数可)。デフォルトは120。
-c
時間.余りサンプル で表示します。
-l 数字
サンプル数表示部の文字数を指定します。元々表示が崩れるのを嫌って付けたものでしたが、無駄機能化しています。デフォルトは15。
-m 数字
表示する最大小節行数を指定します。デフォルトは20。
-o 数字
開始オフセットサンプル数を指定します。デフォルトは0。
-r 数字
サンプリングレートを指定します(少数可)。デフォルトは44100。
-t m/n
曲のテンポを3/4のように、m/n形式で指定します。7/8とか13/16とかも処理できますが、あまり検証していません。デフォルトは4/4。

使い方(実践的な意味で

そのうち書く。

想定問答集

Excelとかで読める?
タブ区切りテキストとして読み込めばOKかもしれません。
何かずれてるんだけど?
オフセット指定か、或いはbpmが誤っています。執念で何とかしてください。
GUI無いの?
俺需要が無いのでありません。作る予定もありません(;´Д`)
shbang変じゃね?
ドザだから。

ソース

長いので折ります。へぼPerlerなので色々とボロいので注意。

#!c:/perl/bin/perl

use strict;
use warnings;

sub Padder;
sub Sample2Time;

my %sample;
my $chrono;

# default
my $bar_max = 20;
my $bpm     = 120;
my $maxlength = 15;
my $tempo = '4/4';
$sample{'offset'} = 0;
$sample{'rate'}   = 44100;

# set option
my $i;
for ($i=0; $i<=$#ARGV; $i++) {
	if    ("$ARGV[$i]" eq '-b') {$i++; $bpm       = $ARGV[$i]; chomp $bpm;}
	elsif ("$ARGV[$i]" eq '-c') {$chrono = 1;}
	elsif ("$ARGV[$i]" eq '-l') {$i++; $maxlength = int $ARGV[$i]; chomp $maxlength;}
	elsif ("$ARGV[$i]" eq '-m') {$i++; $bar_max   = int $ARGV[$i]; chomp $bar_max;}
	elsif ("$ARGV[$i]" eq '-o') {$i++; $sample{'offset'} = int $ARGV[$i]; chomp $sample{'offset'};}
	elsif ("$ARGV[$i]" eq '-r') {$i++; $sample{'rate'}   = $ARGV[$i]; chomp $sample{'rate'};}
	elsif ("$ARGV[$i]" eq '-t') {$i++; $tempo     = $ARGV[$i]; chomp $tempo;}
	else {die "invalid option:$ARGV[$i]\n";}
}

(my $beat, my $div) = split /\//, $tempo;
$bpm *= $div / 4;

$sample{'sum'} = $sample{'offset'};
$sample{'per_minute'} = $sample{'rate'} * 60;
$sample{'per_beat'} = $sample{'per_minute'} / $bpm;
$sample{'per_bar'} = $sample{'per_beat'} * $beat;

# print setting
print "tempo = ",$tempo,"\n";
print "bpm = ",$bpm,"\n";
print "sampling rate = ",$sample{'rate'},"\n";
print "offset = ",$sample{'offset'},"\n";
print "samples/beat = ",$sample{'per_beat'},"\n";
print "samples/bar = ",$sample{'per_bar'},"\n";
print "\n";

# print list
my $bar;
foreach $bar (1 .. $bar_max) {
	#print &Padder($bar, length $bar_max, 'space'),"\t";
	print $bar,"\t";
	print &Sample2Time(\%sample),"\t";

	foreach $i (1 .. $beat) {
		if ($chrono) {print "\t",&Sample2Time(\%sample);}
		else {print "\t",&Padder($sample{'sum'}, $maxlength, 'space');}
		$sample{'sum'} += $sample{'per_beat'};
	}
	print "\n";
}

exit 0;
# end main

# subroutine
sub Sample2Time {
	my $s = shift;
	my $totalsec = $s->{'sum'} / $s->{'rate'};
	my $min = int $totalsec / 60;
	my $sec = &Padder($totalsec % 60, 2, 'zero');
	my $mod = &Padder($s->{'sum'} % $s->{'rate'}, 2, 'zero');
	my $res = "$min" . ':' . "$sec" . '.' . "$mod";
	return $res;
}

sub Padder {
	my $s       = shift;
	my $maxlen  = shift;
	my $padchar = ' ';
	if ("$_[0]" eq 'zero') {$padchar = '0';}
	my $int = int($s + 0.5);

	my $strlen = length $int;
	if ($strlen < $maxlen) {
		my $padding;
		my $d = $maxlen - $strlen;
		foreach (1 .. $d) {$padding .= "$padchar";}
		$s = "$padding" . "$int";
	} else {
		$s = $int;
	}
	return $s;
}

__END__

2007-09-27

[][] 合わせたい曲のbpmからアイマスPVの再生速度を何%にしたらいいか表示するスクリプト 22:41  合わせたい曲のbpmからアイマスPVの再生速度を何%にしたらいいか表示するスクリプト - にわかな奴の砂場 を含むブックマーク はてなブックマーク -  合わせたい曲のbpmからアイマスPVの再生速度を何%にしたらいいか表示するスクリプト - にわかな奴の砂場

これは何?

表題の通り。いちいち計算するのがダルいので自分用に何となく書きました。とりあえず小数第三位まで表示。

アイマス曲のbpmは「無料ホームページ 無料レンタルサーバー land.to」を利用させて頂きました。多謝。

実行結果

22:22:18 C:hide$bpm.pl 170
bpm = 170
9:02 p.m.       :       250%
First Stage     :       115.646%
GO MY WAY!!     :       94.444%
Here we go!!    :       114.093%
My Best Friend  :       108.28%
THE iDOLM@STER  :       103.03%
relations       :       119.718%
おはよう!!朝ご飯:       111.842%
まっすぐ        :       139.344%
エージェント夜を往く:   95.505%
ポジティブ!    :       123.188%
太陽のジェラシー:       132.812%
思い出をありがとう:     127.819%
私はアイドル☆  :       101.19%
蒼い鳥          :       161.904%
魔法をかけて!   :       113.333%

ソース

#!C:/perl/bin/perl
use encoding 'shift-jis';
use strict;
use warnings;
my $bpm = shift || 120;
my %songs = (
	'THE iDOLM@STER  ' => 165,
	'太陽のジェラシー' => 128,
	'蒼い鳥          ' => 105,
	'First Stage     ' => 147,
	'おはよう!!朝ご飯' => 152,
	'魔法をかけて!   ' => 150,
	'9:02 p.m.       ' =>  68,
	'Here we go!!    ' => 149,
	'エージェント夜を往く' => 178,
	'ポジティブ!    ' => 138,
	'relations       ' => 142,
	'私はアイドル☆  ' => 168,
	'思い出をありがとう' => 133,
	'My Best Friend  ' => 157,
	'GO MY WAY!!     ' => 180,
	'まっすぐ        ' => 122,
);
print "bpm = $bpm\n";
foreach (sort keys %songs) {
	my $p = int(($bpm / $songs{$_}) * 100000) / 1000;
	print "$_:\t$p%\n";
}
__END__

2007-09-25で、作ってるの?

[][] HDDレコーダで録画→素材化 00:12  HDDレコーダで録画→素材化 - にわかな奴の砂場 を含むブックマーク はてなブックマーク -  HDDレコーダで録画→素材化 - にわかな奴の砂場

はじめに

HDDレコーダで録画した動画をPC上に取り込んで素材化するまでの流れです。

何でHDDレコーダを使ってるのかと言うと「既にあったから」。他の理由はありません。

あと飽くまで自分の場合です。参考になるのかどうかは謎。

使用機器

HDDレコーダで録画してDVD-RAMへ移す

箱とDIGAとをS映像ケーブルで接続して録画する。

箱の画面設定で「ワイドスクリーン」を指定。

DIGAの設定としては以下。画質優先。

  • 3次元Y/C」は「入」
  • 「記録音声モード」は「Dolby Digital」(いわゆるAC3)
  • 「録画モード」は「XP」(最高画質)

DVD-R高速ダビングモードとか設定変えてもあんまり変わらなかった。とりあえずXPのAC3で映像が容量使えるようにしておけばOKな雰囲気。ちなみに設定をいじっても30(29.97)fpsでしか録画できませんので、録る度に取得フレームが異なったりします。ちょっとだけ嫌かも。

で、録ったら適当にタイトル付けてDVD-RAMへダビング(タイトルを付けないとTMEで上手く認識できないようなので)。

DVD-VRのデータをMPEGファイルへ変換

DVD-RAMにダビングした動画をTMEを使ってPCへ取り込む。フリーソフトでもできるようなのだけれど、何かと面倒そう&TMEの変換速度が相当速いって事で、体験版使用後に購入した。

MPEG出力設定
  • 「出力モード」は「クリップ毎に出力」
  • 「出力ターゲット」は「一般的なMPEGファイル」
映像設定
音声設定

AviUtlでMPEG(MPEG2)→AVI(huffyuv)化

DirectShow File Reader プラグインffdshowでAviUtlにMPEGを食わせて、色々処理してAVIで出す。

ffdshowでは、

  • 「コーデック」の「MPEG2」を「libmpeg2」にする。

だけ。ポストプロセッシングを掛けたらかなりハイコントラストな焦げたような色になってしまったので、無効にしている(設定の問題;´Д`)。

AviUtlでは、

  • インターレース解除」は「自動」の「トップ→ボトム」
  • ノイズ除去フィルタ」を掛ける。「強さ=256,範囲=1,しきい値=30」
  • ノイズ除去(時間軸)フィルタ」を掛ける。「強さ=256,範囲=2,しきい値=40」
  • シャープフィルタ」を掛ける。「強さ=127,範囲=3,下限値=48,上限値=128」
  • 「Lanczos3拡大縮小(非SIMD)」で大体16:9になるようにリサイズ。私的にはXviD4PSPに突っ込んでもリサイズされない704x400にしている。
  • 「AVI出力」で、音声無しでHuffyuv(fastest)で出力。

フィルタ順位は上記の順通り。結構硬めの画質です。

とりあえずこれで終了

とりあえず原寸大のサンプルを載せておいたりしてみます。→

まあそんな訳で、ニコニコで高画質と言われてもソースレベルではどうって事は無いと言う事がお判り頂けたかと思います。(爆

エンコードについては……まあそのうちに(;´Д`)