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キーを押しているだけなので、
何らかの理由で試合開始時に録画が始まらなかった場合、試合終了時に録画が始まってしまう。
その場合は何事もなかったかのように手動で録画を停止させる。