【Rust/Ruby】OBS Studioの録画時間をスクリプトから取得してみる

2023年9月23日Ruby,Rust

こんにちは、しきゆらです。
連休は出かけていてブログ書けませんでした。

今回は、最近ちょっと触っているOBSをプログラムから操作したり情報を取得できるということを知ったので、サンプルを見ながら情報を取得してみようと思います。

OBSのドキュメントは以下になります。 詳しく知りたい方はこの辺を参考にするとよいかなと思います。


上記を見るとC系での話が主なようですが、今回はよく使う言語であるRubyと、最近ちょっと触っているRustで書けることを目的として調べてみました。
どうやらOBSはWebSocket経由で操作することができるようです。

公式のリポジトリにもOBSのWebSocketプラグインがあるようで、v28以降のバージョンに対応しています。 手元の環境では、初期状態で入っていてちょっと設定してあげればすぐ使えるようになったので、初めはこの辺を触ってみるのが良いかなと思います。

Rubyから録画時間を取得する

上記を受けてRubyから操作するgemがないかな、と思って調べてみると非公式ながらありました。

まずは、RubyからOBSを操作するためにサンプルを見たり内部のスクリプトを見ながら録画時間を取得するコードを書いてみました。

require "obsws"

client = OBSWS::Requests::Client.new(
    host: "IPアドレスなど",
    port: ポート番号,
    password: "PWの文字列"
)
loop do
    p client.get_record_status.output_timecode
    sleep 1
end

上記コードはシンプルに1秒ごとに録画時間を取得してターミナルへ表示するコードです。

IPアドレスやポート番号などは、OBSの「ツール」>「WebSocketサーバ設定」から確認・設定可能です。

実際にスクリプトを実行しつつOBSで録画すると、録画時間が表示されました。

Rustから録画時間を取得する

では、同様のことをRustでやってみます。
RustからOBSのWebSocketを操作するcrateは、obs-websocketにリンクがあったこちらを使ってみました。

サンプルや内部コード、エラーを修正しつつできたのがこちら。

use std::{thread, time};
use anyhow::Result;
use obws::{Client, client, requests::EventSubscription};

#[tokio::main]
async fn main() -> Result<()> {
  let sleep_time = time::Duration::from_secs(1);
  let config = client::ConnectConfig {
    host: "IPアドレス",
    port: ポート番号,
    password: Some("PW文字列"),
    event_subscriptions: Some(EventSubscription::all()),
    broadcast_capacity: Some(100),
  };
  let client = Client::connect_with_config(config).await?;

  loop {
    let outputs = client.recording();
    let status = outputs.status().await?;
    println!("outputs: {}", status.timecode);

    thread::sleep(sleep_time)
  };

  Ok(())
}

サンプルコードから動かしてみたのですが、諸々エラーだったりcrateが足りなかったりと動かず悪戦苦闘しながらここまで持っていきました。
Rustのお作法をきちんと理解できていなので躓いただけかもですが、動く状態まで持っていけてよかったなと。

これにて、Rustでも同様にターミナルに録画時間を表示することができました。

まとめ

今回は、OBS Studioの操作をスクリプトからできることを知ったのでRuby/Rustで簡単なサンプルを作ってみました。
どちらもライブラリが用意されているので、そこまで難しくはありませんでした。
また、Rustの勉強にもなったのでちょっと自信が付いたかもしれません。

今回はここまで。

おわり

Posted by しきゆら