2023-09-27に投稿

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

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

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

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

Welcome to OBS Studio’s documentation! — OBS Studio 29.1.3 documentation https://docs.obsproject.com/

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

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

GitHub - obsproject/obs-websocket: Remote-control of OBS Studio through WebSocket https://github.com/obsproject/obs-websocket

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

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

GitHub - onyx-and-iris/obsws-ruby: Ruby clients for OBS Studio WebSocket v5.0 https://github.com/onyx-and-iris/obsws-ruby

まずは、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にリンクがあったこちらを使ってみました。

GitHub - dnaka91/obws: The obws (obvious) remote control library for OBS https://github.com/dnaka91/obws

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

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の勉強にもなったのでちょっと自信が付いたかもしれません。

今回はここまで。

おわり

Originally published at shikiyura.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

しきゆら

勉強したり手を動かした記録を「しきゆらの備忘録」(http://shikiyura.com)へ投稿している人。 Ruby/JavaScriptをよく書いている。いろんな言語に触れてみたい。新しい物・辛いもの好き。バグは愛すべきもの。一応社会人。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント