kensaurus

フィールドノート · 24時間ライブ配信

小さなPC 1台で、山を24時間ライブ配信する:止まった理由と直し方

Wi-FiだけのIntel NUCで、デッキのカメラをYouTubeに24時間流しています。PCが追いつかない、夜に遅れる、無音で止まる、文字が跳ねる。順番に直した記録と、見ていて飽きない画面のつくりです。

櫻元賢次 · kensaurus合同会社 ·

11月8日から、群馬県嬬恋村、標高1,444mの山の仕事場「嬬恋牧場Work&Camp」のデッキのカメラを、YouTubeで24時間ライブ配信しています。浅間山と谷と、手前のフィールドが映ります。初日の夜、映像が止まりがちになりました。

配信はこちら → youtube.com/@tsumagoicamp/live

9時4分のライブ映像。曇り空の下に紅葉の丘と谷。左上に気象のパネル、右上に予約のQRコード、左下にドット絵の仙人がなぞなぞを出している
11月9日 9時4分の配信画面。左上が施設の気象計、右上が予約のQR、左下でなぞなぞを出している仙人。配信の実際のコマです。

仕組み

デッキの屋外カメラ(Tapo C530WS)と、それを読んでYouTubeへ送るIntel NUCが1台。NUCはWi-Fiだけでつないでいます。映像はffmpegが1本。そのまわりの小さなPythonの監督役が、再起動し、速さを測り、状態をファイルに書きます。それを牧場モニターが読むので、配信が止まればいつも見ている画面に出ます。

止まった順に

配信が勝手に終わる

最初はYouTubeの「今すぐ配信」を使っていました。配信プログラムが再起動するたびにYouTubeの配信が終わり、リンクも視聴時間も消えました。最初の1時間で4回です。専用のキーで「予約配信」にし、自動終了を切ったら直りました。再接続しても、同じ配信が続きます。

PCが追いつかない

最初の版は、文字を描くために1080pのコマを1枚ずつGPUから降ろし、また戻していました。ほかに何も動いていなければ実時間の1.25倍。PCが忙しくなると遅れ、コマがスワップまでたまり、YouTube側で4分のあいだに2回切れました。

次に、デコード、切り抜き、縮小、色、エンコードまで、映像をGPUに置いたままにしました。文字のある帯だけをCPUに降ろして描き、上に重ね直していました。これで毎秒25コマは保てましたが、帯が3本になった11月9日の朝も、ffmpegはCPU 1コアの約70%を使っていました。

いまは何も降ろしません。文字のパネルを1枚ずつ小さな透明のキャンバスに描き、GPUの上で映像に重ねています(overlay_vaapiが透明度を保ってくれます)。ffmpegが使うのは1コアの約31%で、毎秒25コマを実時間で回しています。

配信のコマ。左上の気象パネル、右上のQRコード、左下の仙人の枠の3か所が金色の線で囲まれている
以前CPUに降ろしていた文字の部分。11月9日の実際のコマに、このページ用に金色の枠を足しています。いまはこのパネルも透明のキャンバスに描き、GPUの上で重ねています。

夜に遅れる

暗くなるとカメラは赤外線に切り替わり、1秒に12〜16コマほどしか送ってきません。それでも時刻は25コマ分ついています。カメラの時計のままだと配信は0.7倍速ほどになり、ビットレートも落ち、見ている人の画面はくるくる回るだけでした。

いまは届いたコマにその場の時刻を打ち、エンコードの直前で毎秒25コマにそろえています。夜の回線はルーターの先で5%ほどパケットが落ちていたので、NUCの輻輳制御をBBRにし、ビットレートを4,500kbit/sに下げました。その夜のYouTube Studioの表示は「Excellent」のままでした。

夜の赤外線の白黒映像。左に照らされた裸の木、暗い山並みと谷の明かり
11月8日 22時54分、赤外線の映像(パネルは以前の配置)。配信の実際のコマです。

無音で止まる

YouTubeのライブには音声トラックが要ります。カメラのマイクの音は流しません。よくて風の音、悪ければお客さまの声がのるからです。いちばん手こずったのが無音でした。別の入力として作った無音は映像とずれて、音だけ止まったまま映像が進み、あとでまとめて流れ、Studioに「映像が十分に届いていない」と言われました。フィルタの中で作った無音は約94秒ごとに止まり、送り出しを厳密にそろえる設定を足すと0kbpsで固まりました。

効いたのは、カメラ自身の音声トラックを「時計」としてだけ借りることでした。サンプルはゼロにしてから、入力を一切読まない式でつくった風の音(ブラウンノイズ、ゆっくりした突風、40〜900Hz)に置き換えます。マイクの音が出ていく経路はありません。

再起動は、見ている全員の問題

再起動は数秒の空白になり、見ている全員の画面が止まります。だから本番ではいじらず、変更はまとめて入れます。自動の再起動はメモリの見張り役の1つだけ(2時間半に1回ほど)で、それも同じ配信の中で済みます。

開いたままにしたくなる画面

同じものが回るだけの山の映像は、1時間もすると作り物に見えてきます。だから画面には、いま本当のことを載せています。

仙人の台詞には、画面に見える山の話(出典のあるデータから)や、ときどきそこで草を食む牛の話もあります。

10時41分のライブ映像。曇り空の浅間山と紅葉の谷、手前にテントと柵。左上に気温3.2℃と日の出から日の入りのバーの気象パネル、右上に予約のQR、左下の仙人が白い文字で「迷ったら、まず寝る。仙人の基本。」
11月9日 10時41分。仙人の台詞は日本語で、白い文字。配信の実際のコマです。
1分後、10時42分の同じ眺め。左下の仙人が空色の文字で Unsure? Sleep first. Hermit basics.
10時42分。同じ台詞を英語で、空色の文字で。配信の実際のコマです。

仙人の文字は、以前は打っている途中で入れ替わって跳ねました。いまは配信の時計で次の1分の区切りから打ちはじめ、4秒ほどで打ち終わり、次まで動かしません。

ライブチャットで !おみくじ と打つと、1分以内に仙人が名前を呼んで、運勢を画面で読み上げます。1人1日1回です。名前は安全な16文字までに整え、YouTubeのIDはハッシュでしか残さず、記録は1週間で消えます。

11月9日からは、チャットの遊びも増えました。!予想 で今夜の最低気温を予想すると、朝7時に仙人が、施設の気象計の夜の最低気温にいちばん近かった人の名前を呼びます。!見る 1〜3 で3つの眺めのどれかに投票すると、カメラがそちらへゆっくり動き、3分とどまります。!おはよう は日の出のあと最初のひとりを記録します。!答え で仙人のなぞなぞに答えると、答えが出るときに最初の正解者の名前を呼びます。

仙人の枠を拡大したもの。眼鏡と白いひげのドット絵の顔と「いまの運勢:中吉。南西がいい。」の一行
11月9日 8時42分の、時間割のおみくじ。実際のコマを拡大しています。

プライバシー

画面は切り抜いていて、上から塗ってはいません。マイクの音は流しません。こちらでは録画せず、巻き戻しも切っています。撮影やイベント、お客さまに頼まれたときは、休憩画面に切り替えます。映る範囲のテントにはドットのマスクがありますが、いまは切っています。お客さまが映るところにいるときは、手で入れます。予約に合わせて自動で切り替える仕組みは、まだつくっていません。

配信は無料で見られます。

展示室でこの作品を見る