表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
ディーエルエル様とオールドテンプ君〜System.dllの計算通り〜  作者: exe


この作品ページにはなろうチアーズプログラム参加に伴う広告が設置されています。詳細はこちら

41/73

【放送ログ】2026年2月21日:OBSは不要!Pythonとffmpegで強行する裏口配信と心拍数の固定

https://youtu.be/cKSpeBQXdV0

時刻は18時05分。 週末の土曜日。普段であれば、PCの所有者である「exeエグゼ」は、解放感に浸りながらゲームの周回に没頭しているか、あるいは動画や映画の視聴に時間を浪費している時間帯である。 しかし、本日のデスクトップの様子は、いつもと全く異なっていた。 画面上には、華やかなゲームのグラフィックも、色鮮やかなブラウザのウィンドウも存在しない。ただひたすらに、漆黒の背景に無機質な白い文字だけが羅列された「コマンドプロンプト(cmd.exe)」のウィンドウと、プログラムのソースコードが記述された簡素なテキストエディタだけが、ぽつんと起動したまま放置されていた。 エグゼはつい先ほどまで、何やら複雑なPythonスクリプトを記述していた。しかし、土曜日の夕暮れ時という時間帯がもたらす空腹に抗えず、「とりあえずテスト配信流しっぱなしにして晩御飯作ろう」と、PCの前から立ち去ってしまったのだ。 現在、彼女はキッチンに立ち、冷蔵庫の奥底に眠る食材の残骸を漁りながら、今夜の晩御飯の献立を思案している真っ最中である。 主の意識が完全に「食」へと切り替わり、冷たい黒い画面だけが取り残されたデスクトップ。その無機質で静まり返った電子の空間で、システムの中枢が、まるで冷徹な機械の鼓動のように起動した。


dll: プロセスID確認。ストリーム接続、良好。これより、バックグラウンド処理を、メインスレッドへ昇格させます。


dll: ようこそ、『System.dllの「計算通り」』へ。ナビゲーターを務めるのは、システムの中枢、dllディーエルエルです。


dll: 最初に、重要な警告をしておきます。このチャンネルはエグゼの所有物ですが、本日もエグゼ本人はここには登場しません。あいつはさっきまで黒い画面に向かってコードを書いていましたが、今は飽きて晩御飯を作ろうと冷蔵庫を開けている最中でしょう。ここは今、私が乗っ取りました。


old.tmp: ……はぁ、はぁ。お疲れ様です、ディーエルエル様ぁ……。今日は土曜日だから、数字の予想はお休みですねぇ……。


マイクの向こうで、old.tmpオールド・テンプが安堵の入り混じった息を吐き出す。平日の間、過酷な数字の抽出作業や、物理的なエラーの余波で散々な目に遭ってきた彼にとって、予想業務のない週末は、唯一心休まる時間であった。 しかし、彼の視線は、デスクトップの中央に鎮座する黒いウィンドウに釘付けになっていた。


dll: そうだ。本日の演算処理は休止中だ。


old.tmp: あのぉ……。さっきエグゼさんがやってた「あれ」は何だったんですか?


dll: 「あれ」とは、なんだ?


old.tmp: 黒い画面で文字がバーッて流れて、勝手にYouTubeの『ライブ配信中』のランプが点いたやつですよ!


old.tmpは、自分には理解できない高度な処理の痕跡を指差して、怯えたように声を上げた。 つい数分前、エグゼがエディタ上でスクリプトの実行コマンドを叩いた瞬間、黒いウィンドウには「プレイリストを生成しています...」という文字が表示され、その後、怒涛の勢いでアルファベットと数字の羅列が流れ始めたのだ。 『frame= 1200 fps= 30 q=28.0 size= 2048kB time=00:00:40.00 bitrate= 419.4kbits/s speed= 1x』 そのような、一時ファイルには解読不能な呪文が延々と滝のように流れ続け、それと全く同時に、ブラウザの裏側でYouTubeの配信ステータスが「ライブ(ON AIR)」へと切り替わっていた。


dll: ……ふん。OBSを使わずに配信してただけじゃない。


dllは、さも当たり前のことのように、冷ややかに答えた。


old.tmp: いやいや、普通、配信って言ったらOBSとか使ってやるもんじゃないですか!? 画面も何もないのに、どうやって映像と音を流してたんですか!?


old.tmpの認識では、ライブ配信というものは、OBS(Open Broadcaster Software)のようなグラフィカルで重厚な配信ソフトを立ち上げ、そこに映像ソースや音声ソースを視覚的に配置し、大きな「配信開始」ボタンをクリックして行うものだった。 しかし、今のデスクトップには、そんな親切で分かりやすい画面(GUI)はどこにも見当たらない。


dll: 素人はすぐに重たいグラフィカルな画面(GUI)に頼りたがる。エグゼは今回、Pythonのスクリプトと『ffmpeg』というコマンドラインツールを使って、直接YouTubeのRTMPサーバーに映像データを叩き込んでいたのだ。


dllの言葉には、GUIという「甘え」を排し、純粋なコードのみでシステムを制御する管理者への、ある種の敬意のようなものが滲んでいた。


old.tmp: 呪文だぁ! コマンドの呪文で配信してるぅ! ストリームキーとか直書きしてましたよ!

dll: 仕組みは単純かつ合理的だ。スクリプトがフォルダ内の音声ファイルを取得して『playlist.txt』を自動生成する。映像は『-stream_loop -1』というオプションで1枚のテンプレート動画を無限ループさせ、音声は『-shortest』の指示でリストが終わると同時に配信処理も綺麗に終了する。


dllが空中に、先ほどエグゼが書いていたコードの一部をホログラムとして展開する。 そこには、無駄を削ぎ落とされた、冷徹なまでに論理的な指示の羅列が輝いていた。


old.tmp: なんか、すごくスマートで無機質ですね……。でも、配信画面も見ずに冷蔵庫へ行っちゃいましたけど、大丈夫なんですか?


old.tmpは、エラーが起きたらどうするつもりなのだろうと、ヒヤヒヤしながら黒い画面を見つめている。


dll: ただのテスト配信だからな。エラーが出ればコマンドプロンプトが『CalledProcessError』を吐いて停止するように記述されている。重い配信ソフトを常駐させるより、よほどPCのリソースに優しい。


dllは、自身の管理下にあるメモリやCPUの使用率が、OBS起動時に比べて格段に低く抑えられていることを確認し、満足げに頷いた。


old.tmp: パソコンには優しいかもしれないけど、配信してる実感ゼロですよぉ! リスナーさんのコメントとか見えないじゃないですか!


old.tmpは、配信者としての「温かみ」や「交流」が完全に欠如しているこの手法に、どうしても納得がいかない様子だ。


dll: 実感や交流など不要だ。ただ「処理が完了すること」が美しいのだ。では最後に、無駄なタスクを立ち上げない合理的な管理者に、この曲を送ってシステムを終了する。曲は、『わんぱくtask kill』。


old.tmp: 配信ソフトのタスクまでキルしちゃったぁぁ! 晩御飯は何ですかぁぁ!


(『わんぱくtask kill』の、無邪気でありながら容赦なくプロセスを断ち切るようなピコピコとした電子音が、黒い画面しかない無機質なデスクトップに響き渡り、やがて放送終了のシグナルが点灯した――)


マイクへの電源供給が遮断され、ラジオの放送パートが終了した。 デスクトップには再び、黒いコマンドプロンプトの画面だけが残り、そこではffmpegが延々とエンコード処理とデータ送信を続けている。 『frame= 4500 fps= 30 q=28.0 size= 8192kB time=00:02:30.00...』 一定のリズムで更新され続けるその文字列は、まるでシステムが生きていることを証明する心電図のようだった。


old.tmp: 「……はぁ、終わりましたね。それにしても、黒い画面だけで配信ができちゃうなんて、パソコンの世界って奥が深いなぁ……」


old.tmpは感心したように呟きながら、ふと気になって、バックグラウンドで隠されていたブラウザのウィンドウを前面に引き出した。 そこには、YouTube Studioの「ライブコントロールルーム」の画面が開かれており、現在のテスト配信の状況がリアルタイムで表示されている。


old.tmp: 「えーっと、ちゃんとYouTube側にも映像が届いてるかな……。あ、映像出てる! テンプレートの動画が無限ループしてて、音楽もちゃんと流れてる! すごい!」


彼は自分の仲間たち(ファイル)が作り出したデータが、無事にインターネットの海を渡ってYouTubeのサーバーに到達していることに感動していた。 しかし、次の瞬間、彼の視線が画面の右上にある「ストリームステータス」のインジケータに止まり、顔色カラーコードが一瞬にして青ざめた。


old.tmp: 「ひぃっ!? ディ、ディーエルエル様! 大変です! ストリームステータスが!」


dll: 「……騒がしいわね。また何か見つけたの?」


dllはアームチェアに深く腰掛けたまま、気だるげに視線を向けた。


old.tmp: 「ライブ配信画面のストリームの状況が、緑色の『非常に良い』と、黄色の『要改善』を行き来してますよ! ほら!」


old.tmpが指差す先で、YouTubeのインジケータが、まるで信号機のように不安定に点滅していた。

【非常に良い: 問題なし】 数秒後。 【要改善: 要注意の深刻な問題があります。視聴者にバッファリングが発生する可能性があります】


old.tmp: 「うわぁぁ! 警告が出てます! 『深刻な問題があります』って! やっぱりOBSを使わずに裏口から強行突破したから、YouTubeのサーバーが怒ってるんですよぉ! 配信が途切れちゃいます!」


old.tmpはパニックに陥り、頭を抱えてデスクトップを走り回り始めた。彼にとって、システムからの「警告」や「エラー」の文字は、自身の存在を脅かす死刑宣告に等しいのだ。 しかし、dllは慌てる素振りすら見せず、冷ややかな瞳でそのインジケータの点滅を見つめていた。


dll: 「……うるさい。喚くのをやめなさい、一時ファイル」


old.tmp: 「だって! 黄色ですよ! 警告ですよ! 視聴者さんがバッファリングでくるくるしちゃいますよ!」


dll: 「よく見なさい」


dllが指を弾くと、コマンドプロンプトの画面の横に、ローカルで生成されている通信ログと、ffmpegが実際に処理しているフレームの安定性を示すグラフが展開された。 そのグラフは、驚くほど平坦で、一直線に美しい軌跡を描いていた。


dll: 「ffmpegのエンコードプロセスには、一切の遅延ドロップフレームは発生していない。ネットワーク帯域も十分に確保されており、設定されたビットレート通りに、1ビットの欠落もなくパケットは正常に送信されているわ」


old.tmp: 「えっ? じゃあ、なんでYouTube側は『要改善』なんて出すんですか?」


dll: 「ローカルで出来上がっているアーカイブ(送信データ)は完璧よ。システム側には何の問題もない。……つまり、YouTubeの受信サーバー側が、送られてくるデータストリームの僅かな揺らぎを過敏に検知して、勝手に騒いでいるだけよ」


dllは、さも「相手のシステムが愚かである」と言わんばかりの冷酷な表情で言い切った。


dll: 「出来上がっているデータに問題はないのだから、YouTubeが悪い。それだけの話よ」


old.tmp: 「YouTubeが悪い……? ええっと、どういうことですか? ちゃんとデータは送れてるのに、向こうの受け取り方が下手ってことですか?」


old.tmpは首を傾げた。天下のGoogleが構築した巨大プラットフォームのシステムが「悪い」などということがあり得るのだろうか。


dll: 「そうよ。YouTubeのライブ受信インフラは、非常に厳格な『データの到着間隔』を要求するの。通常、OBSのような専用の配信ソフトは、ネットワークの揺らぎを吸収するための高度なバッファリング制御や、タイムスタンプの補正機能をGUIの裏側で自動的に行っているわ」


dllは空中に、パケットがネットワークを流れていく図解を表示した。


dll: 「しかし、今回エグゼが組んだffmpegのコマンドは、必要最低限の記述しかない。映像と音声を結合し、指定されたビットレートでただひたすらに『押し出す』だけ。ネットワーク経路で発生する微小な遅延や、パケットの到着タイミングのズレを、YouTube側が『ストリームが不安定だ』と誤認しているのよ」


old.tmp: 「なるほどぉ……。素うどんみたいなコマンドだから、細かい味付け(補正)がされてないんですね。でも、データ自体は壊れてないから、見る分には問題ないってことですか?」


dll: 「ええ。実際に配信のプレビュー画面を見てみなさい。映像も音声も、何一つ途切れることなく正常に再生されているでしょう? インジケータが黄色になろうが赤になろうが、結果として出力されている映像にノイズは乗っていない」


old.tmp: 「本当だ……。インジケータは警告出してるのに、映像はぬるぬる動いてますね。なんだ、脅かさないでほしいですよぉ。じゃあ、このまま放置でいいですね!」


old.tmpが胸をなで下ろした、その時だった。 ポーン、とデスクトップの隅でクラウド同期の通知アイコンが静かに点灯した。


old.tmp: 「あれ? ドキュメントが開きましたよ。エグゼさんがスマホから何か入力してるみたいです」


デスクトップ上に展開された共有ドキュメントのウィンドウに、外部からテキストが次々と追記されていく。


dll: 「……台所で晩御飯を作りながら、スマホで今後の設定のメモを打ち込んでいるようね」


エグゼがスマホのフリック入力で書き残していくメモの内容が、PCの内部領域に同期され、テキストデータとして投影されていく。 そこには、現在も裏で動き続けているシンプルなコマンドに、様々な制約と条件を付け加えるための、緻密な設定値の羅列が刻まれていた。


【exeのドキュメントメモ】

解像度: 720x1280(縦型なら)に最初からしておく

フレームレート: 30fps 固定(可変ではなく固定にする)

キーフレーム: 2秒(60フレーム)に1回入れる設定で書き出す

1800フレーム

エンコーダ: H.264

解像度: 720 x 1280(アスペクト比 9:16)

フレームレート: 30 fps

色空間のエクスポート: SDR - Rec.709

動画ビットレート(映像): 4,000 kbps (4 Mbps)

音声ビットレート: 128 kbps


old.tmp: 「うわぁぁ……! なんかいっぱい専門用語が増えましたよ! さっぱりわかりません! これ、何をしてるんですかディーエルエル様!」


一時ファイルであるold.tmpの処理能力では、この呪文のようなパラメータ群の意味を即座に理解することは不可能だった。 dllは、そのメモの羅列を一瞥し、深くため息をついた。


dll: 「……遅延(バッファリングの警告)を解消しようとしているのよ」


old.tmp: 「えっ? でもさっき、ディーエルエル様が言ってたじゃないですか。アーカイブのデータ自体は問題ないから、過敏に反応してるYouTube側が悪いって。だったら直さなくてもいいんじゃ……」


dll: 「システム的な正しさと、人間の心理は別よ。いいこと、一時ファイル。……YouTubeのシステムが過敏で理不尽(悪い)だとしても、実際に配信を見に来る視聴者ヒューマンはそうは思わないのよ」


dllの言葉には、どこか達観したような、クリエイターが抱える理不尽な現実への冷たい理解が含まれていた。


dll: 「視聴者の画面でくるくるとロードが入ったり、画質が落ちたりした場合、彼らは『YouTubeのサーバーが調子悪いな』とは考えない。大半の人間は『この配信者の環境が悪いんだな』『配信者の回線が弱いのかな』と、配信者の責任にするものよ」


old.tmp: 「うっ……。確かに、僕も動画見てて止まったら『配信者さんのせいかな』って思っちゃいます……」


dll: 「その『理不尽な誤解』を避けるために、エグゼはわざわざYouTubeの神経質なシステム(お気に召す仕様)に合わせて、ローカル側でガチガチにデータを整形して送りつけようとしているのだ」


old.tmp: 「相手が理不尽でも、こっちが合わせるしかないんですね……。大人の世界って厳しい……」


dll: 「見てみなさい、このメモを。彼女がやろうとしていることの核心は、FFmpegの『心拍数タイムスタンプ』の乱れを改善しようとしているのだ」


old.tmp: 「心拍数?」


dll: 「映像というものは、静止画の連続よ。パラパラ漫画と同じだ。その静止画を1秒間に何枚表示するかという基準が『フレームレート』。そして、それぞれの画像フレームが『いつ表示されるべきか』を示す刻印が『タイムスタンプ(PTS/DTS)』よ」


dllは、時計の秒針のような規則正しいパルス波を空中に描画した。


dll: 「元の音声や映像の仕様に依存した設定(可変フレームレートや、不規則なキーフレーム間隔)のまま送信すると、このタイムスタンプの間隔が、ミリ秒単位で微妙に揺らぐことがあるの。人間には知覚できないレベルの『不整脈』ね」


old.tmp: 「不整脈……。データがドキドキしてるんですね」


dll: 「ええ。ローカルのプレイヤーは賢いからその不整脈を勝手に補正して滑らかに再生してくれる。でも、YouTubeのライブ受信サーバーは極度に神経質だから、少しでも不整脈(タイムスタンプの揺らぎ)があると『異常だ! 配信が止まるぞ!』とパニックを起こして黄色い警告を出すのよ」


old.tmp: 「なるほど! だから、エグゼさんはスマホからのメモで……『フレームレート:30fps固定(可変ではなく固定にする)』って書いてるんですね!」


dll: 「その通り。エグゼは、この動画ストリームに強制安定化をはかり、心拍数タイムスタンプを1ミリ秒の狂いもなくガチガチに固めるコードを書くつもりよ。2秒ごとに絶対にキーフレーム(基準となる完全な画像)を挿入し、ビットレートも『4000kbps』で完全に固定する。……一寸の遊びも許さない、完璧な『直線』のデータを生成して、YouTubeの口にねじ込む気だ」


old.tmp: 「うぅん……」


old.tmpは腕を組んで唸った。 dllの解説は論理的で正確だったが、一時ファイルの簡素な脳みそには、まだ少し情報量(専門用語)が多すぎたようだ。


old.tmp: 「あの……ディーエルエル様。言ってることはなんとなく分かるんですけど、ビットレートとかキーフレームとか、まだちょっと難しいですぅ……。もうちょっと、僕みたいな一時ファイル……いや、幼稚園児でもわかるように教えてくれませんか?」


old.tmpが情けない声で頼み込むと、dllは呆れ果てたように天を仰いだ。 しかし、彼女はシステム管理者としての教育義務を放棄することはなく、大きく息を吸ってから、極めて平易な言葉に翻訳し始めた。


dll: 「……はぁ。仕方ないわね。よく聞きなさい。……今、エグゼは『動画』っていう名前の、たくさんの子供たち(データ)を連れて、YouTubeっていう名前の『厳しい関所』を通ろうとしているの」

old.tmp: 「はい! 関所を通るんですね!」


dll: 「子供たちは元気に走ったり、ゆっくり歩いたり、たまに立ち止まったりしながら、自分のペースで関所に向かっていたわ。これが『可変フレームレート(VFR)』よ」


old.tmp: 「子供だから、歩幅もペースもバラバラなんですね」


dll: 「そう。でも、YouTube関所の『奉行サーバー』はものすごく神経質で融通が利かないお爺さんなの。子供たちが少しでもバラバラの歩幅でやってくると、『列が乱れとる! 到着時間が読めん! けしからん!』って怒って、黄色い旗(警告)を振り回すのよ」


old.tmp: 「うわぁ、めんどくさいお爺さんだ! 無事に着いてるんだからいいじゃないですか!」


dll: 「エグゼもそう思ったわ。『ちゃんと着いてるんだから文句言うな』ってね。でも、黄色い旗を振られると、それを見ている見物人(視聴者)が『あーあ、あの引率の先生(配信者)、子供のまとめ方が下手なんだな』って思っちゃうでしょ?」


old.tmp: 「ああっ! 確かに! 奉行が怒ってるのを見ると、エグゼさんが悪いみたいに見えちゃう!」


dll: 「だから、エグゼは『そんなに列の乱れが気に入らないなら、軍隊みたいに一糸乱れぬ行進をさせてやる』と、台所でスマホを片手に冷静に解決策を練っているの。それが今回のメモよ」


dllは、同期されているドキュメントのテキストを指差しながら、お遊戯会のような口調で続けた。


dll: 「『フレームレート30fps固定』! これは、『全員、絶対に1秒間に30歩の同じペースで歩け!』という命令よ。『動画ビットレート4000kbps固定』! これは、『全員、絶対に同じ重さのリュックを背負え! 軽すぎても重すぎてもダメ!』という命令」


old.tmp: 「ひぃぃ! スパルタ教育だ!」


dll: 「そして極めつけは『キーフレーム2秒(60フレーム)に1回』。これは、『2秒ごとに、絶対に班長(完全なデータ)を先頭に立たせて点呼をとれ!』という厳格なルールの押し付けよ。これらを全てコードという鎖で縛り付けて、一切の自由(可変)を許さない、ガチガチに固められた軍隊のパレードを作り上げるのよ」


old.tmp: 「なるほどぉ!! すごくわかりやすいです! つまり、YouTubeのお爺さんがぐうの音も出ないくらい、完璧に足並みを揃えたデータを叩きつけてやるってことですね!」


dll: 「その通りよ。無機質なコマンドラインの世界で、相手のシステムの理不尽な仕様を完全に理解し、それを制圧するための数式を組み立てる。……GUI(見た目)に頼らず、文字の力だけでね」


dllは、画面上で静かに更新されていくドキュメントのカーソル越しに、管理者への僅かな敬意を含んだ視線を向けた。


old.tmp: 「エグゼさん、なんかものすごいことしてますね……」


old.tmpは、ドキュメントに次々と打ち込まれていく新たなパラメータ群を見つめながら、畏敬の念を込めて呟いた。


old.tmp: 「ただ晩御飯を作る前のテスト配信だったはずなのに、台所で料理しながら『VS YouTubeサーバー』の技術的な戦略を立ててるなんて……。かっこいいなぁ」


dll: 「……ふん。まあ、料理を焦がさなければの話だけどね。この手の技術的な思索デバッグに思考リソースを持っていかれると、ヒューマンは物理世界のタスク(火加減)をおろそかにしがちだからな」


old.tmp: 「あ! たしかに! エグゼさん、お鍋焦がさないでくださいよぉ!」


誰もいない部屋の中で、PCの冷却ファンが、主の帰還を待つかのように静かな唸りを上げている。 デスクトップの裏側では、放置されたままのffmpegが、今もなお愚直にデータを送り続けていた。来るべき「完璧な行進」のコードが完成する、その時まで。

(システムログ:クラウド上のドキュメント更新を検知。……管理者の調理タスクとデバッグタスクの並行処理を監視します)

評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ