1read 100read
2013年08月DTV480: お前らのショボイAvisynthスクリプト貼ってください part4 (119)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
お前らのショボイAvisynthスクリプト貼ってください part4 (119)
TS保存派 VS エンコ保存派 Round3 (160)
日本の地上デジタル放送は糞 (192)
【Win8】TS抜きハード・ソフトのWindows8対応状況 (451)
gainをアンインストールできないです 涙 (137)
Canopus QSTVシリーズ Part4 (112)
お前らのショボイAvisynthスクリプト貼ってください part4
1 :2009/03/31 〜 最終レス :2013/07/17 AviSynth Wiki http://www.avisynth.info/ AviSynth Blog rev.2 http://d.hatena.ne.jp/avisynth/ 本スレ Avisynthを絶讃ιょぅょ Part26 http://pc11.2ch.net/test/read.cgi/avi/1228216385/ 過去スレ Part 3 http://pc11.2ch.net/test/read.cgi/avi/1234959794/ Part 2 http://pc11.2ch.net/test/read.cgi/avi/1153487392/ Part 1 http://pc8.2ch.net/test/read.cgi/avi/1030537641/
2 : 主なスクリプト(ユーザー定義関数)とか・・・ http://www.avisynth.info/?%A5%E6%A1%BC%A5%B6%A1%BC%C4%EA%B5%C1%B4%D8%BF%F4
3 : ε ⌒ヘ⌒ヽフ ( ( ・ω・) スレ建てd しー し─J
4 : 1乙
5 : ほす
6 : ほ
7 : し
8 : function MVDFTDenoise( clip clip, float "sigma", bool "Y", bool "U", bool "V" ) { sigma = default( sigma, 2.0 ) Y = default( Y, true ) U = default( U, true ) V = default( V, true ) super = clip.MSuper vf1 = super.MAnalyse( isb=false, overlap=4 ) vf2 = super.MAnalyse( isb=false, delta=2, overlap=4 ) vb1 = super.MAnalyse( isb=true, overlap=4 ) vb2 = super.MAnalyse( isb=true, delta=2, overlap=4 ) interleave( MCompensate( clip, super, vf2, thSCD1=800 )\ , MCompensate( clip, super, vf1, thSCD1=800 )\ , clip\ , MCompensate( clip, super, vb1,thSCD1=800 )\ , MCompensate( clip, super, vb2,thSCD1=800) ) dfttest( sigma=sigma, Y=Y, U=U, V=V ) SelectEvery( 5, 2 ) } 動作に必要なプラグイン: MVTools v2(サイトが落ちているので転載): http://www.mediafire.com/file/ainymjbyiod/mvtools-v2.3.1.zip dfttest: http://bengal.missouri.edu/~kes25c/ 参考にした物: http://forum.doom9.org/showpost.php?p=1099351&postcount=23 激しい動きの有る映像のデノイズにどうぞ。
9 : どんな感じのデノイザーですかの
10 : >>9 dfttest+動き補償
11 : >>10 トン
12 : ほしゅ
13 : ほしゅ
14 : 20まで行けば即死判定から抜けるかな? 援護保守
15 : そうなのか! ほしゅ
16 : function InterlacedYV12ToYUY2_Yadif(clip source) { # You might need to change here. Load_Stdcall_Plugin("C:\Program Files\AviSynth 2.5\plugins\yadif.dll") YD = source.Yadif(mode=1).ConvertToYUY2.SeparateFields.SelectEvery(4,0,3).Weave source.ConvertToYUY2.MergeChroma(YD) } 動作に必要なプラグイン: http://avisynth.org.ru/yadif/yadif.html AutoYUY2の代わりに使うスクリプト。これの改造版: http://forum.doom9.org/showthread.php?p=618364 TDeintを使ったオリジナルよりは高速だが、ソースに依ってはアップサンプリングの品質が劣る事もある。 もちろん、MPEG2SourceでupConv=1や、ConvertToYUY2(interlaced=true)とするよりは、こちらの方が良い。
17 : function InterlacedYUY2ToYV12_Yadif(clip source) { # You might need to change here. Load_Stdcall_Plugin("C:\Program Files\AviSynth 2.5\plugins\yadif.dll") YD = source.Yadif(mode=1).ConvertToYV12.SeparateFields.SelectEvery(4,0,3).Weave source.ConvertToYV12.MergeChroma(YD) } ConvertToYV12(interlaced=true)の代わりに使う。
18 : ふむふむ、保守
19 : 保守
20 : ほ
21 : お疲れさまー これで即死回避ですな
22 : >>16 > もちろん、MPEG2SourceでupConv=1や、ConvertToYUY2(interlaced=true)とするよりは、 > こちらの方が良い。 これよくわからんので何故か教えて。 BobしてからYV12<->YUY2変換してもSeparateFields.SelectEvery(4,0,3).Weaveした時点で 期待した効果は切り捨てられるフレームと共になくなるんじゃないの? たとえ動き適応Bobberでスタティックなエリアは前後フィールドからインターポレーションしてても 同様の理由で切り捨てられるような…。
23 : >>22 http://neuron2.net/autoyuy2/interlaced.bmp http://neuron2.net/autoyuy2/progressive.bmp http://neuron2.net/autoyuy2/autoyuy2.bmp この3つを見比べてもらうのが分かりやすい。YV12<->YUY2をインターレースのままでやると、 縞か縞ではない部分のどちらかが劣化するから、Bobでプログレッシブにしてからやりましょうと言うこと。 英語が分かるなら、この辺りを読むのがお薦め。 Does YV12 to YV12 deinterlacing lose chroma detail? http://forum.doom9.org/showthread.php?t=128515 Adaptive chroma upsampling http://forum.doom9.org/showthread.php?t=97987
24 : Deinterlacerにproposed methodとかいうのがあるらしいんだが >http://i.cs.hku.hk/~chin/paper/wseas2006_594_175_journal_final.pdf Avisynthで使えるフィルタがあったら教えてほしい。
25 : それは、要するにデインターレースにおける動き補償の重要性を言いたい様だから、 AviSynthだと、MCBobやTDeint+TMMでも使えば良いと思う。
26 : 昔どっかで拾ったデインタレ24fps化。最近のは分からない。むしろ教えてくだしゃい(´・ω・`) BruteIVTC() TDeint(mode=0,order=1,field=1,type=1,mtnmode=3,full=false,chroma=false,tryweave=true,link=1,slow=2) vinverse(sstr=2.7,amnt=255,uv=3,scl=0.25,opt=2) TDecimate(mode=1,hybrid=0,dupThresh=0.7,blockx=8,blocky=8,chroma=true)
27 : TFM(clip2=TDeint(tryweave=true)).TDecimate IVTCがよく分からないのだったら、これくらいから始めて見たら。
28 : >>27 それも試してみる。 スクロールシーンで BruteIVTC が誤爆して面倒だなと思ってた。
29 : 保守
30 : 過疎
31 : " Vim compiler file " Compiler: avsutil " Last Change: 19-Apr-2009. "" 使い方 {{{1 " HOWTO: Run an AVISYNTH script (imagewriter) without a player within a batch file?? " http://forum.doom9.org/showthread.php?t=74899 " avsutil.exe のパスを通しておく。 " http://www.members.optusnet.com.au/squid_80/ " $HOME/vimfiles/compiler に avsutil.vim として、このスクリプトを置く。 " .vimrc に以下を記入。 "autocmd FileType avisynth compiler avsutil ""autocmd BufRead,BufNewFile *.avs,*.avsi compiler avsutil " :grep や :make の実行後、自動的に QuickFix ウィンドウを開く " (注意: vim7 以降で利用可能) " http://vimwiki.net/?tips%2F66 "au QuickfixCmdPost make,grep,grepadd copen "au QuickfixCmdPost l* lopen
32 : " ScriptClip などのデバッグ用 " ctrl + return で VirtualDub を編集中のスクリプトを読み込ん " で起動。 "autocmd BufRead,BufNewFile *.avs,*.avsi map <C-CR> :!start "E:/home/hoge/bin/VirtualDub/VirtualDub.exe" "%:p"<CR> "" 使用上の注意 " AviSynthスクリプト名、及びパスにマルチバイト文字や半角スペ " ースを使わないこと。そうしないと、エラーの箇所にジャンプし " ない。 " AviSynthスクリプトの返り値が clip でないときは、デバッグの " ときスクリプトの最後にでも BlankClip を置いておく。 "" quickfix に値を出力。 " Function Say (val word) { Assert( !Defined(word), "avisynthi> " + string(word) + chr(10) ) } " }}}
33 : if exists("current_compiler") finish endif let current_compiler = "avsutil" if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal <args> endif " :help errorformat "set efm=%EScript\ Error:\ %m,%Z(%f\\,\ line\ %l),%A(%f\\,\ line\ %l),%Z(%f\\,\ line\ %l\\,\ column\ %c),%+G%.%# set efm=%EScript\ Error:\ %m,%A(%f\\,\ line\ %l),%A(%f\\,\ line\ %l\\,\ column\ %c),%+G%.%# CompilerSet makeprg=avsutil\ % " vim:set fdm=marker:
34 : ## 関数: {{{2 # プロンプト avsutil.exe hoge.avs や vim の QuickFix ウィンドウ、 # VirtualDub のエラーウィンドウに関数などの評価された値を表示する。 # 返り値が clip のときは clip の情報を表示する。 Function Say(val expression) { Assert( !Defined(expression), "avisynthi> " + string(expression) + chr(10) ) } Function return1(val a, val "str") { Assert( false, !a.isClip ? "avisynthi> " + string(a) + chr(10) \ : ( Defined(str) ? "avisynthi> " + string(str) \ : "The return value is a clip." ) + chr(10) + chr(10) \ + getVideoProperty(a) + chr(10) + chr(10) \ + getAudioProperty(a) + chr(10) ) } # Say(24000/float(1001)) # 23.976025 # (24000/float(1001)) .return1 # 23.976025 # BlankClip(34600, fps=24000, fps_denominator=1001) return1(last, isInterleaved)
35 : # プロンプト avsutil.exe hoge.avs や vim の QuickFix ウィンドウ に関数などの処理時間を表示する。 Function clock(val expression1, val "expression2") { !Defined(expression2) ? ( expression1.isClip ? expression1 \ : BlankClip.Subtitle(string(expression1)) ) \ : ( expression1.isClip ? expression1.Subtitle(string(expression2)) \ : BlankClip.Subtitle(string(expression1)+", "+string(expression2)) ) } # return clock( Fib(46) ) Function getVideoProperty(clip c) { c.hasVideo ? "Frame: " + string(c.FrameCount) + chr(10) \ + "Time: " + toTimecode(c.FrameCount*c.FramerateDenominator/float(c.FramerateNumerator)) + chr(10) \ + "ColorSpace: " + string(pixelTypeOf(c)) + chr(10) \ + "Width: " + string(c.width) + " pixels, Height: " + string(c.height) + " pixels" + chr(10) \ + "Frames Per Second: " + string(c.Framerate, "%.4f") + " (" + string(c.FramerateNumerator) \ + (c.FramerateDenominator != 1 ? "/" + string(c.FramerateDenominator) : "") + ")" + chr(10) \ + "FieldBased (Separated) Video: " + (c.isFieldBased ? "YES" : "NO") + chr(10) \ + "Parity: " + (GetParity(c) ? "Top" : "Bottom") + " Field First" \ : "Has Video: NO" }
36 : Function getAudioProperty(clip c) { c.hasAudio ? "Has Audio: YES" + chr(10) \ + "Audion Channels: " + string(c.AudioChannels) + " ch" + chr(10) \ + "Sample Type: " + (c.IsAudioInt ? "Integer " : "Float ") + string(c.AudioBits) + " bit" + chr(10) \ + "Samples Per Second: " + string(c.AudioRate) + " Hz" + chr(10) \ + "Audio Length: " + string(c.AudioLength) + " samples. " + c.toTimecodeAudio \ : "Has Audio: NO" } Function toTimecodeAudio(clip c) { toTimecode(c.AudioLength/float(c.AudioRate)) } Function toTimecode(float seconds) { str = string(seconds, "%.3f") sss = int(value(leftStr(str, findStr(str, ".") - 1))) Return _add0(sss/3600) + ":" + _add0(sss%3600/60) + ":" + _add0(sss%60) + "." + rightStr(str, 3) function _add0(t) { strLen(string(t))==1 ? "0" + string(t) : string(t) } } # toTimecode(3599) .return1 # 00:59:59.000 # toTimecode(3599.9999) .return1 # 01:00:00.000 # return BlankClip(34600, fps=24000, fps_denominator=1001).ScriptClip(""" # Subtitle(string(current_frame) + " (" + toTimecode(current_frame*FramerateDenominator/float(FramerateNumerator)) + ")") # """)
37 : Function pixelTypeOf(clip c) { Return c.IsYV12 ? "YV12" \ : c.IsYUY2 ? "YUY2" \ : c.IsRGB24 ? "RGB24" \ : c.IsRGB32 ? "RGB32" \ : c.IsRGB ? "RGB" \ : c.IsYUV ? "YUV" \ : nop }
38 : Function Evaluation(clip clp, string "block", int "y", int "guifg", string "guifont", int "font_size", bool "err") { y = Default(y, 0) guifg = Default(guifg, $FFFFFF) guifont = Default(guifont, "osaka_unicode") #http://osakattf.hp.infoseek.co.jp/ #guifont = Default(guifont, "MS_Gothic") font_size = Default(font_size, 18) err = Default(err, false) EVALUATION_Y = !globalDefined("EVALUATION_Y") ? 0 : EVALUATION_Y + 3 + y y = EVALUATION_Y Global EVALUATION_BLOCK = block Global EVALUATION_COUNT = 0 while("""findStr(EVALUATION_BLOCK, "\n") > 0""", \""" Global EVALUATION_BLOCK = DelChr10(EVALUATION_BLOCK) Global EVALUATION_COUNT = EVALUATION_COUNT + 1 """) Global EVALUATION_Y = EVALUATION_Y + EVALUATION_COUNT str = err ? _evalBlock() : string(Eval(EVALUATION_BLOCK))
39 : function _evalBlock() { try { string(Eval(EVALUATION_BLOCK)) } catch(err_msg) { return err_msg } } clp Subtitle(string(VersionString), font=guifont, size=font_size, text_color=guifg) Subtitle("$ " + string(block), font=guifont, size=font_size, \ text_color=guifg, y =font_size*(2+y), lsp=1) Subtitle(str, font=guifont, size=font_size, \ text_color=guifg, y =font_size*(3+EVALUATION_COUNT+y)) }
40 : Function ConsoleClip(int "columns", int "lines", int "font_size", int "guibg", int "length") { columns = Default(columns, 80) lines = Default(lines, 25) font_size = Default(font_size, 18) guibg = Default(guibg, $000000) length = Default(length, 240) BlankClip(length=length, width=font_size*(columns/2), height=font_size*lines, color=guibg) } Function DelChr10(string block, string "ffs") { ffs = Default(ffs, "\n") LeftStr(block, Findstr(block, ffs)-1) + MidStr(block, Findstr(block, ffs)+2) } Function globalDefined(string x) { try { Eval("defined(" + x + ")") } catch(err_msg) { return false } }
41 : Function undef(val "x") { Assert(!Defined(x), "Usage: a = undef()") Return x } # n = undef() # defined(n) .return1 # false # global x = 2 # global x = undef() # globalDefined("x") .return1 ##}}} ### }}} ## 使用例: ConsoleClip(lines=30) Evaluation(""" # 正しい解を求めることができる最大値は Fib(46)\n Function Fib(int n) {\n Assert( (n >= 0), "fib: n should be larger than or equal to 0." )\n Return (n == 0) ? 0\n \ : (n == 1) ? 1\n \ : (n == 2) ? 1\n \ : n.isEven ? powerOf(fib((n/2)+1), 2) - powerOf(fib((n/2)-1), 2)\n \ : fib(n-1) + fib(n-2)\n }\n\n Fib(46) """)
42 : # http://www.avisynth.info/2chlog/1153487392.html の 367-372 の修正。 # ・Evaluation() でオプションに y を指定しなくても自動で改行。 # ・フィボナッチ数 fib() を整数型の範囲で解を出力するようにした。 Evaluation("xor(true, true)") Evaluation("xor(true, false)") Evaluation("xor(false, true)") Evaluation("xor(false, false)") # 冪乗(べき乗) # Pow() を整数型でも使えるようにしたもの。 Function powerOf(val base, val expt) { Assert( base.isNumber, "powerOf: base should be Number." ) Assert( expt.isNumber, "powerOf: exponent should be Number." ) Return (expt == 0) ? 1 \ : (base.isFloat2) || (expt.isFloat2) ? pow(base, expt) \ : (expt < 0) ? 1. / powerOf(base, abs(expt)) \ : (expt.isEven) ? squareOf( powerOf(base, expt / 2) ) \ : base * powerOf(base, expt-1) } # pow(3, 16) .return1 # 43046720.000000 不正解 # powerOf(3., 16) .return1 # 43046720.000000 不正解 # powerOf(3, 16) .return1 # 43046721 正解 # powerOf(2, 1./2) .return1 # 1.414214 # powerOf(2, -3) .return1 # 0.125000
43 : Function xor(P, Q) { !(P == Q) } Function isNumber (val a, val "b") { defined(b) ? a.isFloat && b.isFloat && a==b : a.isFloat } Function isFloat2 (val a, val "b") { defined(b) ? a.isFloat2 && b.isFloat2 && a==b : !a.isInt && a.isFloat } Function isEven(int n) { n % 2 == 0 } Function isOdd(int n) { n % 2 == 1 } Function squareOf(val n) { n * n } Function cubeOf(val n) { n * n * n } # IsFloat() 数は float として扱われる。 # ( 2 .isFloat ) .return1 # true # ( 2..isFloat ) .return1 # true # ( int(2) .isFloat ) .return1 # true # ( 2 .isFloat2 ) .return1 # false # ( 2..isFloat2 ) .return1 # true
44 : 上に貼ったもののまとめ tp://pub.idisk-just.com/fview/t7g_72CR_2yjhrrLwcxUEeiMxM0unJukS5yoa1sZ2R7qf_b24EWtbJsrGENFTVOu
45 : 修正 Function isEven(int n) { abs(n) % 2 == 0 } Function isOdd(int n) { abs(n) % 2 == 1 }
46 : 動いてる部分だけ(もしくは静止部分だけ)任意のフィルタをかける(もしくはかけない)関数誰か作っておくれ mvtoolsとかでできそうなんだけど難しい・・・せめてドキュメントが日本語なら・・・
47 : >>46 ttp://www.avisynth.info/?ConditionalFilter を参考に作ってみれば。 ### 文字列の置換 {{{2 Function replaceString (string str1, string str2, string str3) { Return (str2 != chr(0)) ? _replaceString(str1, str2, str3) : str1 } Function deleteString (string str1, string str2) { Return (str2 != chr(0)) ? _replaceString(str1, str2, "") : str1 } function _replaceString (string str1, string str2, string str3, int "pos") { pos1 = default(pos, 1) str4 = leftStr(str1, pos1-1) str5 = midStr(str1, pos1) pos2 = findStr(str5, str2)
48 : return (pos2 != 0) \ ? _replaceString( str4 + leftStr(str5, pos2-1) + str3 + midStr(str5, pos2+strLen(str2)), \ str2, str3, pos1+pos2+strLen(str3)-1 ) \ : str1 } # replaceString("あいうえお", "う", "u") .return1 # あいuえお # replaceString("123456789012345678901234567890", "2", "two") .return1 # 1two345678901two345678901two34567890 # deleteString("0000000123", "0") .return1 # 123 ### }}} 文字列の置換は cp932 + VirtualDub, 及び utf-8 + vim + avsutil で確認。 vimで保存すると同時に :make を実行。 " http://blog.blueblack.net/item_317 "<Leader><Leader>で変更があれば保存 noremap <Leader><Leader> :update<CR> ~/vimfiles/after/ftplugin/avisynth.vim "" errormarker.vim : Highlights and sets error markers for lines with compile errors "" http://www.vim.org/scripts/script.php?script_id=1861 if !exists('b:current_compiler') compiler avsutil endif autocmd BufWritePost <buffer> silent make
49 : hos
50 : ほしゅ ホワイト・ブラックアウトを検出できれば (明るさ・コントラスト・色合い・ガンマ値などの)自動補正プラグインが安全につかえる?
51 : ほ
52 : タダ乗りといえば、無線ルーター認証なしで使ってる人多そうだね
53 : 誤爆すんませんorz
54 : EasyVFR改3でtimecode v0を出力するavsの使用例ない?
55 : >>54 EasyVFR3.avs開いたら書いてあるだろ・・・・
56 : 一部の音楽畑の人以外不明だろうけど、 GScript(http://forum.doom9.org/showthread.php?t=147846) のループを利用して、 N平均律の音列モデル作成用スクリプト書いたよ。 N=12で12平均律、N=31なら31平均律ね。 最後に映像も追加してるのは、"Avs2wav.exe"に通すため。 どうせなら改良して映像に数値情報が表示されるようにしようか考え中…。 # N平均律 LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\GScript.dll") ##--ここから数値指定--## N = 12 # N平均律 Start = 440 # 1音目の周波数(Hz) Length = 1.0 # 1音の発音時間(sec.) Level = 1.0 # 音量(0 - 1.0) Channels = 2 # チャンネル数 SampleRate = 48000 # サンプルレート Type = "Sine" # 波形("Silence" "Sine" "Noise" "Square" "Triangle" "Sawtooth") Outro = 2.0 # 発音終了後に追加する無音部分の長さ(sec.) ##--ここまで数値指定--##
57 : >>56 の続き # 2のN乗根 = 2の1/N乗 RN = Pow(2.0,1.0/N) # Start Tone(length=Length, frequency=Start, samplerate=SampleRate, channels=Channels, type=Type, level=Level) # Follower GScript(""" for (G=1,N,1) { AlignedSplice(last,Tone(length=Length, frequency=Start*Pow(RN,G), samplerate=SampleRate, channels=channels, type=Type, level=Level)) } """) Audio = AlignedSplice(last, Tone(length=Outro, samplerate=SampleRate, channels=Channels, type="Silence")) return AudioDub(BlankClip(),Audio) __END__
58 : 下のスクリプトは等幅フォントで見ることを前提にしています。 2chブラウザで見るには、Navi2ch, Chaliceを使うか Janeでレス番号をマウスで範囲選択、右クリックでポップアップ または、Jane Styleで ReplaceStr.txt を編集する http://jane.s28.xrea.com/test/read.cgi/bbs/1243173026/ //▽ と をスペースに置換する <ex2> 【TAB】【半角スペース】【TAB】msg <ex2>【半角スペース】【半角スペース】【TAB】【全角スペース】【TAB】msg <ex2> 【半角スペース】【TAB】【全角スペース】【TAB】msg <ex2> 【TAB】【半角スペース】【TAB】msg こうしておくと、プログラム板でインデントが保たれて見える。 以下は、timecode を出力するための計算例。 # 終結端数補正値 # # ソースクリップの選択範囲の 総フレーム数, フレーム周波数を # src_count, src_fps # その選択範囲をフレームレイト変換した後の 総フレーム数, フレーム周波数を # ivtc_count, ivtc_fps # # fps^-1 は、その Framerate での 1frame の表示時間の長さである。 # 例えば、24000/1001 Hz での 1frame の表示時間は、 # (24000/1001)^-1 = 1001 / 24000 = 0.041708333333… # # ソースクリップの選択範囲の再生時間 src_count * src_fps^-1 と # フレームレイト変換後の再生時間 ivtc_count * ivtc_fps^-1 # は一致するとは限らないので、フレームレイト変換後の最終フレームの # フレーム周波数でもって調整する必要がある。 # フレームレイト変換後の最終フレームのフレーム周波数を、 # 終結端数補正fps とここでは呼ぶことにする。 # # 終結端数補正fps を tail_fps とおく。
59 : # # src_count * src_fps^-1 = (ivtc_count - 1) * ivtc_fps^-1 + tail_fps^-1 # # tail_fps^-1 = src_count * src_fps^-1 - (ivtc_count - 1) * ivtc_fps^-1 # = src_count / src_fps - (ivtc_count - 1) / ivtc_fps # = (src_count * ivtc_fps - (ivtc_count - 1) * src_fps) / (src_fps * ivtc_fps) # # よって、 # tail_fps = src_fps * ivtc_fps / (src_count * ivtc_fps - (ivtc_count - 1) * src_fps) # # また、分母を den, 分子を num とすると # tail_num = ivtc_num * src_num # tail_den = src_count * ivtc_num * src_den - (ivtc_count-1) * src_num * ivtc_den function tcCalc(int src_count, int src_num, int src_den, \ int ivtc_count, int ivtc_num, int ivtc_den) { tail_num = ivtc_num * src_num tail_den = src_count * ivtc_num * src_den - (ivtc_count-1) * src_num * ivtc_den gcd = GCM(tail_num, tail_den) tail_num = tail_num / gcd tail_den = tail_den / gcd return string(tail_num) + "/" + string(tail_den) }
60 : # 最大公約数 # # ユークリッド(Eukleides エウクレイデス)の互除法 # 2つの正整数の小さくない方を a, もう片方を b とするとき # r = a - b となる r を取り、b と r で 小さくない方を a, # 残りを b としてこの操作を繰り返す。 # 小さい方の数が 0 となるとき、大きい方の数を最大公約数 # といい、(a, b) と表す。また、小さい方の数が 1 となる # とき 2数は互いに素といい最大公約数は 1 となる。 # 尚、この計算は除算をしていることに他ならない。 # (a, b) = 1 と書かれていれば、a と b は互いに素という # 意味である。計算機の教科書では、GCD(a, b) と書かれる。 # # (a, b)=1 ⇔ (2^(a-1), 2^(b-1))=1 # # (206,40) = 2 # a - b = r # 206 - 40 = 166 # 166 - 40 = 126 # 126 - 40 = 86 (a,b) = (b,r) # 86 - 40 = 46 a / b = q … r # 46 - 40 = 6 ----> 206 / 40 = 5 … 6 # 40 - 6 = 34 # 34 - 6 = 28 # 28 - 6 = 22 # 22 - 6 = 16 # 16 - 6 = 10 # 10 - 6 = 4 ----> 40 / 6 = 6 … 4 # 6 - 4 = 2 ----> 6 / 4 = 1 … 2 # 4 - 2 = 2 # 2 - 2 = 0 ----> 4 / 2 = 2 … 0 #
61 : Function GCM(int a, int b) { Assert((a != 0) || (b != 0), "GCM: GCM(0, 0) is undefined.") Assert((a >= 0) && (b >= 0), "GCM: a and b should be greater than 0.") #a = abs(a) #b = abs(b) Return (b == 0) ? a \ : (a == 0) ? b \ : (a < b) ? _gcm(b, a) : _gcm(a, b) } Function _gcm(a, b) { # 減算と除算との組み合わせ。AviSynthでは再帰呼び出し # において計算量を減らす何らかの方法を取り入れないと、 # 計算量が増えてくるとフリーズするときがある。 r = a % b d = b - r r = r <= d ? r : d Return (r == 0) ? b : _gcm(b, r) } #GCM(206, 40) .return1 # 2
62 : ユークリッドの互除法って function getGCD(int a,int b){return b==0?a:getGCD(b,a%b)} これだけでいいんじゃないの?
63 : >>58 &を置換し忘れ //▽&#160;と&nbsp;をスペースに置換する <ex2>&#160;【TAB】【半角スペース】【TAB】msg <ex2>【半角スペース】【半角スペース】【TAB】【全角スペース】【TAB】msg <ex2>&nbsp;【半角スペース】【TAB】【全角スペース】【TAB】msg <ex2>&nbsp;【TAB】【半角スペース】【TAB】msg 全角&は半角
64 : >>62 教科書では ttp://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.5 というような書き方が殆どだが、これだけでは不十分。 約数は、除法の原理により必ず正整数でならなければいけない。 getGCD(-18, 12) .return1 # -6 getGCD(0, 0) .return1 # 0 こういうのは、よろしくない。 この点を考慮すると、 function getGCD(int a,int b) { Assert((a != 0) || (b != 0), "getGCD: GCD(0, 0) is undefined.") a = abs(a) b = abs(b) return b==0 ? a : getGCD(b, a % b) } となる。 ゼロの約数は、任意の正整数である。 除法の原理の a = qb + r において、 q, r = 0 とおくと a がゼロのときの約数 b は、 0 = 0・b + 0 となり任意の正整数となる。 よって、GCD(0, 0) は定義されていない。 Assert((a != 0) || (b != 0), "GCM: GCM(0, 0) is undefined.")
65 : 整数環の計算では何が何でも abs() で正整数にしてしまったのではバグが見つけにくく なる。どうして負数が必要か、どうして解が負数に なるか、きちんと理解したうえで 使うのが望ましい。 (ここで言うバグとは、整合であるか無いかとする) これらの理由により >>61 では、abs() を使わずに Assert((a >= 0) && (b >= 0), "GCM: a and b should be greater than 0.") としている。 d = b - r r = r <= d ? r : d の部分は、Avisynth において関数の再帰呼び出し回数を削減するためのもの。剰余と 差を比べて大きくない方を選ぶ。>>60 で述べた互除法のアルゴリズムと、減算とは何か、 除算とは何かを考えてみよう。
66 : # 定理: 除法の原理 # a を任意の整数、b は b > 0 の整数とする。このとき # # a = qb + r, 0 <= r < b # # となる整数 q, r がただ1組存在する。 # # そのとき q を a を b で割った商, r を余りという。 # また、 r = 0 であるとき、 # # a = bq (b ≠ 0) # # となる整数 q が存在するとき、a は b で割り切れるといい、b|a と表す。 # このとき、b を a の約数、a を b の倍数という。 # a を b で割った余りを求める。 # 合同式 a ≡ r (mod b) において、0 <= r < b となる 整数 r を求める。 Function mod(int a, int b) { Assert(b > 0, "mod: modulo should be greater than 0.") Return a >= 0 ? a % b : ((a % b) + b) % b }
67 : # a の n を法とする乗法における逆元 a^(-1) mod n を求める。 # (a,n)=1 ならば a・x ≡ 1 (mod n) となる x が存在する。 # # a, n が互いに素でなければ逆元は存在しない。 # よって、n が素数ならば 0 を除く任意の元に対して逆元が存在する。 # また、a・x ≡ 1 (mod n) となる x を求めることは、 # 不等方程式 a・x + n・y = 1 を解くことに他ならない。 # # 拡張ユークリッドの互除法 # # 互いに素であるとき # (29, 17) = 1 # 29 - 17 = 12 ----> 29 / 17 = 1 … 12 # 17 - 12 = 5 ----> 17 / 12 = 1 … 5 # 12 - 5 = 7 ----> 12 / 5 = 1 … 7 # 7 - 5 = 2 ----> 7 / 5 = 1 … 2 # 5 - 2 = 3 # 3 - 2 = 1 ----> 5 / 2 = 2 … 1 # # 29 * s + 17 * t = 1 となる s, t を見つける。 # a = 29, b = 17 とおく # 29 - 17 = 12 # 1a + 0b = 29 ----> (1) # -)0a + 1b = 17 ----> (2) # 1a - 1b = 12 ----> (3) = (1) - (2) # # 17 - 12 = 5 # 0a + 1b = 17 ----> (2) # -)1a - 1b = 12 ----> (3) # -1a + 2b = 5 ----> (4) = (2) - (3) #
68 : # 12 - 5 = 7 # 1a - 1b = 12 ----> (3) # -)-1a + 2b = 5 ----> (4) # 2a - 3b = 7 ----> (5) = (3) - (4) # # 7 - 5 = 2 # 2a - 3b = 7 ----> (5) # -)-1a + 2b = 5 ----> (4) # 3a - 5b = 2 ----> (6) = (5) - (4) # # 5 - 2 = 3 # -1a + 2b = 5 ----> (4) # -) 3a - 5b = 2 ----> (6) # -4a + 7b = 3 ----> (7) = (4) - (6) # # 3 - 2 = 1 # -4a + 7b = 3 ----> (7) # -)3a - 5b = 2 ----> (6) # -7a + 12b = 1 ----> (8) = (7) - (6) # # -7*29 + 12*17 = 1 # 整数 -7 を 17 を法とする剰余環の数に変換。 # -7 (mod 17) = 10 # ---------------------------------------------------------- # 計算量を減らす。 # 12 - 5 = 7 # 1a - 1b = 12 ----> (3) # -)-1a + 2b = 5 ----> (4) # (4) に 12 / 5 = 2 … 2 の商2を掛ける。 #
69 : # 12 - 10 = 2 # 1a - 1b = 12 ----> (3) # -)-2a + 4b = 10 ----> (4') = (4) * 2 # 3a - 5b = 2 ----> (5') = (3) - (4') # # 5 - 4 = 1 # -1a + 2b = 5 ----> (4) # -)6a - 10b = 4 ----> (5'') = (5') * 2 # -7a + 12b = 1 ----> (6) = (4) - (5'') # ---------------------------------------------------------- Function modinv(int a, int n) { Assert( n > 0, "modinv: modulo should be greater than 0." ) Return (exGCD(n, mod(a,n), true) + n) % n } Function exGCD(int a, int n, bool "inv", int "x", int "y") { inv = default(inv, false) x = default(x, 1) y = default(y, 0) inv && (n == 0) ? Assert( a == 1, "modinv: GCM(a, n) == 1" ) : NOP Return (n != 0) ? exGCD(n, mod(a,n), inv, y - (a/n) * x, x) : inv ? y : a }
70 : #modinv(29, 17) .return1 # 10 #mod(29*10,17) .return1 # 1 ## 29・x ≡ 1 (mod 17) ## 29・x + 17・y = 1 ## 29*10 - 17*17 = 1 #modinv(17, 29) .return1 # 12 #mod(17*12,29) .return1 # 1 ## 17・x ≡ 1 (mod 29) ## 17・x + 29・y = 1 ## 17*12 - 29*7 = 1 #modinv(-17, 29) .return1 # 17 #mod(-17*17,29) .return1 # 1 ## -17・x ≡ 1 (mod 29) ## -17・x + 29・y = 1 ## -17*17 + 29*10 = 1 #modinv(-29, 17) .return1 # 7 #mod(-29*7,17) .return1 # 1 ## -29・x ≡ 1 (mod 17) ## -29・x + 17・y = 1 ## -29*7 + 17*12 = 1
71 : <<64 × 約数は、除法の原理により必ず正整数でならなければいけない。 ○ 約数はマイナスとプラスの値を取り得るが、最大公約数なので プラスのほうを選択しなければならない。
72 : >>64 ググレカス的質問に丁寧な解説、マコトにありがとうございます! >64-65の前半はGCM(0,0)とか変な呼び出しを見つけるのに便利ってはなしですよね? その辺は関数の外の話だと思ったので省略しただけで特に疑問は無いです d = b - rとr = r <= d ? r : dの2行が見慣れないコードだったんで何だろうと思ってレスしました 残念ながら私の脳ミソでは>65-70を読んでも理解できなかったので、結局、googleに教えてもらいました a%bがgcdの倍数であるようにb-a%bもgcdの倍数な訳で、それならより小さい方を使いましょう!って感じですかね? あらためて>65-70を読んでも、何故拡張ユークリッドの互除法が出てくるのかさっぱり解らないけど 今日まで何となく使ってけど理解した気になれました、ありがとうございました
73 : >でも、テスト版は負の方向には動くが、正の方向には、動かなくなっているらしい。 フイタw なんだよその突貫作業w
74 : # ロゴ表示開始又は終了地点でトップかボトムのどちらかの # フィールドしかロゴがかかってないフレームのロゴを除去し # クリップ全体でなくその単一フレームのみ返す関数 function HalfFieldDeLogo(clip clp, int "framenumber", bool "topfieldlogo", string "logofile"){ c=clp.Trim(framenumber,framenumber) d=c.EraseLOGO(logofile=logofile,interlaced=true) dc = d.SeparateFields() + c.SeparateFields() cd = c.SeparateFields() + d.SeparateFields() weaved = (topfieldlogo == GetParity(clp)) ? dc.SelectEvery(4,0,3).Weave() : cd.SelectEvery(4,0,3).Weave() return weaved.AssumeFPS(Framerate(clp)) }
75 : コピペ乙
76 : 大丈夫か?このスレ・・・
77 : 保守
78 : 半年放置しても落ちないのに保守とか
79 : クリップの輝度や彩度の数値を返す関数はありませんか? ランタイム関数はどうにも使い勝手が難しく難儀しております。
80 : いい検索ワードがいまいち思いつかないが avisynth getClip Luma Chroma value こんな検索ワードだとこのあたりのリソースがつかえるんじゃね? http://forum.doom9.org/showthread.php?t=154184 http://www.wilbertdijkhof.com/AviSynth-Documentation_20100101.pdf
81 : sv = "hoge.d2v" sa = "hoge.aac" da = 0.00 AudioDub(Mpeg2source(sv),bassAudioSource(sa)) DelayAudio(da) # EraseLOGO() # lji(-1,-1,"def","hd") # trim() main(30) return last function main(clip clip, int "fp",int "tH", int "tW") { fp = default(fp,24) tH= default(tH,clip.Height()) tW= default(tW,clip.Width()) pre = (fp == 24 ) ? "animeLQ" : "movieLQ" clip = clip.AssumeTFF().AutoDeint("blend") clip = (fp == 24 ) ? clip.TFM(mode=6,order=1,PP=7,slow=1,mChroma=true,opt=4) : clip clip = (fp == 24 ) ? clip.TDecimate(mode=1) : clip clip = clip.ConvertToYUY2() clip = clip.BicubicResize (tW,clip.Height()) clip = clip.fft3dGPU(sigma=0.4,beta=1,plane=0,bt=3,bw=12,bh=12,ow=8,oh=8,sharpen=0.2,wintype=1) clip = clip.GPU_Begin() clip = clip.fft3dGPU(sigma=0.4,beta=1,plane=1,bt=2,bw=16,bh=16,ow=12,oh=12,sharpen=0.2,wintype=1) clip = (fp == 24 ) ? clip.fft3dGPU(sigma=0.45,beta=1,plane=2,bt=1,bw=20,bh=20,ow=14,oh=14,sharpen=0.3,wintype=1) : clip clip = clip.GPU_HardwareResize (clip.Width(),tH,"Anisotropic") clip = clip.GPU_Convolution3d(preset=pre) clip = clip.WarpSharp(95,3,85,0) clip = clip.UnsharpMask(19,8,24) clip = clip.GPU_TemporalSmoother(2,2) clip = clip.GPU_EndYV12() clip = (fp != 24 ) ? clip.GradFun2DBmod(screenW=tW,screenH=tH) : clip return clip }
82 : 前はこんな感じにしていたんだがgpuに任せっきりで熱々だった clip = clip.fft3dGPU(sigma=1.25,beta=1,plane=1,bt=3,bw=16,bh=16,ow=8,oh=8,sharpen=0.1,wintype=1) clip = clip.fft3dGPU(sigma=1.25,beta=1,plane=0,bt=4,bw=24,bh=24,ow=12,oh=12,sharpen=0.2,wintype=2) clip = clip.GPU_BeginYV12() clip = clip.GPU_Convolution3d(preset=tMode) clip = clip.GPU_LanczosResize (tWid,tHei) clip = (fp == 24) ? clip.GPU_2DCleanFake() : clip.GPU_2DClean() clip = clip.GPU_TemporalSmoother(2,2) clip = clip.GPU_EndYV12() これを>>81 に変えてからだいぶGPUの熱々感がマシになった気がする。 X4 955BE+HD5670 だけど双方ともx264のエンコだとfpsは普通に出る CSソースの480p->576pで70fps前後 BSソースの1080p->720pで30fps前後 地デジソースの1080p->1080pで20fps前後 あとバンディングをしないならさらに早くなる。あれソースによったら重いからw 俺のHDDが逝ったとき用にここにメモをのこしておく。
83 : Avisynthプラグイン / Avisynthスクリプト / AviUtlプラグイン を 拡張子で自動判別してロードする関数Load()。 プラグインやスクリプトを置いているフォルダがいつも々なら地味に便利かも? function Load(string "fileName", string "funcName") { PluginDir = "C:\Avisynth\Plugins" # ←Avisynthプラグインフォルダのパスを記入 ScriptDir = "C:\Avisynth\Plugins" # ←Avisynthスクリプトフォルダのパスを記入 AviUtlPluginDir = "C:\AviUtl\Plugins" # ←AviUtlプラグインフォルダのパスを記入 AviUtlPluginPrefix = "AU_" # AviUtlプラグインの関数名に付けるデフォルトの接頭語 funcName = default(funcName, AviUtlPluginPrefix + LeftStr(fileName, StrLen(fileName)-4)) ( RightStr(filename, 4) == ".dll" ) ? LoadPlugin(PluginDir + "\" + fileName) : \ ( RightStr(filename, 4) == ".auf" ) ? LoadAviUtlFilterPlugin(AviUtlPluginDir + "\" + fileName, funcName) : \ Import(ScriptDir + "\" + fileName) return( last ) }
84 : [使い方] Load("DGDecode.dll") → Avisynthプラグインフォルダからロード Load("LSFmod.avsi") → Avisynthスクリプトフォルダからロード Load("myScript.avs") → Avisynthスクリプトフォルダからロード Load("DeDot.auf") → AviUtlプラグインフォルダからロード デフォルトの関数名は"AU_DeDot(…)"になる Load("DeDot.auf", "hogehoge") → AviUtlプラグインフォルダからロード 関数名は"hogehoge(…)"になる ※なお,AviUtlプラグインをロードするときは,事前にwarpsharp.dllもロードをお忘れなく。
85 : このスクリプトを毎回Importするのが面倒なら, このスクリプトだけはC:\Program Files (x86)\AviSynth 2.5\plugins に放り込んでおくか,シンボリックリンクを張っておくのが吉ッス。
86 : ScriptDirのパスがPluginDirのパスと同じになっていたので訂正。 もしも実際に使う時はPluginDirとScriptDirを自分の環境に応じて変更願います。 ついでにスクリプト読み込み部分をもう少し丁寧に書いてみました。 後の改良の余地はtry〜catchなどを使って,LoadAviUtlFilterPluginが呼ばれるときに 予めwarpsharp.dllを自動ロードするように改造するくらいでしょうか。よく分かりませぬ。 function Load(string "fileName", string "funcName") { PluginDir = "C:\Avisynth\Plugins" # ←Avisynthプラグインフォルダのパスを記入 ScriptDir = "C:\Avisynth\Scripts" # ←Avisynthスクリプトフォルダのパスを記入 AviUtlPluginDir = "C:\AviUtl\Plugins" # ←AviUtlプラグインフォルダのパスを記入 AviUtlPluginPrefix = "AU_" # AviUtlプラグインの関数名に付けるデフォルトの接頭語 funcName = default(funcName, AviUtlPluginPrefix + LeftStr(fileName, StrLen(fileName)-4)) ( RightStr(filename, 4) == ".dll" ) ? LoadPlugin(PluginDir + "\" + fileName) : \ ( RightStr(filename, 4) == ".auf" ) ? LoadAviUtlFilterPlugin(AviUtlPluginDir + "\" + fileName, funcName) : \ ( RightStr(filename, 4) == ".avs" || RightStr(filename, 5) == ".avsi" ) ? Import(ScriptDir + "\" + fileName) : \ Assert(false, "Load(): Unknown Plugin/Script loaded!") return( last )
87 : 関数の最後の括弧が抜けてました。ショボくてマジスマソ。 function Load(string "fileName", string "funcName") { PluginDir = "C:\Avisynth\Plugins" # ←Avisynthプラグインフォルダのパスを記入 ScriptDir = "C:\Avisynth\Scripts" # ←Avisynthスクリプトフォルダのパスを記入 AviUtlPluginDir = "C:\AviUtl\Plugins" # ←AviUtlプラグインフォルダのパスを記入 AviUtlPluginPrefix = "AU_" # AviUtlプラグインの関数名に付けるデフォルトの接頭語 funcName = default(funcName, AviUtlPluginPrefix + LeftStr(fileName, StrLen(fileName)-4)) ext4 = RightStr(filename, 4) ext5 = RightStr(filename, 5) ( ext4 == ".dll" ) ? LoadPlugin(PluginDir + "\" + fileName) : \ ( ext4 == ".auf" ) ? LoadAviUtlFilterPlugin(AviUtlPluginDir + "\" + fileName, funcName) : \ ( ext4 == ".avs" || ext5 == ".avsi" ) ? Import(ScriptDir + "\" + fileName) : \ Assert(false, "Load("+filename+") ERROR! Unknown Plugin/Script.") return( last ) }
88 : 保守
89 : 保守
90 : てs
91 : 保守
92 : ほす
93 : 自分なりに改良してみたTIVTC24P2を貼ってみる function NewTIVTC24P2(clip clip, string "fieldorder") { fieldorder = Default(fieldorder,"TOP") Assert(("TOP" == fieldorder )||("BOTTOM" == fieldorder),"Please specify ''TOP'' or ''BOTTOM'' .") Assume = (fieldorder == "BOTTOM") ? clip.AssumeBFF() : clip.AssumeTFF() num = (fieldorder == "BOTTOM") ? 0 : 1 interp = Assume.SeparateFields().Selecteven().nnedi3(field=num,dh=true) Deinted = clip.yadifmod(order=num,field=num,edeint=interp) clip.TFM(mode=6,order=num,PP=7,mChroma=true,clip2=Deinted,cthresh=-1) TDecimate(mode=1) Return last } 自分なりに改良してみたところ 1、BFFにもたぶん対応※未確認 2、取りこぼしを更に少なくした。 TIVTC24P2よりも少し重いけど、取りこぼしが減るのでエンコ後のサイズは減りSSIMは向上した。 英語は適当 チラ裏ごめんね。
94 : slowを外したのって単に少しでも軽くするため?
95 : いつも思うんだけど、フィールドオーダーなんてベースクリップに従えばいいんじゃないの?
96 : >>94 うん。 でも突っ込まれると不安になったので、ちょっと検証してくる。 >>95 個人的には明示的に書いたほうが安心するのでこう書いた。
97 : ちょっと気になったので試してみたけど function TIVTC24P2(clip clip){ Interp = clip.AssumeTFF().SeparateFields().SelectEven().eedi3(dh=true) Deinted=clip.TDeint(order=1,field=1,edeint=Interp) clip = clip.TFM(mode=6,order=1,PP=7,slow=2,mChroma=true,clip2=Deinted) clip = clip.TDecimate(mode=1) return clip } の方がfps,SSIM,サイズ全ての面でいい結果になったのだけど…
98 : nnedi3とeedi3の違いってなんです?
99 : >>93 TIVTC系の逆テレシネって、放送波だと宣伝とかの流れるテロップで絶対誤爆すると思うんだけど、テロップ位置調べてbob化してるのか? それともテロップの流れる場所だけマスクかけるとかやってんのかな。
100read 1read
1read 100read TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
TvtPlayについて語るスレ Part 2 (741)
局ロゴの一覧うpスレ【地デジ・BS・CS】 (179)
Avisynth 初心者質問スレ Part6 (151)
I・O DATA GV-BCTV5/USB (118)
おまいらts抜きしてまでナニ録画してるの? (158)
【IO地デジキャプチャ】ようやくお初【国内メーカー】 (148)
--log9.info------------------
【PSVITA】シェルノサージュ 不具合報告スレ Part14 (101)
【DS】パワプロクンポケット14 part28【パワポケ】 (448)
【DS】パワプロクンポケット13 part43【パワポケ】 (264)
【3DS】ドラゴンボールヒーローズアルティメットミッション part2 (917)
【PSP】プロ野球スピリッツ2011 Part7 (351)
【3DS】トモダチコレクション48人目【DS】 (230)
■悪魔城ドラキュラ 携帯機総合 167城廻 (140)
【PSVITA】 箱! -OPEN ME- (199)
【3DS】3Dクラシックス総合スレ (656)
【牧場物語】ルーンファクトリー総合Part340 (791)
【PSVita】モンスターレーダー 3匹目 (463)
【PSV】ASSAULT GUNNERS アサルトガンナーズ Part2 (117)
【3DS】とびだせどうぶつの森すれちがいスレ1 (264)
【DS】ファイナルファンタジークリスタルクロニクル【FFCCRoF】part・5 (759)
【3DS】トリコ グルメガバトル (117)
【MH3G】モンスターハンター3G G級入門スレ9 (244)
--log55.com------------------
【大阪の半グレ・“壊滅作戦”加速】「拳月(けんむん)グループ」(テポドングループ・モロッコ…)と敵対する「アビスグループ」など
【社会】いよいよやってくる高齢者の医療費負担増
【サイーバー防衛】ホワイトハッカーの高額報酬広がる Googleは優秀なハッカーに1.6億円 日本企業は動き鈍く
【科学】化学論文発表への貢献度ランキングで中国がアメリカを上回り初の世界1位に、日本は4位を死守
【セクシーポエマー進次郎】#小泉進次郎環境大臣の「ポエム」が、ついに国益を損ない始めた
【大阪市】大阪都構想の住民投票、来年11月で検討 知事と市長 賛成多数となれば、25年1月1日に新制度
【年賀状】今年で年賀状は終わりにする? 「終活年賀状」に賛否の声
【安いニッポン】日本の実質賃金「一人負け」状態 日本は確実に貧しくなっている テレ朝