2016年11月7日月曜日

ゆっくりMovieMakerでフォントがプレビュー画面に反映されない時の応急処置

ゆっくりMovieMaker(ゆっくりムービーメーカー、通称YMM)は
「日本語対応フォント」でないとプレビュー画面にフォントが反映されない。



↑字幕のフォントを選択するとき、太字で表示されているものが「日本語対応フォント」。

…が、明らかに日本語に対応しているフォントなのに太字で表示されず
プレビュー画面に反映されないケースがある。


コーポレート・ロゴBはこんなフォントではない

どういうロジックで日本語対応/非対応を判断しているか分からないけど
実はttfファイルをフォント編集ソフトでひらいて
フォントファミリー名やフォント識別文字(?)を任意の「日本語対応フォント」のものに書き替えると
プレビュー画面に反映させることができる。


↑名前は別のフリーフォントだけど、中身はコーポレート・ロゴB。

……当然、ttfファイルの編集を堅く禁止しているフォントでは不可能。
というより、この方法自体あんまりよろしくないと言わざるを得ない。
名義を拝借しているフォントは共存できなくなるし。あくまで応急処置ということで。


2016年10月16日日曜日

【スプラトゥーン】ゲームパッドの画面をテレビに映す

諸事情により小さなテレビが1台余ったから
ずっとやってみたかったことをやってみる。


すなわち、いつものゲーム画面の下に
本来ゲームパッドにしか表示されないマップ画面を表示して
快適に遊ぼうという計画。

※ズルくね?と思った方はぜひ最後までお読みください。


手順
  1. ゲームパッドにWebカメラを固定する(過去記事を参照)
  2. キャプチャソフトでWebカメラの映像をPC画面に表示する
  3. PCのモニタと小さなテレビをデュアルディスプレイにする
  4. 小さなテレビ側にキャプチャソフトのウィンドウを移動する
  5. 移動したウィンドウを最大化する(アマレコTVならAlt+Enter)

結果

写真撮るとき近付きすぎた


よっしゃ~~~~!!
これでついついゲームパッド見逃す自分でも闘えるぞー!
ガチホコを見失ってタッチダウン決められたり
裏取りに気付かずボコられることがなくなるぞぉぉー!!
早速ナワバリバトルで試してみよ~~~!!!
















………………。




本日の教訓
普段ロクにゲームパッド見てないヤツが何をやっても駄目なものは駄目


※結局テレビは片付けました

2016年6月27日月曜日

Windows10アップグレードからの速攻巻き戻し

別に10に恨みがある訳ではないけど、まだ7を使い続けたい。

Windows10の認証はハードウェア(マザボ?)単位で紐づけが行われるらしいので
・True Imageで現在のWindows7環境のバックアップを取る
・Windows10へアップグレードする
・True ImageでWindows7へリカバリする
という手順を踏むことにした。これならWin7環境が汚れないし、
Microsoftのサーバ側には現在のハードウェアで認証した記録が残るから
Windows7のサポートが切れる際に無償で10へ移行できるはず。


作業手順

1. ブータブルメディアを作る

自分が持っているTrue Image Home 2012 plusはWindows10に対応しておらず
アップグレード時にアンインストールされる。
そのため、Windows10にした後にTrue Imageを起動するためのブータブルメディアが必要。

2. Cドライブ(システムドライブ)のバックアップを取る


3.Windows10にアップグレード

アップグレード用のアプリを使う。ダウンロード含めて1時間半~2時間くらい?
しかしWindowsで使うソフトウェアのことをアプリと呼ぶのは違和感あるな…

4. ブータブルメディアからTrue Imageを起動してWindows7環境を復元

無邪気に増分バックアップしまくってたせいで一晩かかった。
やっぱり定期的に完全バックアップ取らないとダメだ。


やったけど必要じゃなかった作業
・USBメモリにWindows10アップグレード環境をつくる
2016年7月末までに準備しておけばそれで良かった。

・Dドライブのバックアップを取る
Cドライブ以外への影響はなかった。
まあ必須じゃなかったというだけで、必要な作業ではある。

------------------------------------------------------

一応アップグレード直後のシステムのプロパティを開いて
ちゃんとWindows10のライセンス認証が通ったかどうかの確認はしたけど、
これで2020年に再アップグレードできなかったらイヤだなあ。

2016年6月26日日曜日

ニコニコ大百科IME辞書とMeCabと棒読みちゃん

※このエントリに出て来る「IME」は大体MS-IMEを指しています。


「ニコニコ大百科IME辞書」という、ニコニコ大百科に登録されている単語が
IMEで変換できるようになる素晴らしい辞書がある。

一方、棒読みちゃんはIMEを使って漢字→かな変換をしているので
この辞書をIMEに登録すると自然と棒読みちゃんも賢くなる。

ぜひ棒読みちゃんを賢くしたいけど、
IMEにニコニコ大百科の言葉を登録すると変換誤爆が怖いです><;という場合、
棒読みちゃんの漢字→かな変換処理にMecabを使用すると住み分けが出来る。

・Mecabって何さ
日本語の文を以下のような感じで解析するツール。

-------------------------------------------
C: >mecab
私の名前は山田太郎です。
私      名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
名前    名詞,一般,*,*,*,*,名前,ナマエ,ナマエ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
山田    名詞,固有名詞,人名,姓,*,*,山田,ヤマダ,ヤマダ
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。      記号,句点,*,*,*,*,。,。,。
EOS
-------------------------------------------

英語みたいに間にスペースが入っている訳ではないから、
コンピュータにとって日本語は単語ごとに分割するのが難しい言語。
Mecabはそれをいい感じに分割してくれるスゴいヤツ。Twitterのbotにもよく使われている。

Mecabが持っている辞書にニコニコ大百科の単語を登録すれば
棒読みちゃんはその通りに読み上げてくれるはず。
という訳でニコニコ大百科IME辞書の内容をMeCabの辞書に変換してみる。

1. MeCabのインストール

以下のページからMeCabをDLしてインストールする。
http://taku910.github.io/mecab/
※「Binary package for MS-Windows」と書かれているところ。
  棒読みちゃん側で動作確認しているのは0.98だけどそれ以降のverでも動くっぽい

インストール中に辞書の文字コードを聞かれるので、Shift-JISを指定する。
それ以外の文字コードにすると棒読みちゃん側で文字化けしてしまう。


このことからも分かる通り、ユニコード特殊文字バリバリな単語は
残念ながら今回棒読みちゃんに読ませることはできない。

インストールが終わったらMeCabのbinフォルダにパスを通す。
マイ コンピュータのプロパティ→システムの詳細設定→環境変数→ユーザー環境変数のpathの
先頭に以下の文字列を追加。
「<MeCabインストールフォルダ>\bin;」

こんな感じ



2. ActivePerlのインストール

Perlスクリプトでニコニコ大百科IME辞書→MeCab辞書用CSVファイルの変換を行うため、
以下からActivePerlをDLしてインストールする。
http://www.activestate.com/activeperl/downloads
※「DOWNLOAD PERL: OTHER PLATFORMS AND VERSIONS」と書かれているところ

自分の環境はActivePerl v5.16.3だから古いけど
多分最新版のActivePerlでもスクリプトは動く…はず…

3. スクリプトの準備

以下のスクリプトを「make_dic_csv.pl」として保存する。
文字コードはUTF-8。

スクリプト(要ActivePerl) -

色々凝っていたら長くなった…。


4. ニコニコ大百科IME辞書のDL

以下のページからニコニコ大百科IME辞書をDLする。
http://tkido.com/blog/1019.html

nicoime.zip を展開すると「nicoime_msime.txt」が出て来るので、
nicoime_msime.txtを3.で準備したmake_dic_csv.plと同じ階層に配置する。


5. スクリプトの実行

エクスプローラをひらき、make_dic_csv.plとnicoime_msime.txtがある階層で
Shiftキーを押しながら右クリック→「コマンドウィンドウをここで開く」を選択する。

Shiftキーを押しながらじゃないと表示されない

コマンドプロンプトの画面が表示されるので、以下を入力してEnterキーを押す。

-------------------------------------------
perl make_dic_csv.pl
-------------------------------------------

こんな感じになる

この時点で、make_dic_csv.plとnicoime_msime.txtがある階層に
「nico_dic.csv」が出来ている。


6. CSVファイルをMeCab辞書に変換

5. のコマンドプロンプトの画面で続けて以下を入力してEnterキーを押す。

------------------------------------------------
mecab-dict-index -f SHIFT-JIS -t SHIFT-JIS -d "C:\Program Files (x86)\MeCab\dic\ipadic" -u nico.dic nico_dic.csv
------------------------------------------------
※C:\Program Files (x86)\MeCab の部分はMeCabのインストールパスに応じて変更する


5.の画像の続き


これでMeCab用の辞書が完成する。

 「nico.dic」がMeCab用辞書


7. MeCabのユーザ辞書に登録する

作成したnico.dicをMeCabのdicフォルダの下に移しておく。
<MeCabインストールフォルダ>\dicの下に適当な名前(userとか)でフォルダを作成して
その中にnico.dicを入れる。(例:C:\Program Files (x86)\MeCab\dic\user\nico.dic)

その後、<MeCabインストールフォルダ>\etc\mecabrcをエディタでひらき、
以下の通りnico.dicのパスを指定して保存する。

--------------------------------------------------------
userdic = "C:\Program Files (x86)\MeCab\dic\user\nico.dic"
--------------------------------------------------------

辞書追加作業はこれでおしまい。


8. 棒読みちゃんのテスト

…の前に、忘れずに以下の設定をしておく。
棒読みちゃん設定画面→[システム]→[漢字→かな変換]→[01)漢字→かな変換モード]の欄で
MeCabを指定し、OKボタンを押す。

これを忘れるとMeCabを使ってくれない


以上で準備OK。
試しに「デカライン高架下でRブラスターエリートにやられた!」と入力してみる。
正しい読み方は「でからいんこうかしたでらぴっどぶらすたーえりーとにやられた!」


辞書追加前



辞書追加後



ちゃんと「でからいんこうかした」「らぴっどぶらすたーえりーと」と発音してくれる。
やったぜ。

しかしここで1つ悲しいお知らせが…。

「じゅうよんしきたけづつじゅう」

どうも数字を含む場合は数字の前後で強制的に分割して読んでしまうらしく、
MeCabの辞書に「14式竹筒銃・乙」を登録していても問答無用で分割されてしまう。
理由は分からない。MeCab側ではちゃんと「14式竹筒銃・乙」を1つの単語として認識している。

MeCab「ワイは分かっとるで」

一応nico_dic.csvから数字を含む単語を抽出してみると、その数9,947個…。
これらは多分、棒読みちゃん側で辞書登録しないと正しく読んでくれない。
無邪気に登録するとまず間違いなく重くなる。お手上げ。

じゃあMeCab用辞書を軽くするために数字を含む単語は除外しよう!
と言いたいところだけど、疲れたのでそれは次回の課題に _(┐「ε:)_


色々試して分かったのが、ニコニコ大百科は登録されているフレーズがやんちゃ過ぎて
真正面からMeCabに登録すると大変なカオスになるということ。

IMEは読み→漢字変換が目的なので問題にならないことが、
MeCabだと漢字→読み変換が目的なので問題になることがある。
例えばこの単語(単語:という 読み:タイヘンモーシャケゴゼマセンデスタトイウ)とか。

IMEの用途だと「という」と打って変換しても読みは関係ないから支障ないけど、
棒読みちゃんの場合は「という」を「タイヘンモーシャケゴゼマセンデスタトイウ」と読んでしまう。
つーか何なのこの読み方、何があったのさ。
※上記の手順でnico.dicを作成した場合はちゃんと「という」を「という」と読みます。

あと、棒読みちゃん側の前処理(MeCab実行前に行う処理)が結構強力で、
大百科通りの表記で辞書登録すると前処理後の字面と食い違ってしまうケースが多かった。
スクリプトの if($for_bouyomi){ ~ } の中の処理はその辺の試行錯誤の結果。


参考URL

ニコニコ大百科IME辞書 - 神は細部に宿り給う
http://tkido.com/blog/1019.html

[mecab] mecab辞書にwikipediaのタイトルリストを追加 [wikipedia][はてなキーワード] - fukushimuのメモ帳
http://fukushimu.blog.shinobi.jp/mecab/-mecab-%20mecab%E8%BE...

perl でSTDOUT への出力を一時的に無効にしたい - うまいぼうぶろぐ
http://hogem.hatenablog.com/entry/20110602/1307029127

Perl用、日本語「全角」→「半角」変換ルーチン - adiary開発日誌
http://adiary.blog.abk.nu/0263

文字コードの指定 - PerlPlus
http://www.perlplus.jp/perl/file/index12.html

手抜き固有表現抽出の試行 - ねがとんのねごと
http://d.hatena.ne.jp/negaton/20090405/1238917910

2016年6月20日月曜日

聞々ハヤえもんとASIO4ALLは相性が悪いらしい


聞々(ぶんぶん)ハヤえもんを久々に使おうとしたら
再生ボタンを押しても再生できないという現象に遭遇した。

昔からあるソフトだし…と思いつつVectorのWindows動作報告ページを見ると、
つつがなく動作する人と動作しない人に分かれている。
環境依存の問題と判断して色々試していたら、原因が分かった。
ASIO4ALLだった。ASIO4ALLを停止したらきちんと再生できるようになった。

困ったことに、ASIO4ALLは2016年現在
BEHRINGER XENYX 302USBの公式ドライバとなっている。
XENYX 302USB Download Page - BEHRINGER

なので、こちらのページから旧ドライバを導入した。
サポート - Hot Line Music
「※旧XENYX/U-Control用32-bit USB ASIO オーディオドライバー」もしくは
「※旧XENYX/U-Control用64-bit USB ASIO オーディオドライバー」が旧ドライバ。
ファイル名はそれぞれ
BEHRINGER_2902_WIN32_2.8.40.zip および BEHRINGER_2902_X64_2.8.40.zip。


…ということを色々やっていたら


何やらハヤえもんの方で「ASIO」という項目を見つけた。
これにチェックを入れればASIO4ALL環境でも正しく動作するのだろうか?
(とっととドライバを入れ替えてしまったためこの項目の効果は未確認)

実はASIO4ALL環境下で聞々ハヤえもんがうまく動作しないという問題は
Yahoo!知恵袋にも寄せられていたが、原因調査のために色々ググった時には引っかからなかった。
うまいことクリティカルワードを外してしまったらしい。ぐぬぬ。

2016年6月18日土曜日

【ニコ生配信】マイクの音量バランスやノイズ対策

ゲーム配信で悩みの尽きないマイク。
やたらと音声が小さかったり、ノイズが乗ったり…。

どうにか聞きやすくしたい。


1. 外付けオーディオインターフェースを使う

鉄板。
というか内蔵のオーディオインターフェースはPC内部にあるがゆえに
色んなアレやソレが混線してノイズ不可避。

これ以降の項目は外付けオーディオインターフェース前提。
自分が使用しているのはBEHRINGER XENYX 302USB
安価モデルながらヘッドホンマイクもダイナミックマイクも差し込めるニクいやつ。

マイクの話題には関係ないけど、ヘッドホンの音量をかなり大きく調整可能なので
元々の音量が小さな動画や生放送にある程度こちらで対応できるようになる。


2. 外付けオーディオインターフェースI/Fを他の電子機器から離す

意外と盲点。
外付けにしたから安心だーと言って別の電子機器の上に乗せたりすると台無し。
自分の場合はHDMIダウンコンバータというノイズのかたまりみたいなヤツに乗せていたせいで
ホワイトノイズどころかガ―――――ピ―――――みたいなノイズが入っていた。


3. ダイナミックマイクを使う

一番効果があったノイズ対策。
いかなるヘッドホンマイクを差してもサ――――ッというノイズが消えなかったのに
駄目元でCM2000をぶっ差したら全くノイズが乗らなくなった。ビックリした。


なんでそんなもん持ってたんだか


本来の用途が用途だけにポップノイズもほとんど乗らない。素晴らしい。
とは言えゲーム実況だとマイクを持ちながら実況するのはキツいので
その辺は工夫する必要がある。ネックストラップでうまいこと固定するとか。


4. VSTプラグインを使う

ハードウェアだけではなくソフトウェアの面からも何とかする場合の方法。
VSTプラグインの設定方法は省略。

Reafir


以下のページの真ん中あたりにあるReaFirの設定を適用すると
サ――――ッというホワイトノイズを抑えることができる。

Virtual Audio Mixerで生放送時のマイクノイズ対策 - 水おいしいです^o^




マイクの音量を最大にしてもニコ生でほとんど聞こえない時に使うコンプレッサ。
一番右上にある「MAKEUP」のツマミを回すと音量を底上げできる。

これ


自分の環境では、XENYX 302USBとTDR Feedback Compressor IIを組み合わせている。
XENYX 302USBはマイクの音量をかなり大きく調整できるものの
あまり大きくしすぎるとノイズまで増幅されるため、
ある程度XENYX 302USB側で大きくした後はTDR Feedback Compressor IIで音量を上げている。


おまけ

スプラトゥーンの配信をしていると、
意外と気になるのがゲームパッドのスティックのカチカチ音。
使用しているマイクの性能によってはこのカチカチ音を拾ってしまう。

 剥がれかけに見えるけど大丈夫

そんな時は100均や手芸屋さんに売っている
裏に粘着テープの付いた生地を巻いておくとカチカチ音が鳴らなくなる。

いっぺん横着して輪ゴムを巻いてみたらスティックが倒しきれなくなり
イカボーイがロボットパフォーマンスばりのゆっくりモーションでしか移動できなくなった。


2016年6月12日日曜日

【スプラトゥーン】仲間の「マンメンミ!」をゲーム音と一緒にキャプチャする

スプラトゥーンにおけるコミュニケーションの要、ナイスとカモン。
いわゆるひとつの「マンメンミ!」

このナイスとカモンの声はゲームパッドからしか出ないため、
普通にWiiU本体からの映像と音声をキャプチャしただけでは「マンメンミ!」が入らない。
うーん、録画にも仲間の声を残したい。
ファインプレーして互いに「ナイス!」した時のよっしゃ感を録画でも味わいたい。

という訳でゲームパッドから音を取り込もう。

ただしイヤホン端子にケーブルを差し込んでPCのライン入力に接続すると、
ゲームパッドからは音が出なくなる。
つまりこのままだとプレイ中にマンメンミ!が聞けない。

それだと寂しいので、一旦オーディオインターフェース(UA-3FX)を噛ませることで
PCのライン入力とイヤホン両方に音を流すようにする。
これならイヤホンを付ければゲームパッドの音が聞こえる。




UA-3FXのイヤホン端子は手前側(見切れている)

オーディオインターフェースは、インプットモニター機能(※)がついたものなら何でもいいはず。
※キャプチャした音声を遅延なしでイヤホン側に流す機能

しかしやっぱりイヤホン端子の出力をライン入力にぶっ込むのは無理があるらしく、
UA-3FXのINPUTレベルを最大にして、かつゲームパッドの音量も最大にして
ようやく普通にPC側で聞ける音量になる。

わざわざオーディオインターフェースを使わずに
100均にもある分配器を使ってイヤホンとオーディオケーブルに分配できれば楽だけど、
残念ながらそれだとPC側でほとんど聞こえなくなる。
(ただでさえ音量MAXで取り込まないと聞こえない弱さなのに、それを分配してしまうと…)

今回の用途には不向き



【スプラトゥーン】ニコ生配信構成図

スプラトゥーンのニコ生配信環境がごちゃごちゃしてきたので整理。
何も見ずに同じ構成を再現できる気がしない('A`)

やりたかったこと (この構成で出来ること)

・試合中のマップ画面も配信する
・戦績をikaLogに送信する
・ローカルに録画を残す。ただし字幕やマイク、棒読みちゃんは残さない
・味方の「ナイス!」「カモン!」も配信音声に含める
・配信窓でニコ生の音声確認をできるようにする(PC上の音をミキシングしない)
・棒読みちゃんの声だけスピーカーから聞こえるようにする(キャプチャしたゲーム音は流さない)
・マイクの声にソフトエフェクトを掛ける
・CPU使用率をなるべくおさえる(大体60%程度)


構成図


デバイスの内訳

オーディオI/F①:Roland UA-3FX(インプットモニタ機能が付いているデバイスなら何でも
オーディオI/F②:BEHRINGER XENYX 302USB(マイクとイヤホンの音量調整がいい感じに出来るので)
オーディオI/F③:Realtek High Definition Audio(よくあるやつ)

キャプチャ:AVerMedia AVT-C875
Webカメラ:Logicool C270

マイク:CUSTOMTRY CM-2000(首からつるして使用)
スピーカー:ダイソーに売ってる100円のもの

仮想オーディオデバイス①:WsAudio_Device(1)
仮想オーディオデバイス②:WsAudio_Device(2)
   (Wondershareのソフトをインストールすると一緒に入ってくる仮想オーディオデバイス)


ソフトウェアの内訳

・大御所キャプチャソフト
・ikaLogを使用するため、映像を直接XSplit Broadcasterに流さずいったんアマレコTVで受ける
・将来Windows10にアップデートする場合の泣き所その1。アマレコTV4で大丈夫かな…?
 →アマレコTV4は64bit版のみ。キャプチャデバイスのAVT-C875は64bit非対応。
   Win10はサポート対象外ということを承知の上でアマレコTV 3.10を使い続けるしかない

・みんな大好きスプラトゥーンリアルタイム画像解析ソフト
stat.inkに戦績を投稿したり自動で録画を開始するために使用
slideshareの解説がとても面白い

・キャプチャソフトその2。画面を自由にレイアウトできる
・アマレコTVの映像、Webカメラの映像、ゲーム音をこのソフトでキャプチャする
・無料版でOK
・ローカルに録画するのはこのソフトでキャプチャしている映像と音声

OBS (実際に使用しているのはOBS MP 改二 0.14.2)
・キャプチャソフトその3。正式名称はOpen Broadcaster Software
・NVENCでCPU使用率を抑えつつHE-AACv2でビットレートを節約するためにOBS MP 改二を採用
 (公式版OBSでは今のところHE-AACv2を圧縮形式に指定できない)
・ただしXSplit Broadcasterと相性が悪く、そのままだと映像を取り込めないので工夫する
 (この工夫は0.16.x以降必要なくなった?)
・ニコ生に配信するのはこのソフトでキャプチャしている映像と音声

FFmpegのGUIランチャー
・普通は配信に使用する。が、この構成では録画用の設定を保存するために使用
・ikaLogと連携して自動で録画開始/停止するようにしている。スクリプトはこんなの
・XSplit Broadcasterのローカル録画機能は音質が悲しいことになるためFFMpegで録画している

・任意のウィンドウを最前面で固定する
・ニコ生にワンポイントで表示するペイントソフトが他のウィンドウに隠れないように出来る

・サウンドルーティングソフト 3つセット
アマミキ!の方が新しいけど猿ちぃはVSTプラグインが使用できる
・将来Windows10にアップデートする場合の泣き所その2

・ニコ生コメントビューア&音声読み上げソフト
・棒読みちゃんの音声出力先を仮想オーディオデバイス②に設定する(基本設定→音声出力デバイス)


その他

・Webカメラでゲームパッドの画面を撮影する方法→こちらの記事

・OBSの設定画面
これでも画質が高すぎるのかNVENCが重いのか、時々配信画面が止まる(;'A`)
ニコ生の更新ボタンを押せば直るタイプの止まり方なのでまだマシとは言え、
出来るだけ高画質で配信したい…


・OBS MP 改二をビルドあれこれ
Q. 「d3d9-capture.cpp(65): fatal error C1001」とか出る
A. https://twishort.com/F0wkc VC2015ではなくVC2013使った方が良さげ

Q. Error: could not load cache
A. env32.sh(env64.sh)のコメントアウト外し忘れ、もしくは設定ミス
  QtはC:\Qt以外にもインストールできるがC:\Qt以下にインストールした方が安全

Q. OBS起動時にこんなメッセージが出た!
  「プロシージャ エントリ ポイント (中略) が
  ダイナミック リンク ライブラリ Qt5Core.dllから見つかりませんでした」
A. ニコ生用プラグインを手動で最新版に差し替えた時に発生する可能性がある。
  BuildStudioOBSでビルドするニコ生用プラグインとはちょっと違う?
  大人しくOBS MP 改二ごとビルドしなおすとスムーズ

Q. その他いろんなビルドエラー
A. 環境を再確認する(64bit版ビルドツールで32bit版OBSをビルドしようとしていないか)
  env32.sh(env64.sh)のコメントアウトの状態を今一度確認する
  ※OSが64bitでも32bit版OBSはビルドできる、起動も可能


2016年6月6日月曜日

ikaLogとFFMPEG Launcherを連携させるスクリプト+録画用コマンドライン

この記事の番外編。

FFMPEG Launcher(FFML)を配信用ではなくローカル録画用に使っている人は少ないだろうし
そもそもAutoItスクリプトの中で直接ffmpeg.exeを叩けばいいのだけど、
やり方を調べるのが面倒なので FFMLに設定を保存出来て便利なので、一応。

※以下のスクリプトはFFMPEG Launcher ver 0.0.1.15.8で動作を確認。

=============================↓↓ここから↓↓==============================
#include <FileConstants.au3>
#include <StringConstants.au3>

Const $STARTsleepSec = 0 ;録画開始の待機時間(秒で指定)
Const $STOPsleepSec = 10 ;録画終了の待機時間(秒で指定)
Const $RENAMEsleepSec = 2 ;録画終了後リネーム処理までの待機時間(秒で指定)

Func RenameFile($source)
Local $dest = EnvGet('IKALOG_MP4_DESTNAME')
$dest = StringReplace($dest, "/", "\")
If $dest = '' Then
Return False
EndIf

FileMove($source, $dest, $FC_OVERWRITE)
EndFunc

Func FindRecentRecording()
Local $directory = EnvGet('IKALOG_MP4_DESTDIR')

; Replace all slashes to backslashes.
; $directory also needs a backslash at its end.
$directory = StringReplace($directory, "/", "\")
If StringRight($directory, 1) <> "\" Then
 $directory = $directory & "\"
EndIf

Local $hSearch = FileFindFirstFile($directory & "*.mp4*")

If $hSearch = -1 Then
 MsgBox(0, "Error", "Could not find any candinates in " & $directory & " (path 1)", 10)
 Return False
EndIf

Local $latest_file = ''
Local $latest_timestamp = ''

While True
Local $file = FileFindNextFile($hSearch)
If @error Then ExitLoop

Local $timestamp = FileGetTime($directory & $file, $FT_MODIFIED, $FT_STRING)
If StringCompare($timestamp, $latest_timestamp) > 0 Then
$latest_file = $directory & $file
$latest_timestamp = $timestamp
 EndIf
WEnd

FileClose($hSearch)

If $latest_file = '' Then
MsgBox(0, "Error", "Could not find any candinates in " & $directory & " (path 2)", 10)
Return False
EndIf

Return $latest_file
EndFunc

Func ControlFFMPEGLauncher()
;ウィンドウを取得
Local $hWnd = WinWait("FFMPEG Launcher","", 1)

If $hWnd == 0 Then
Return False
EndIf

; 配信ボタンの文字列を取得
Local $l = ControlGetText ($hWnd, '', '[CLASS:WindowsForms10.BUTTON.app.0.141b42a_r28_ad1; INSTANCE:3]')
;「配信中」なら録画状態、それ以外なら待機状態
Local $recStatus = (StringCompare($l, '配信中') == 0)

If $recStatus Then
; 録画終了待機
Sleep(1000 * $STOPsleepSec)
Else
; 録画開始待機
Sleep(1000 * $STARTsleepSec)
EndIf

WinActivate($hWnd)
WinWaitActive($hWnd, "", 1)

; 配信ボタンを押す
ControlClick($hWnd, '', '[CLASS:WindowsForms10.BUTTON.app.0.141b42a_r28_ad1; INSTANCE:3]')

; 録画中だったらmp4ファイルのリネーム処理実行
If $recStatus Then
If EnvGet('IKALOG_MP4_DESTDIR') <> "" Then
Sleep(1000 * $RENAMEsleepSec)
Local $file  = FindRecentRecording()
RenameFile($file)
EndIf
EndIf

EndFunc

ControlFFMPEGLauncher()

=============================↑↑ここまで↑↑==============================

配信ボタンのクラス名は、以下のサイトを参考にして取得しました。

(スクリプトとは関係ない話)
自分の環境だとFFMPEGでのローカル録画時にCPU使用率が100%近くまで張りついてしまい、
どちらかというとスクリプトの作成よりその負荷解消に四苦八苦することに orz

結局一番効いたのは、プリセットをmediumからveryfastに変更すること。
よっぽど画質にこだわらない限り十分。crfやmaxrateは独立して調節できるし。

うーん、どのオプションがCPUに負荷をかけていたのやら。


おまけ ローカル録画用のコマンドライン
FFMPEG Launcherの高度な設定→拡張タブに入力して使う。
画質の高さより負荷の軽さを取っていくスタイル

コピペ用
----------------------------------------------
ffmpeg.exe -rtbufsize 200MB -f dshow  -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -threads 0 -r 30  -profile main -preset veryfast -partitions parti4x4+partp8x8+partp4x4 -pix_fmt yuv420p  -crf 20.0 -maxrate 2000k -bufsize 4000k -vcodec libx264  -acodec libfdk_aac -profile:a aac_he  -afterburner 1 -ar 44100 -ab 192k -ac 2 -vsync 1 -async 1 -vol 256 -y "L:\ika\movie\ffmpegoutput.mp4"
----------------------------------------------

補足
ffmpeg.exe【※1】 -rtbufsize 200MB -f dshow  -i video="XSplitBroadcaster":audio="XSplitBroadcaster"【※2】 -threads 0 -r 30  -profile main -preset veryfast -partitions parti4x4+partp8x8+partp4x4 -pix_fmt yuv420p  -crf 20.0 -maxrate 2000k -bufsize 4000k -vcodec libx264  -acodec libfdk_aac【※3】 -profile:a aac_he  -afterburner 1 -ar 44100 -ab 192k -ac 2 -vsync 1 -async 1 -vol 256 -y "L:\ika\movie\ffmpegoutput.mp4"【※4】

※1
ffmpegにパスを通していない場合はフルパスで記述する

※2
オーディオ名には"XSplitBroadcaster"もしくはデバイス名を指定する。
デバイス名はFFMPEG Launcherの基本設定タブの「音声」欄で確認する。
(video/audioともに"XSplitBroadcaster"で揃えないと音ズレが発生する?要確認)

※3
このffmpegはオレ流FFmpegビルドツールでビルドしたものなのでlibfdk_aacを指定している。
公式版ffmepgの場合は-acodec aac(で合ってるっけ?)
そもそもaac v1で192kbpsとか色々ツッコミどころありそうだけどキニシナイ

※4
保存ファイル名は決め打ちでよい。
(ikaLog側で「録画ファイルを自動的にリネームする」にチェックを入れればOK)
もちろんフルパスは環境に合わせて変更する

【スプラトゥーン】ゲームパッドを直撮りする(ジャイロ操作編)

サンプル動画はこちら。




動画とは違う角度で


見た目はえらく安っぽいけど、
試合経過を記録に残すという目的は達成できたので良しとします。

ここからは補足を。


1. ゲームパッドの映り込みについて

動画ではアンチグレア(ノングレア)の保護シートを使用しているものの、
それでもそこそこ天井や壁が映り込む。
(ゲームパッドの画面だけ暗くしているのは、映り込みを少しでも軽減するため)

動画の一部分だけ明度を下げることなんて出来るのかな?と思ったら
AviUtlの「部分フィルタ」で簡単にできた。ビバAviUtl!


2. 操作への影響について

やはり多少は重くなる。特にWebカメラに思いっきり遠心力が働くので、
見た目以上に違和感があるかもしれない。が、自分はもう慣れた。慣れって怖い。


3. 鴨居フックを挟む場所について

ゲームパッドのHOMEボタンのすぐ左脇を挟むようにする。
少しでも左でずれるとゲームパッドの形状上うまく挟むことができず、
また少しでも右へずれるとHOMEボタンが押されっぱなしになってしまう。
面倒くさいヤツだ。締め付けすぎると傷が付くし。

なお、手前の充電口を塞いでしまうため充電スタンドが使えなくなる。
(充電する際は上側の充電口に直接ケーブルを差し込む)


4. 動画最後の「フタを開けてピント調整済」について

動画で使用したC270というWebカメラには自動ピント調整機能が付いていない。
ただしほんのちょっと改造するだけで、手動でピントをいじることができる。

C270でゲームパッドを撮影する場合は、このピントの調整が必要。
メーカー保証外の改造なのでこの記事には方法を載せません。


---------------------------------------------------------------------

…そもそも補足を書いたところで自分以外に実践する人がいるのかという話だけど、
いつか自分が忘れてしまった時用の作業メモということで。

なお、Rスティック操作編の記事はございません。
ジャイロ操作ほどゲームパッドがブレないし、もっと良い撮影方法があるんじゃないでしょうか
(適当)



2016年5月28日土曜日

OBSにXSplit Broadcasterの画面を映す

~これまでのあらすじ~
      (ノ'A`)ノ  
      (  )  
   , , , , / > 
OBS MP 改二を使えばNVENCとFDK-AACを両立できることを知った ヽ('A`)ノ 

XSplit Broadcasterの出力をOBS-MP改二に流し込んで配信することを思いつく。
しかし大元のOBS MP(Open Broadcaster Software Studio MultiPlatform)からして、
Xsplit Broadcasterの出力を正常にキャプチャできないという問題を抱えていたのであった…

↓正常にキャプチャできていない様子。色が変。カラーではなく灰色がかっている




という訳でちゃんと映るようにしよう。

※注意※
公式の対処法ではありません。
この方法を実践して何か問題が発生しても、自己責任でお願いします。

(1)    あらかじめXSplit Broadcasterの解像度を確認しておく。ここでは「640x360」とする。
(2)    OBS MP 改二を起動する。このとき、XSplit Broadcasterは終了しておく。
(3)    映像ソースを追加し、XSplit Broadcasterを配置する。XSplit Broadcasterを起動したまま配置
    しようとするとOBSが落ちる。
(4)    映像ソースに適当な名前をつけて保存。ここでは「XSplit」と名付けたとする。
(5)    OBS MP 改二を閉じる。
(6)    <ユーザフォルダ>\AppData\Roaming\obs-studio\basic\scenes\無題.jsonのバックアップを
   取った後、テキストエディタでひらく。
(7)   「"name": "XSplit"」で検索。見つけた設定箇所のsettingブロックを以下の通り変更する。
   (「640x360」の部分は(1)で設定した解像度を指定)

====================================================================
            "id": "dshow_input",
            "mixers": 15,
            "muted": false,
            "name": "XSplit",
            "push-to-mute": false,
            "push-to-mute-delay": 0,
            "push-to-talk": false,
            "push-to-talk-delay": 0,
            "settings": {
                "active": true,
                "last_resolution": "640x360",
                "last_video_device_id": ここの文字列は変更しない,
                "res_type": 1,
                "resolution": "640x360",
                "video_device_id": ここの文字列は変更しない",
                "video_format": 301
            },
            "sync": 0,
            "volume": 1.0
        },
====================================================================

(8)    上書き保存してテキストエディタを閉じる。
(9)    XSplit Broadcasterを起動する。
(10)   OBS MP 改二を起動する。




やったぜ。

まあここまでやっても、XSplit Broadcasterを起動した状態で映像ソースのプロパティを開くと
「Oops! OBS has crashed」と言われて落ちちゃうんですけどねー。('A`)
なので映像ソース「Xsplit」のプロパティには触らないようにする。
win-dshow.dllさん頑張って。crash logがパンパンだぜ。

設定ファイルをいじって何とかなるレベルの問題なので、
そのうちOBS公式が根本的に解決してくれると思います。

2016年5月27日金曜日

スプラトゥーンをイヤホンでプレイしていると音がプツプツに

なることがある。

ゲームパッドにイヤホンを差し込んでプレイすると
試合中のSEが細かく聞こえて便利かつ有利!とよく言われるけど、
しょっちゅうプツプツ途切れて気になる気になる。試合どころじゃない。

んで接点復活剤を購入してイヤホン端子をシューシュー掃除したけれど、どうにも直らない。
修理はイヤだな~修理中遊べないしな~と思って詳しく調べると…

スプラトゥーンをイヤホンやヘッドフォンをしてプレイする場合、時々音が途切…
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13154479688

>wiiu本体やgamepadの近くに電波を干渉するものや、遮蔽物がありませんか?

ほ、ほほー!そうかWiiU本体からゲームパッドへデータを送信しているから
そこで途切れ途切れになると音も途切れ途切れになるのか。なるほど~。

という訳で以下のページに従って電波を測定してみる。

Wii U本体とWii U GamePad間の通信の安定化を行う
https://www.nintendo.co.jp/support/errorcode/howto/wiiu_5ghz_improve.html

コントローラ設定画面で十字キーの下と+ボタンと-ボタンを同時押しで
ゲームパッドと本体間の電波を測定できるとか、実に隠しコマンドっぽくて良い。

自分の場合は電波強度が「強」だったものの、電波品質が案の定「低」。 ('A`)
無線LAN親機とWiiU本体を離したところ、電波品質が「高」になり、
音のプツプツも解消されましとさ。いやあよかったよかった。

…接点復活剤、どうしよう。

ikaLogとXSplit Broadcasterを連携させるスクリプト

ikaLogにはビデオ自動録画機能がある。



ikaLogには最初からアマレコTV用とOBS用のAutoITスクリプトが同梱済み。
試合開始/終了時にボタンを押す必要がなくなり、とても快適に試合を録画することができる。

せっかくなのでXSplit Broadcaster用のAutoITスクリプトを作成してみた。
と言ってもトーシロの作ったものなので、どこに不備があるか分からぬ不安仕様。
とりあえず、XSplitのv2.7では意図した通りに動作中。

※注意※
「録画ボタンを押す」という処理の書き方が分からなかったため、
XSplit Broadcasterの方で録画/停止にショートカットキーを割り当てて
そのキーを押すようにしています。



例では「Shift + L」をショートカットキーに指定しています。


(1) ikaLog本体がある場所のtoolsフォルダに「XSplitBroadcaster.au3」を新規作成する
(2) XSplitBroadcaster.au3をテキストエディタでひらく
(3)以下のスクリプトをコピペし、上書き保存する

=============================↓↓ここから↓↓==============================
#include <FileConstants.au3>
#include <StringConstants.au3>

;環境と好みに合わせて値を設定してください。
;SendKeyValue の値の書き方については以下のURLを参照。
;https://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm
Const $SendKeyValue = "+l" ;XSplit Broadcasterの録画開始に設定したキーの値
Const $STARTsleepSec = 0 ;録画開始の待機時間(秒で指定)
Const $STOPsleepSec = 11 ;録画終了の待機時間(秒で指定)
Const $RENAMEsleepSec = 3 ;録画終了後リネーム処理までの待機時間(秒で指定)

;以下、スクリプト本文(書き換え不可)
Func RenameFile($source)
Local $dest = EnvGet('IKALOG_MP4_DESTNAME')
$dest = StringReplace($dest, "/", "\")
If $dest = '' Then
Return False
EndIf

FileMove($source, $dest, $FC_OVERWRITE)
EndFunc

Func FindRecentRecording()
Local $directory = EnvGet('IKALOG_MP4_DESTDIR')

; Replace all slashes to backslashes.
; $directory also needs a backslash at its end.
$directory = StringReplace($directory, "/", "\")
If StringRight($directory, 1) <> "\" Then
 $directory = $directory & "\"
EndIf

Local $hSearch = FileFindFirstFile($directory & "*.mp4*")

If $hSearch = -1 Then
 MsgBox(0, "Error", "Could not find any candinates in " & $directory & " (path 1)", 10)
 Return False
EndIf

Local $latest_file = ''
Local $latest_timestamp = ''

While True
Local $file = FileFindNextFile($hSearch)
If @error Then ExitLoop

Local $timestamp = FileGetTime($directory & $file, $FT_MODIFIED, $FT_STRING)
If StringCompare($timestamp, $latest_timestamp) > 0 Then
$latest_file = $directory & $file
$latest_timestamp = $timestamp
 EndIf
WEnd

FileClose($hSearch)

If $latest_file = '' Then
MsgBox(0, "Error", "Could not find any candinates in " & $directory & " (path 2)", 10)
Return False
EndIf

Return $latest_file
EndFunc

Func ControlXSplitBroadcaster()
;録画状態のウィンドウを取得
Local $hWnd = WinWait("ローカルレコーディング中","", 1)
Local $recStatus = True

;取得できなかったら待機状態のウィンドウを取得
If $hWnd = 0 Then
$hWnd = WinWait("XSplit Broadcaster","", 1)
$recStatus = False
;それでも取得できなかったらエラーを返す
If $hWnd = 0 Then
MsgBox(0, "Error", "Could not find XSplit Broadcaster. ")
Return False
EndIf
EndIf

If $recStatus Then
; 録画終了待機
Sleep(1000 * $STOPsleepSec)
Else
; 録画開始待機
Sleep(1000 * $STARTsleepSec)
EndIf

WinActivate($hWnd)
WinWaitActive($hWnd, "", 1)

; 録画終了/開始ホットキー送信
Send($SendkeyValue)

; 録画中だったらmp4ファイルのリネーム処理実行
If $recStatus Then
If EnvGet('IKALOG_MP4_DESTDIR') <> "" Then
Sleep(1000 * $RENAMEsleepSec)
Local $file  = FindRecentRecording()
RenameFile($file)
EndIf
EndIf

EndFunc

ControlXSplitBroadcaster()

=============================↑↑ここまで↑↑==============================

(4) ikaLogのビデオ録画機能タブをひらく
(5) XSplitBroadcaster.au3のパスを「実行する制御スクリプト(ControlOBS.au3)のパス」欄に指定する
  ※別にファイル名はControlOBS.au3でなくても構わない模様
(6) 自動操作と自動リネームの欄にチェックを入れて設定を適用する


ぶっちゃけほとんど同梱のControlAmarecTV.au3そのまんま。
単に試合開始/終了のタイミングでShift + Lキーを押しているだけなので、
何らかの理由で試合開始時に録画が始まらなかった場合、試合終了時に録画が始まってしまう。
その場合は何事もなかったかのように手動で録画を停止させる。