これで無人制御も可能に!LiveWedgeをコントロールできるGo言語のライブラリを公開

koba koba

こんにちは。小林哲之です。組込みソフトウェアのエンジニアです。

LiveWedgeは4つのHDMI入力を持ち、ライブ配信、録画の機能を備えたビデオスイッチャーです。
今回は、このLiveWedgeをコントロールできるGo言語のライブラリをGithubで公開しましたので紹介させていただきます。

経緯

LiveWedgeは本体操作以外にタブレットのアプリケーションソフトから操作できるという特徴を持っています。タブレットのUIは直感的に操作ができるように入念に作り込まれています。これは人が操作することを想定していました。

LiveWedgeの発売後にさまざまなフィードバックをいただいたのですが、周期的に自動で画面を切り換える機能が欲しいという要望がたびたび寄せられました。この機能をタブレットのアプリに追加するのは技術的には可能ですが、細かい要望に応えられるように汎用化するのは簡単ではありません。
むしろLiveWedge本体とタブレットの間のプロトコルを公開して、ユーザーの側でそのような機能を実現できるようにするほうが筋がよいだろうと思っていました。しかし、そのために詳細なドキュメントを準備するのは時間がかかり、サポート体制も整えようとすると実現性が低くなってしまいます。

そこで発想を転換し、LiveWedge本体とタブレットの間のプロトコルを説明するのでなく、その一段階上のレイヤーをライブラリとして準備し、それをソースコードごと公開して “As is” で使ってもらうことにしました。
完璧を求めず、よく使う機能から先に順次ライブラリ化して公開することにしました。必要に応じて範囲を広げていきます。

なぜGo言語?

今回公開するライブラリはGo言語で書かれています。なぜGo言語を選んだか? 私なりにGo言語を選んだ理由は以下の通りです。

  • スクリプト言語のように簡潔に書けて、なおかつシステムコールやバイナリデータなど低レベルなところも扱うことができる。
  • クロスコンパイルすることが簡単にできる。同一ソースからLinux, Mac, Windows, さらにARM Linuxで動作する実行ファイルを作ることができる。
  • 実行ファイルを人に渡して使ってもらうときに、インタープリタのランタイムやDLLなどの準備が不要。

Go言語は比較的読みやすい言語だと思うので、どうしても他の言語で使いたいという方はソースコードを読んで移植していだだけるだろうとも考えました。
(実際には、Go言語にした一番大きな理由は私自信がGo言語を使ってみたかったからということなのですが。)

公開したライブラリについて

URL: https://github.com/cerevo/LiveWedge_API
このライブラリを使うとPC(Linux, Mac, Windows)またはARM Linux(ラズベリーパイなど)からネットワーク経由でLiveWedgeに以下のようなコマンドを送ることができます。

  • 画面遷移(Cut, Mix, Dip, Wipe)
  • サブ画面の制御(PinP, クロマキー合成)
  • 録画とライブ配信の開始と停止
  • 静止画のイメージファイルを送信して、それをch4の映像入力として使用する

また、同一ネットワーク上にあるLiveWedgeを検索することができます。

現在公開している範囲ではタブレットアプリを完全に置き換えるものは作れません。操作の一部を自動化するという用途を想定しています。
現在の状況はアルファ版です。今後の修正でメソッド名や引数など互換性を損なう変更が行われる可能性があります。特にLiveWedgeの状態を取得する方法についてはまだ確定していません。
ライセンスに関してはGithubリポジトリのLICENSEファイルを参照してください。

ビルドの方法

まずGo言語を開発環境をインストールしてください。go 1.4.2と1.5の Linux/amd64で動作確認しています。
githubのリポジトリをcloneしてきて、そのトップディレクトリで ./make.sh を実行してください。
ライブラリと全てのサンプルプログラムがビルドされます。

また、クロスビルド用のGo言語のランタイムが用意してあれば、環境変数GOOS, GOARCHを指定して./make.sh を実行するだけでクロスビルドすることもできます。

少し実用的なサンプルプログラム autotrans

周期的に画面を切り換えるサンプルプログラムです。WebUIで画面遷移のモードや周期を変更することができます。
コマンドラインからLiveWedgeのIPアドレスを引数に与えて実行します。


$ ./autotrans 192.168.21.5

そして、Webブラウザで http://localhost:8080/ を開くと以下の設定画面になります。
autotrans_screenshot
このWebUIから、静止画のアップロードとライブ配信の開始/停止を行うこともできます。設定はカレントディレクトリのautotrans.json に保存されます。(静止画のアップロードを行うときにはLiveWedgeに書き込み可能なSDカードを挿してください。アップロード先はSDカードになります。)
単純に画面を切り換えたいだけならばこのプログラムで十分かもしれません。もし足りなければこれを改造して使っていただければと思います。
秋葉原ライブカメラの自動切り替えはこれをベースにしたカスタムバージョンで行っています。

ライブラリの使い方

Githubのreadme.md に書いてあることと重複しますが、日本語でも書いておきます。

まず始めに、NewVswメソッドでvswのインスタンスを生成します。
引数としてLiveWedgeのIPアドレスを渡します。説明を簡単にするためにここでは決めうちにしています。LiveWedgeのIPアドレスはタブレットアプリで調べるか、libvsw.Find()メソッドで調べます。
(defer vsw.Close()はCloseを確実に行うためのGo言語のイデオムです。)


	ip_address := "192.168.21.5" //ip address of LiveWedge
	vsw, err := libvsw.NewVsw(ip_address)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Failed to open LiveWedge: %s\n", err)
		os.Exit(1)
	}
	defer vsw.Close()

次にvswのメソッドを呼び出します。例えば、3秒ごとに入力ソースのch1からch4を順番にCutするには以下のようにします。


	i := 0
	for {
		vsw.Cut(i + 1)  // src is {1..4}
		i = (i + 1) % 4
		time.Sleep(3 * time.Second)
	}

ここではimport文などを省略していますが、完全なサンプルプログラムはsrc/sample_trans/sample_trans.goをみてください。
他にもwipe, PinP, クロマキー合成, 録画, 状態の取得, 同一ネットワークにあるLiveWedgeの検索を行うための簡単なサンプルプログラムを用意しています。

最後に

このライブラリを使って独自のコントロールアプリを作ってもらうことで、LiveWedgeの応用範囲が広がるといいなあと思います。実際に秋葉原ライブカメラのような無人でのLiveWedgeの運用は、当初は想定外だったのですがこのライブラリを用意することで実現することができました。
現状のライブラリに足りないところがあることは自覚しているので、少しずつになると思いますが、要望の多いところに関しては機能を追加していきたいと考えています。