Photo Gallery

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
AutoFrameSelect で、画質のいいフレームを選択してブレンドした動画と
逆に、すべて画質の悪いフレームを選択してブレンドした動画をエンコードし、比較しました。
フレーム選択以外、すべて同じ条件でエンコードを行っています。

ブレンドには BS11 版の「境界の彼方」 #01 ~ #04 を使用しました。

まずはエンコ後のプレビュー画像です。
左が高画質、右が低画質。

AutoFrameSelect.png



続いてエンコードログ抜粋。
上が高画質、下が低画質。

****** エンコードログ抽出 ******
x264 [info]: frame I:34 Avg QP:14.55 size: 98602 PSNR Mean Y:51.98 U:53.76 V:54.21 Avg:52.48 Global:51.79
x264 [info]: frame P:600 Avg QP:16.03 size: 50795 PSNR Mean Y:50.15 U:52.14 V:52.82 Avg:50.70 Global:50.26
x264 [info]: frame B:1523 Avg QP:17.77 size: 13257 PSNR Mean Y:48.55 U:50.99 V:51.83 Avg:49.22 Global:48.90
x264 [info]: 8x8 transform intra:75.3% inter:51.4%
x264 [info]: SSIM Mean Y:0.9914893 (20.700db)
x264 [info]: PSNR Mean Y:49.048 U:51.358 V:52.142 Avg:49.686 Global:49.276 kb/s:4803.69

****** エンコードログ抽出 ******
x264 [info]: frame I:35 Avg QP:14.72 size:121175 PSNR Mean Y:51.10 U:52.48 V:52.87 Avg:51.49 Global:50.81
x264 [info]: frame P:607 Avg QP:16.09 size: 54504 PSNR Mean Y:49.68 U:51.40 V:52.05 Avg:50.17 Global:49.78
x264 [info]: frame B:1515 Avg QP:17.82 size: 14294 PSNR Mean Y:48.35 U:50.68 V:51.48 Avg:49.00 Global:48.67
x264 [info]: 8x8 transform intra:76.9% inter:52.6%
x264 [info]: SSIM Mean Y:0.9908349 (20.379db)
x264 [info]: PSNR Mean Y:48.771 U:50.913 V:51.662 Avg:49.369 Global:48.986 kb/s:5244.73




最後にファイル容量の比較です。
上が高画質、下が低画質。

54.2MB
58.9MB

比べ物にならない程の画質差を叩き出しつつ、8% ほどの容量削減に成功。







関連記事
AutoFrameSelect - 高画質フレームの自動選択
指定したフレーム番号だけ別クリップのフレームを挿入する関数 (2)



引用元:TVアニメ「境界の彼方」
©鳥居なごむ・京都アニメーション/境界の彼方製作委員会


スポンサーサイト
OP のように、毎回同じ映像が流れるものに関しては、1 話分の映像ソースでエンコードするよりも、何話か録画してブレンドしたほうが綺麗な理由を書き綴ります。

放送局のエンコードの都合によって、同じ映像でもプルダウン方式が 3-2 だったり 2-3 だったりすることがありますが、両パターンの同一映像があれば、より綺麗なクリップを生成できる可能性が上がります。

以下の図では、網掛けのフレームがノイズが多いという過程で話を進めます。
実際の映像も、このように縞フレーム付近にノイズが乗ることが多いです。


■ 3-2 プルダウン


逆テレシネ前
3-2pulldown.jpg

DoubleWeave().SelectEvery(10, 0, 3, 6, 8)
3-2DoubleWeave_SelectEvery.jpg

逆テレシネ後
3-2p.jpg





■ 2-3 プルダウン


逆テレシネ前
2-3pulldown.jpg

DoubleWeave().SelectEvery(10, 0, 2, 5, 8)
2-3DoubleWeave_SelectEvery.jpg

逆テレシネ後
2-3p.jpg




上記の図のように、1本のソースではどう頑張ってもノイズフレームを混入してしまいます。
しかし、この 2 つのクリップ中の良質なフレームを掛け合わせることで、より綺麗なクリップが出来るというワケです。

3-2 は奇数、2-3 は偶数フレームに機会点がある、とパターンで覚えると捗ります。


2 つのクリップを掛け合わせるには、こちら の関数が便利です。





twitter
↑参考になったという方は、是非記事のツイートをお願いします


Tag:3-2pulldown 2-3pulldown


2 つのクリップをフレーム単位で画質チェックし、フレーム番号をリストアップします。
出力された関数を、そのまま AutoFrameSelect 関数から置き換えて貼り付ければ完了です。

■ STEP1 フレームをスキャンする


比較したい 2 つのクリップと、ログ出力先を指定します。
この状態でエンコードを空回ししてください。(全フレームをプレビューシークでも可能)

v1=AviSource("C:\encode\aaa_ep01_op.avi")
v2=AviSource("C:\encode\aaa_ep02_op.avi")
AutoFrameSelect(v1, v2, "C:\encode\aaa.log")
return last


■ STEP2 出力された関数を貼り付ける


C:\encode\aaa.log を開くと、既に出来上がった関数が書き込まれていますので
そのまま貼り付けます。

v1=AviSource("C:\encode\aaa_ep01_op.avi")
v2=AviSource("C:\encode\aaa_ep02_op.avi")
#~ AutoFrameSelect(v1, v2, "C:\encode\aaa.log")
TrimBlend(v1,v2,"""
2,
4,
6,
7,
8,
""")

return last


作業は以上です。
2 つのクリップの、画質が良いフレームを混ぜ合わせたファイルが出来上がります。
TrimBlend 関数を別途用意してください。


function AutoFrameSelect(clip v1, clip v2, string path) {
global sv1=v1.ConvertToYUY2().AntiComb(checkmode=true, pass1=16).ConvertToYV12()
global sv2=v2.ConvertToYUY2().AntiComb(checkmode=true, pass1=16).ConvertToYV12()
global path=path
WriteFileStart(v1, path, """ "TrimBlend(v1,v2," """, "chr(34)", "chr(34)", "chr(34)")
ScriptClip(v1, """ \
v1_v = AverageChromaV(sv1) \
v2_v = AverageChromaV(sv2) \
chr34 = chr(34) \
chr41 = chr(41) \
chr44 = chr(44) \
v1_v > v2_v ? WriteFile(path, "current_frame", "chr44").subtitle("v2") : last.subtitle("v1") \
current_frame==FrameCount(v1)-1 ? WriteFile(path, "chr34", "chr34", "chr34", "chr41") : last
""")
}








twitter
↑参考になったという方は、是非記事のツイートをお願いします



修正版です。
Replace 関数必須なので合わせて利用してください。

今回の修正に伴い、下記の表記形式でも正常に動作することを確認しました。

TrimBlend(v1,v2,"""
0,
1,
2,
2156
""")


以下の修正点があります。
・引数 list に改行コードが含まれている場合のバグ修正
・引数 list にフレーム番号 1 が含まれていた時にフレーム数が倍になるバグ修正

function TrimBlend(clip v1, clip v2, string list) {
list=Replace(list, chr(10), "")
list=RightStr(list, 1)=="," ? LeftStr(list,StrLen(list)-1) : list
list=FindStr(list, ",")==0 ? "" : MidStr(list, FindStr(list, ",")+1)
numstr=FindStr(list, ",")==0 ? list : LeftStr(list, FindStr(list, ",")-1)
num=Floor(value(numstr))
v1=num==0 ? v2.Trim(0,-1)++v1.Trim(1,0) : v1
v1=num==1 ? v1.Trim(0,-1)++v2.Trim(1,1)++v1.Trim(2,0) : v1
v1=num>=2 && num < FrameCount(v1)-1 ? v1.Trim(0,num-1)++v2.Trim(num,num)++v1.Trim(num+1,0) : v1
v1=num==FrameCount(v1)-1 ? v1.Trim(0,num-1)++v2.Trim(num,num) : v1
return StrLen(list)==0 ? v1 : TrimBlend(v1, v2, list)
}

function Replace(string str, string a, string b) {
str=FindStr(str, a)==0 ? str : LeftStr(str, FindStr(str, a)-1)+b+MidStr(str, FindStr(str, a)+1, StrLen(str)-FindStr(str, a))
return FindStr(str, a)==0 ? str : Replace(str, a, b)
}



関連記事
指定したフレーム番号だけ別クリップのフレームを挿入する関数



twitter
↑参考になったという方は、是非記事のツイートをお願いします


Tag:Trim クリップ ブレンド 結合


2 つのクリップをフレーム単位で画質チェックし、フレーム番号をリストアップします。
出力された関数を、そのまま AutoFrameSelect 関数から置き換えて貼り付ければ完了です。

■ STEP1 フレームをスキャンする


比較したい 2 つのクリップと、ログ出力先を指定します。
この状態でエンコードを空回ししてください。(全フレームをプレビューシークでも可能)

v1=AviSource("C:\encode\aaa_ep01_op.avi")
v2=AviSource("C:\encode\aaa_ep02_op.avi")
AutoFrameSelect(v1, v2, "C:\encode\aaa.log")
return last


■ STEP2 出力された関数を貼り付ける


C:\encode\aaa.log を開くと、既に出来上がった関数が書き込まれていますので
そのまま貼り付けます。

v1=AviSource("C:\encode\aaa_ep01_op.avi")
v2=AviSource("C:\encode\aaa_ep02_op.avi")
#~ AutoFrameSelect(v1, v2, "C:\encode\aaa.log")
TrimBlend(v1,v2,"""
2,
4,
6,
7,
8,
""")

return last


作業は以上です。
2 つのクリップの、画質が良いフレームを混ぜ合わせたファイルが出来上がります。
TrimBlend 関数を別途用意してください。


function AutoFrameSelect(clip v1, clip v2, string path) {
global sv1=v1.ConvertToYUY2().AntiComb(checkmode=true, pass1=16).ConvertToYV12()
global sv2=v2.ConvertToYUY2().AntiComb(checkmode=true, pass1=16).ConvertToYV12()
global path=path
WriteFileStart(v1, path, """ "TrimBlend(v1,v2," """, "chr(34)", "chr(34)", "chr(34)")
ScriptClip(v1, """ \
v1_v = AverageChromaV(sv1) \
v2_v = AverageChromaV(sv2) \
chr34 = chr(34) \
chr41 = chr(41) \
chr44 = chr(44) \
v1_v > v2_v ? WriteFile(path, "current_frame", "chr44").subtitle("v2") : last.subtitle("v1") \
current_frame==FrameCount(v1)-1 ? WriteFile(path, "chr34", "chr34", "chr34", "chr41") : last
""")
}








twitter
↑参考になったという方は、是非記事のツイートをお願いします



Tag:比較 プレビュー 画質 判定


TrimBlend の繰り返し処理版。
SelectEvery のように、指定の周期で処理を最終フレームまで繰り返します。

動作には、TrimBlend 関数が必要です。

TrimBlendRepeat(v1,v2,5,1)





function TrimBlendRepeat(clip v1, clip v2, int step_size, int swap, int "cursor", int "v1_count") {
v1_count=default(v1_count,FrameCount(v1))
cursor=default(cursor,0)
start=cursor*step_size
end=(cursor*step_size)+(step_size-1)
is_range=start<v1_count-1 && start<end && start+swap<=end
is_start=start==0
is_end=end>=v1_count-1
v3=is_range?
\ is_start?
\ TrimBlend(v1.Trim(start,end),v2.Trim(start,end),string(swap))++v1.Trim(end+1,0):
\ is_end?
\ v1.Trim(0,start-1)++TrimBlend(v1.Trim(start, 0),v2.Trim(start,0),string(swap)):
\ v1.Trim(0,start-1)++TrimBlend(v1.Trim(start, end),v2.Trim(start,end),string(swap))++v1.Trim(end+1,0):
\ v1
cursor=cursor+1
return is_range?TrimBlendRepeat(v3,v2,step_size,swap,cursor,v1_count):v3
}




関連記事
指定したフレーム番号だけ別クリップのフレームを挿入する関数
指定したフレーム番号だけ別クリップのフレームを挿入する関数 (2)


twitter
↑参考になったという方は、是非記事のツイートをお願いします

Tag:Trim クリップ ブレンド 結合



WHAT'S NEW?

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。