2019年7月17日水曜日

EPS 2019JUL17


> eps_year_xts["2019::"]
             [,1]
2019-01-01 134.39
2019-04-01 136.78
2019-07-01 139.10
2019-10-01 150.00
2020-01-01 153.31
2020-04-01 157.90
2020-07-01 162.84
2020-10-01 167.92

で、


~$cat eps.txt 
12/31/2020 $49.06 $45.22 16.34 17.74 $183.63 $169.14
9/30/2020 $47.36 $44.00 16.83 18.29 $178.22 $164.01
6/30/2020 $45.00 $41.28 17.33 18.86 $173.11 $159.06
3/31/2020 $42.21 $38.65 17.91 19.46 $167.48 $154.18
12/31/2019 $43.65 $40.09 18.38 19.93 $163.26 $150.55
9/30/2019 $42.25 $39.05 19.40 21.52 $154.64 $139.42
6/30/2019 (5.1%) 2941.76 $39.37 $36.39 19.51 21.94 $153.77 $136.73
3/31/2019 2834.40 $37.99 $35.02 18.76 21.30 $153.05 $134.39

のとき

$tac eps.txt | awk '{gsub("\\$","",$NF);print "eps_year_xts[\"2019::\"]["NR"] <- "$NF}'

eps_year_xts["2019::"][1] <- 134.39
eps_year_xts["2019::"][2] <- 136.73
eps_year_xts["2019::"][3] <- 139.42
eps_year_xts["2019::"][4] <- 150.55
eps_year_xts["2019::"][5] <- 154.18
eps_year_xts["2019::"][6] <- 159.06
eps_year_xts["2019::"][7] <- 164.01
eps_year_xts["2019::"][8] <- 169.14

2019年7月14日日曜日

ffprobe でファイルの属性を調べる 標準エラー出力のリダイレクト ffmpeg



ffprobe , ffmpegはなぜか標準エラー出力をつかうので”2>&1 | ”でリダイレクトしてやる。

$ ls *.mp4 | awk '{print "echo "$1"\n";print "ffprobe "$1" 2>&1 | grep Stream"}' | sh

K-OnS2E01.mp4
    Stream #0:0(jpn): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 636 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
    Stream #0:2(eng): Data: bin_data (text / 0x74786574)
K-OnS2E02.mp4
    Stream #0:0(jpn): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 645 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Stream #0:2(eng): Data: bin_data (text / 0x74786574)
K-OnS2E03.mp4
    Stream #0:0(jpn): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 629 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Stream #0:2(eng): Data: bin_data (text / 0x74786574)

2019年7月10日水曜日

ffmpeg / 正規表現 単語の区切り / map オプション

ffmpegをつかってできるだけ簡単にmp4を作る方法


[avi @ 0x7ffaf7800000] Could not find codec parameters for stream 1 (Audio: mp3 (mp3float) (U[0][0][0] / 0x0055), 48000 Hz, 2 channels, fltp, 128 kb/s): unspecified frame size

が出たときは「-codec:a copy 」をやると良いのかも。。。。

# no conversion just switch container. highly reliable.

ffmpeg -i <INPUT>.avi -codec:v copy -codec:a copy <OUTPUT>.mp4

OR

ffmpeg -i <INPUT>.avi -codec:a copy out.mp4

ffmpeg -i <INPUT>.mkv -vcodec copy <OUTPUT>.mp4

ffmpeg -i sample_input.mkv -vcodec copy sample_output.mp4

for 文をつかってシーケンシャルに数字を振りながらmp4を作る方法


j=0;for i in  *.mkv; do echo $i;  let ++j ; echo $j ; ffmpeg -y -i $i -vcodec copy $j.mp4; done


  • 文の最後に;を書く
  • let をつかってカウンタを加算する
  • ffmpeg -yで既存ファイルがあっても強制上書き
  • forはdo とdoneで受ける
  • 変数は初期化すること


以下と等価となる。

j=0;for i in  *.mkv;
> do echo $i
> let ++j
> echo $j
> ffmpeg -y -i $i -vcodec copy $j.mp4
> done

j=0;for i in *.mp4; do let ++j; mv $j.mp4 hibike_euphonuim_S2E$j.mp4; done


forとsedと正規表現をつかってファイル名を編集しながらmp4を作る方法


  • さいごの「2」で出現順序を指定して置換する。
  • \(<patter>\)で指定して\1で受けてる。
  • -e 大事。これがないと\1 が使えない。(間違い。なくてもOK)



Hibike Euphonium 1 [BD 720p]$ ls *.mp4 | awk '{ print "mv "$1" "$1}' | gsed -e 's/E\([1-9]\)\./E0\1./2'
mv hibike_euphonuim_S1E1.mp4 hibike_euphonuim_S1E01.mp4
mv hibike_euphonuim_S1E10.mp4 hibike_euphonuim_S1E10.mp4
mv hibike_euphonuim_S1E11.mp4 hibike_euphonuim_S1E11.mp4

awk のgensub関数を使えば、sedは使わなくて良いはず。第二引数の"g"はグローバル?例えば2を指定すると2番めにヒットした正規表現だけを処理してくれるらしい。(要研究)

ls *.mp4 | awk '{ print "ls "$1" "gensub("0([1-9])","1\\1","g",$1)}'

map の使い方


$ffmpeg -i <INPUT_FILE> -map 0:0 -map 0:2 <OUTPUT_FILE>

<sample> honomoto@~$ffmpeg -i k01.mkv -map 0:0 -map 0:2 k01.mp4

この場合、k01.mkvには以下のストリームがある。

Stream #0:0(jpn): Video: h264 (High), yuv420p(progressive), 1280x720, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Stream #0:1(eng): Audio: aac (LC), 48000 Hz, stereo, fltp (default)
Metadata:
  title           : Animax Dub, Released by [SrK-Mitsu89]
Stream #0:2(jpn): Audio: aac (HE-AACv2), 48000 Hz, stereo, fltp
Stream #0:3(eng): Subtitle: ass (default)
Stream #0:4(eng): Subtitle: ass

これらのうち、オプション"-map 0:0 -map 0:2"をつかって、0:0と0:2だけを取り込んでファイルに出力する。結果は以下の通り。0:0は0:0に取り込まれる、0:0をスキップしているので0:2が0:1として生成されている。

Stream #0:0(jpn): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 636 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
Metadata:
  handler_name    : VideoHandler
Stream #0:1(jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)

以下、かんたんな説明。

ffmpeg は -iで指定したファイルの順番を0から数えます。またそれぞれのファイルのストリームの順番も0から数えます。

なので-map 0:0 -map 1:0 -map 2:0 と言うのは、
0つ目のファイルの、0番目のストリームと
1つ目のファイルの、0番目のストリームと
2つ目のファイルの、0番目のストリームをそれぞれ0番目、1番目、2番目としてマージするという意味になります。

つまり、<sample>のmapオプション"-map 0:0 -map 0:2"は0つ目のファイルの0番目のストリームとおなじく2番目のストリームをマージして0つ目のファイルの0番目のストリームと1番目のストリームとして出力するという意味になる。


ファイル名変更時のzero padding


~$ head kon2file.list
K-ON!! Ep 01 - Seniors!.mkv
K-ON!! Ep 03 - Drummer!.mkv
K-ON!! Ep 04 - Field Trip!.mkv
<SKIP>
K-ON!! Ep 26 - Visit!.mkv
K-ON!! Ep 27 (OVA) - Plan!.mkv
K-ON!! Ep 5 - Staying Behind!.mkv
K-ON!! Ep 8 - The Future!.mkv

のとき


~$ awk '{print "ffmpeg  -i \""$0"\" -map 0:0 -map 0:2 K-On!!S2E"$3".mp4"}' kon2file.list |sed 's/E\([1-9]\)\.mp4/E0\1.mp4/'

ffmpeg  -i "K-ON!! Ep 01 - Seniors!.mkv" -map 0:0 -map 0:2 K-On!!S2E01.mp4
ffmpeg  -i "K-ON!! Ep 03 - Drummer!.mkv" -map 0:0 -map 0:2 K-On!!S2E03.mp4
ffmpeg  -i "K-ON!! Ep 04 - Field Trip!.mkv" -map 0:0 -map 0:2 K-On!!S2E04.mp4
<SKIP>
ffmpeg  -i "K-ON!! Ep 26 - Visit!.mkv" -map 0:0 -map 0:2 K-On!!S2E26.mp4
ffmpeg  -i "K-ON!! Ep 27 (OVA) - Plan!.mkv" -map 0:0 -map 0:2 K-On!!S2E27.mp4
ffmpeg  -i "K-ON!! Ep 5 - Staying Behind!.mkv" -map 0:0 -map 0:2 K-On!!S2E05.mp4
ffmpeg  -i "K-ON!! Ep 8 - The Future!.mkv" -map 0:0 -map 0:2 K-On!!S2E08.mp4

となる。Zero Paddingされてるところが味噌!ただし、gensub関数を使うほうが楽なので以下を参照すること。

gensub関数を使用したzero padding


gensub関数を使うともっと簡単。\yは単語の区切りを示す。”\y.\y”でキャラクター一文字を示すので、その場合に前に”0”を足してやる。(注意! 他のGNU softwareは単語の区切りに\bを使う)。

~$ awk '{print "ffmpeg -i \""$0"\" K-OnS2E"gensub(/(\y.\y)/,"0\\1","g",$3)".mp4"}'  kon2file.list

ffmpeg -i "K-ON!! Ep 01 - Seniors!.mkv" K-OnS2E01.mp4
ffmpeg -i "K-ON!! Ep 03 - Drummer!.mkv" K-OnS2E03.mp4
ffmpeg -i "K-ON!! Ep 04 - Field Trip!.mkv" K-OnS2E04.mp4
<SKIP>
ffmpeg -i "K-ON!! Ep 27 (OVA) - Plan!.mkv" K-OnS2E27.mp4
ffmpeg -i "K-ON!! Ep 5 - Staying Behind!.mkv" K-OnS2E05.mp4
ffmpeg -i "K-ON!! Ep 8 - The Future!.mkv" K-OnS2E08.mp4

gensubを2回使用して出力結果をさらに調整する


$ ls *.mkv
K-ON! Ep 01 - Dissolution!.mkv                 K-ON! Ep 10 - Another Training Camp!.mkv
K-ON! Ep 02 - Instruments!.mkv                 K-ON! Ep 11 - Crisis!.mkv
K-ON! Ep 03 - Special Lessons!.mkv             K-ON! Ep 12 (Season Finale) - Light Music!.mkv
K-ON! Ep 04 - Training Camp!.mkv               K-ON! Ep 13 (Extra) - Winter Days!.mkv
K-ON! Ep 05 - Advisor!.mkv                     K-ON! Ep 14 (OVA) - Live House!.mkv
K-ON! Ep 06 - School Festival!.mkv             K-ON! Ep 7 - Christmas!.mkv
K-ON! Ep 09 - New Club Member!.mkv             K-ON! Ep 8 - Freshman Reception!.mkv



$ ls *.mkv | awk '{$3=gensub(/(\y.\y)/,"0\\1","g",$3);print "ffmpeg -i \""$0"\" K-OnS1E"$3gensub(/ /,"_","g",$0)".mp4"}'

ffmpeg -i "K-ON! Ep 01 - Dissolution!.mkv" K-OnS1E01K-ON!_Ep_01_-_Dissolution!.mkv.mp4
ffmpeg -i "K-ON! Ep 02 - Instruments!.mkv" K-OnS1E02K-ON!_Ep_02_-_Instruments!.mkv.mp4
ffmpeg -i "K-ON! Ep 03 - Special Lessons!.mkv" K-OnS1E03K-ON!_Ep_03_-_Special_Lessons!.mkv.mp4
<SKIP>
ffmpeg -i "K-ON! Ep 14 (OVA) - Live House!.mkv" K-OnS1E14K-ON!_Ep_14_(OVA)_-_Live_House!.mkv.mp4
ffmpeg -i "K-ON! Ep 07 - Christmas!.mkv" K-OnS1E07K-ON!_Ep_07_-_Christmas!.mkv.mp4
ffmpeg -i "K-ON! Ep 08 - Freshman Reception!.mkv" K-OnS1E08K-ON!_Ep_08_-_Freshman_Reception!.mkv.mp4


最終バージョンはこちら。


  1. $3 をゼロパディングして戻す。
  2. $0の最初から12バイト目までを削って、変数outstringに代入する。
  3. outstringの最後の4バイト(.mkv)を削って戻す。
  4. outstringから"!"を削って、戻す。
  5. 過熱をさけるため1行ごとに60秒休むよう、"\nsleep 60"。を付加する。
  6. 最終的に””で囲まれたもとのファイル名$0と$3,outstring,固定文字列などなどを結合して変換後のファイル名を作成し、組み合わせて最終的なコマンド文字列を生成する。
  7. ゼロパディングは$3=sprintf("%02d", $3)でやったほう良いかも!(「本当の本当の完成バージョン」を参照)

$ ls *.mkv | awk '{$3=gensub(/(\y.\y)/,"0\\1","g",$3);
>  outstring=substr($0,13);
>  outstring=substr(outstring,1,length(outstring)-4);
>  outstring=gensub(/!/,"","g",outstring);
>  print "ffmpeg -i \""$0"\" K-OnS1E"$3gensub(/ /,"_","g",outstring)".mp4\nsleep 60"}'
ffmpeg -i "K-ON! Ep 01 - Dissolution!.mkv" K-OnS1E01-_Dissolution.mp4
sleep 60
ffmpeg -i "K-ON! Ep 02 - Instruments!.mkv" K-OnS1E02-_Instruments.mp4
sleep 60
ffmpeg -i "K-ON! Ep 03 - Special Lessons!.mkv" K-OnS1E03-_Special_Lessons.mp4
sleep 60
ffmpeg -i "K-ON! Ep 04 - Training Camp!.mkv" K-OnS1E04-_Training_Camp.mp4
sleep 60
<SKIP>
ffmpeg -i "K-ON! Ep 13 (Extra) - Winter Days!.mkv" K-OnS1E13(Extra)_-_Winter_Days.mp4
sleep 60
ffmpeg -i "K-ON! Ep 14 (OVA) - Live House!.mkv" K-OnS1E14(OVA)_-_Live_House.mp4
sleep 60
ffmpeg -i "K-ON! Ep 07 - Christmas!.mkv" K-OnS1E07-_Christmas.mp4
sleep 60
ffmpeg -i "K-ON! Ep 08 - Freshman Reception!.mkv" K-OnS1E08-_Freshman_Reception.mp4

本当の本当の完成バージョン


 ls *.mkv | awk '{$3=sprintf("%02d", $3);
 outstring=substr($0,13);
 outstring=substr(outstring,1,length(outstring)-4);
 outstring=gensub(/!/,"","g",outstring);
 print "ffmpeg -i \""$0"\" K-OnS1E"$3gensub(/[ ()]/,"_","g",outstring)".mp4\nsleep 60"}'

可変長で文字を切り出したい時用。注意!!

ls *.mkv | awk '{$3=sprintf("%02d", $3);
match($0,/\s-\s/)
outstring=substr($0,RSTART+2);
outstring=substr(outstring,1,length(outstring)-4);
outstring=gensub(/!/,"","g",outstring);
print "ffmpeg -i \""$0"\" K-OnS1E"$3gensub(/[ ()&,]/,"_","g",outstring)".mp4\nsleep 60"}'

以下でも良かったかも!

ls *.mkv | awk '{$3=sprintf("%02d", $3);
match($0,/-.*-/)
outstring=substr($0,RSTART+RLENGTH);
outstring=substr(outstring,1,length(outstring)-4);
outstring=gensub(/!/,"","g",outstring);
print "ffmpeg -i \""$0"\" K-OnS1E"$3gensub(/[ ()&,]/,"_","g",outstring)".mp4\nsleep 60"}'

正規表現で単語として認められるのはアルファベット、数字、アンダーバーだけなので、注意!

おわり

2019年7月5日金曜日

年と月の計算 yearmon mfrow




> wp
           result period_length         rate  open_p close_p
 1 1973 1.3763938            28  0.011474868   84.30  116.03
 5 1976 1.3013769            16  0.016600207   76.98  100.18
10 1978 0.9423369            15 -0.003951666   98.85   93.15
12 1980 1.1883753             6  0.029182211  114.24  135.76
 1 1984 1.3672189            17  0.018569047  119.52  163.41
 2 1985 1.1075926             3  0.034649717  163.58  181.18
 8 1987 1.3967474            13  0.026036742  236.12  329.80
12 1988 1.0727335             9  0.007831630  258.89  277.72
 2 1990 0.9751147             4 -0.006280247  340.36  331.89
 8 1991 1.1498066             7  0.020142134  343.91  395.43
 4 1992 0.9950124             4 -0.001249244  417.03  414.95
 9 1994 1.0727019            22  0.003195123  431.35  462.71
10 1995 1.0674621             4  0.016454915  544.75  581.50
 9 1997 1.4893871            20  0.020117927  636.02  947.28
 3 2000 1.3639946            17  0.018427587 1098.67 1498.58
 4 2002 1.0345650             7  0.004866239 1040.94 1076.92
 3 2004 1.3277960            12  0.023908021  848.18 1126.21
 5 2006 1.0659588            12  0.005337085 1191.50 1270.09
 6 2007 1.1836842            12  0.014151848 1270.06 1503.35
 5 2010 1.4932221            15  0.027089509  729.57 1089.41
 2 2011 1.1983603             7  0.026187620 1107.53 1327.22
 3 2012 1.1295682             4  0.030927485 1246.91 1408.47
 3 2014 1.2994239            18  0.014657552 1440.90 1872.34
12 2014 1.0273593             4  0.006770750 2004.07 2058.90
11 2017 1.2807753            19  0.013109691 2067.17 2647.58
>

のとき、その20番目から25番目までのエントリを対象に一括でグラフを書く。パラメータ中のデータ(月数)をyearmon で正確に計算するために12で割っている。1/12で1ヶ月、7/12で7ヶ月、19/12で1年と7ヶ月。

par(mfrow=c(3,2))
for(i in seq(1,6,1)){plot.default(to.monthly(SP5)[,4][paste(as.Date((yearmon(index(wp))[20:25] -(wp[20:25][,2]/12))[i]),as.Date(index(wp[20:25])[i]),sep="::")]) }


OR

あるいは、mondateを使って月数の計算を行う。またここでは最初の月を計算ミスするバグを修正するため’+1’を追加した。下の図はバグあり期間計算で作成したもので実際より一月早く始まっている。

for(i in seq(1,6,1)){plot.default(to.monthly(SP5)[,4][paste(as.Date(mondate(index(wp))[20:25][i] -    as.vector(wp[,2][20:25])[i]+1),as.Date(index(wp[20:25])[i]),sep="::")]) }




14番目から19番目までのエントリを対象に一括でグラフを書くときは以下の通り。序数を指定する場所が三箇所あることに注意。

for(i in seq(1,6,1)){plot.default(to.monthly(SP5)[,4][paste(as.Date((yearmon(index(wp))[14:19] -(wp[14:19][,2]/12))[i]),as.Date(index(wp[14:19])[i]),sep="::")]) }