NET/Evernoteに移動。
ジャンル的にはクリップボード拡張。選択テキストの加工もできる。大文字小文字などはありがちだが,かなり凝ったことができる。例えば,・正規表現によるテキスト加工(多段も可能=パイプ),・選択テキストを外部Perlスクリプトに渡し加工して貼り付け(UTF-8渡しも可能),・選択テキストを計算式として計算,などが可能。
繰り返しテキストをリスト化 | [@ s/(.)(.+?)[ ]+(.+?)(?=\1|$)/-$2\n--$3\n/g]
繰り返しテキストをリスト化 | [|] [@ s/(.)(.+?)[ ]+(.+?)(?=\1|$)/-$2\n--$3\n/g] [@ s/ +\n/\n/g] [@ s/(-+) +/$1/g] /E
英文を整形 | [@ s/\b(.{50,70}) (?![., ])\b/$1\n/g]
while (<>) { s/([\d,]+) ([\t\n])/$1$2/g; # エクセルの数値セルをコピーすると余計な空白が付くので除去。 s/\t/|/g; s/[\r\n]+//; print "|$_|\n"; }
SJIS外の文字も正常に処理できる。PU2で呼出せばUTF-8で渡せる。ただ,Perlスクリプト内でのエンコードには多少注意が必要。
まず,Perlで日本語を扱う基礎知識が必要。これはペースターの問題ではない。UTF-8で渡しても内部表現になっているわけではないので,デコードが必要だし,エンコードも必要。これは普通の日本語処理プログラミングと何ら変わりはない。
use utf8; binmode STDIN, ":encoding(utf-8)"; binmode STDOUT, ":encoding(utf-8)"; | これが簡便でよい。 |
use encoding "utf8"; | 一部情報が欠落することがある。 |
TMPGEncを使わずにこれを使うのは自動化が目的だから、スクリプトを使う。私はPerl (Active Perl)を使う。
#!/usr/bin/perl use utf8; # NHKニュース7.ts のエンコード専用 my $serviceID = 1024; my $fname = qr/^(.+NHKニュース7)\.ts$/; # .tsのあるディレクトリで実行。 # GUIから直接実行なら、終了後画面が閉じるのでSTDERRを保存する。 use strict; use warnings; use Encode; my $cp932 = find_encoding('cp932'); # http://gihyo.jp/dev/serial/01/modern-perl/0032?page=2 # 画面に出すならこのbinmode STDERR ...はwell works # binmode STDERR, ":encoding(cp932)"; # ('cp932')はNG # ファイルに出す close STDERR; open (STDERR, '>>:encoding(cp932)', 'ffmpeg.log') or die $!; $| = 1; # current directory use Cwd; my $wd = Cwd::getcwd(); opendir my $dh, $wd or die "$wd:$!"; my @files = readdir $dh; closedir $dh; for (@files) { $_ = $cp932->decode($_); # 正規表現リテラルで検討するにはdecode必須。 next unless /$fname/; # ファイル名をencodeしないと対外的な操作できない。 my $infile = $cp932->encode($_); my $outfile = $cp932->encode($1) . '.mp4'; my $mtime = (stat($infile))[9]; # 動画時間を取得し、何倍速でエンコードできたか表示する my $info = qx(ffprobe "$infile" -hide_banner -show_entries format=duration); # STDOUTにこれだけ返り、$infoに入る。 # [FORMAT] # duration=1808.072933 # [/FORMAT] my $duration = 0; if ($info =~ m|duration=([\d\.]+)|g) { $duration = $1; } my $stime = time; qx(ffmpeg -y -hide_banner -nostats -init_hw_device qsv:hw -i "$infile" -vf "scale=1280:720" -global_quality 25 -c:v h264_qsv -ac 2 -map 0:p:$serviceID:0 -map 0:p:$serviceID:1 "$outfile" ); # タイムスタンプ変更 utime($mtime, $mtime, $outfile) if -e $outfile; my $passed = time - $stime // 0; my $sname = $cp932->decode($0); # $0はPerlの特殊変数でスクリプト名 printf STDERR "$sname: %.1f times\n",$duration/$passed if ($passed > 0); }
音声多重を速度を変えてエンコードするには2passにする。
#!/usr/bin/perl use utf8; # BS世界のドキュメンタリーのエンコード専用 # 速度を変えるため2回変換している。そうしないと音声多重放送では音ずれを # 防げないようだ。 my $serviceID = 101; my $fname = qr/^(BS世界のドキュメンタリー.+)\.ts$/; # .tsのあるディレクトリで実行。 # GUIから直接実行なら、終了後画面が閉じるのでSTDERRを保存する。 use strict; use warnings; use Encode; my $cp932 = find_encoding('cp932'); # http://gihyo.jp/dev/serial/01/modern-perl/0032?page=2 # 画面に出すならこのbinmode STDERR ...はwell works #binmode STDERR, ":encoding(cp932)"; # ('cp932')はNG # ファイルに出す close STDERR; open (STDERR, '>>:encoding(cp932)', 'ffmpeg.log') or die $!; $| = 1; # current directory use Cwd; my $wd = Cwd::getcwd(); # glob関数はWindowsでは正しく動かないという指摘あり(未確認) opendir my $dh, $wd or die "$wd:$!"; my @files = readdir $dh; closedir $dh; for (@files) { $_ = $cp932->decode($_); # 正規表現リテラルで検討するにはdecode必須。 next unless (/$fname/); # ファイル名をencodeしないと対外的な操作できない。 my $infile = $cp932->encode($_); my $middle = $cp932->encode($1) . '.mid.mp4'; my $outfile = $cp932->encode($1) . '.mp4'; my $mtime = (stat($infile))[9]; # 動画時間を取得し、何倍速でエンコードできたか表示する my $info = qx(ffprobe "$infile" -hide_banner -show_entries format=duration); # STDOUTにこれだけ返り、$infoに入る。 # [FORMAT] # duration=1808.072933 # [/FORMAT] my $duration = 0; if ($info =~ m|duration=([\d\.]+)|g) { $duration = $1; } my $stime = time; qx(ffmpeg -y -hide_banner -nostats -init_hw_device qsv:hw -i "$infile" -vf "scale=1280:720" -global_quality 25 -c:v h264_qsv -ac 2 -map 0:p:$serviceID:0 -map 0:p:$serviceID:1 "$middle" ); qx(ffmpeg -y -hide_banner -nostats -init_hw_device qsv:hw -i "$middle" -vf "setpts=2/3*PTS" -af "atempo=1.5,pan=mono|c0=c0" -global_quality 25 -c:v h264_qsv "$outfile" ); # タイムスタンプ変更 utime($mtime, $mtime, $outfile) if -e $outfile; my $passed = time - $stime // 0; my $sname = $cp932->decode($0); # $0はPerlの特殊変数でスクリプト名 printf STDERR "$sname: %.1f times\n",$duration/$passed if ($passed > 0); }
[BSFrequency] 0x4010=11727 0x4011=11727 0x4012=11727 0x4030=11766 0x4031=11766 0x4450=11804 0x4451=11804 0x4470=11843 0x4090=11880 0x4091=11880 0x4092=11880 0x46B1=11919 0x46B2=11919 0x40D0=11958 0x40D1=11958 0x40F1=11996 0x40F2=11996 0x4310=12034 0x4311=12034 0x4632=11766 0x46d2=11958 0x4730=12073 0x4731=12073 0x4732=12073 0x4750=12111 0x4751=12111 0x4752=12111 0x4770=12149 0x4771=12149