2016年5月27日金曜日

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