録画していることを相手にどう見せるか。非表示は二段の許可制にした
2026年9月4日

商談を録画するとき、相手の画面に「録画中」と出すかどうかは、機能というより方針の話です。Meetnect では既定を「出す」にして、消せるのは二つの許可が同時にそろったときだけにしました。会社の管理画面のスイッチだけでは消えません。
この記事では、その二段の作りを実装のまま書きます。あわせて、この記事を書くためにコードを読み直して見つかった穴も、直っていない状態のまま書いておきます。録画中の表示は、後から入ってきた相手には出ていませんでした。
既定は「相手にも録画中と出す」。コードでは、送るか送らないかだけ
録画中の表示は、通話をつないでいる WebSocket に1つメッセージを投げるだけの仕組みです。録画を始めたときに、こう書いてあります。
const hideRec = !!(me && me.access && me.access.hideRec);
$("recChip").lastChild.textContent = hideRec ? "録画中(相手に非表示)" : "録画中";
if (!hideRec) sendWs({ type: "rec", on: true });
サーバー側は、受け取った rec を自分以外の全員にそのまま配ります。判定はしていません。非表示というのは、この1行を送らないという意味です。 相手の画面には受け取ったときにバッジが出て、受け取らなければ何も起きません。
録画を開始したことを相手に伝えること自体は、いまは珍しくありません。Google Meet のヘルプには「録画が開始または停止すると、参加者に通知されます」とあります(Google Meet で会議を録画する)。うちも既定はそちら側に置きました。
消すには、鍵が二つ要る
「録画中を相手に出さない」を有効にするには、別々の人が入れた二つのフラグが両方1になっている必要があります。
hide_rec_allowed … 提供側が、この会社に機能を許可した(管理画面 /super)
hide_rec … その会社が、実際にオンにした(管理画面 /admin)
判定はこの1行です。
const hideRec = allowHideRec && hideRecPref;
データベースの定義にも、そのまま書いてあります。
hide_rec_allowed INTEGER DEFAULT 0, -- 提供側が録画非表示機能を許可
hide_rec INTEGER DEFAULT 0, -- 顧客の選択:相手に録画中を出さない
どちらも初期値は0です。 何もしなければ、相手には「録画中」が出ます。
会社側のスイッチは、許可が無いと管理画面にそもそも現れません。表示だけの制御では回避できてしまうので、保存を受けるAPIの側でも同じことを見ています。許可が無い会社から保存が来たら、値を書かずに403で返します。
if (!p.allowHideRec) return json({ error: "not_allowed", message: "この機能は許可されていません。" }, 403);
画面で隠すのと、サーバーで断るのは別の作業です。両方書かないと、片方だけでは止まりません。
なぜ、会社側のスイッチ1つにしなかったか

管理画面にスイッチを1つ置けば、実装は半分で済みます。それをしなかった理由は、押せば消えるものとして置きたくなかったからです。
設定画面に並んでいる項目は、だいたい「好みで変えていいもの」として読まれます。通知音や既定の保存先と同じ列に「相手に録画中を出さない」を置くと、同じ温度で扱われます。録画されている相手にとっては、その1行が意味を持ちます。
そこで、この機能だけは契約の話に寄せました。使えるようにするかどうかは提供側が顧客ごとに決め、そのうえで会社が選ぶ。Meetnect の機能のうち、プランではなく個別の許可で制御しているのはこれだけです。他の機能はプランに紐づいていて、条件を満たせば自動で使えるようになります。
「有料にする」ではなく「許可制にする」を選んだのは、金額で開くと理由を聞かずに開いてしまうからです。許可を出すのは人の作業なので、そこで一度止まります。
消したのは相手の画面だけで、操作している本人の画面ではない
非表示をオンにしていても、録画している本人の画面からはバッジが消えません。文言が変わるだけです。
オフのとき … 録画中
オンのとき … 録画中(相手に非表示)
録画を始めたときに出る通知も、「録画を開始しました(相手にも録画中と表示されます)」と「録画を開始しました(相手には表示されません)」で書き分けています。
いま自分がどちらの状態で録画しているかは、常に画面に出ています。 非表示を「気づかないうちにそうなっている」状態にはしませんでした。設定を触った人と、当日その商談を回す人は別のことが多いからです。
書きながら見つかった穴:後から入ってきた相手には出ていない
ここからは、直っていない話です。
rec のメッセージを送っているのは、録画ボタンを押したその瞬間の1回だけでした。あとから商談に参加した相手には、その1回が届いていません。参加した時点で現在の録画状態を送り直す処理が、入っていませんでした。
同じことが再接続でも起きます。回線が切れたとき、相手側では受信したバッジを消しています。
try { $("recRemote").classList.add("hidden"); } catch (_) {} // 再接続時
消したあと、つなぎ直したときに送り直す側がありません。電波が切れて戻ってきた相手の画面からは、録画中の表示が消えたままになります。
録画中に参加した相手を話者別の録音に足す処理は書いてあったので(spkAddLate)、途中から参加者が増える場面自体は想定していました。音声の側は追いかけていて、表示の側が抜けていた形です。
直し方は決まっています。参加してきた人がいたときと、つなぎ直したときに、録画中なら現在の状態をもう一度送る。それだけです。ただ、この記事の時点ではまだ直していません。 直したら、この段落を書き換えます。
透明性のための表示は、出すか出さないかの方針より、出し続けられるかのほうが手間がかかる、という話でした。二段の許可制は最初から意識して作りましたが、こちらは意識していなくて抜けました。
Meetnect はブラウザだけで動くオンライン商談ツールです。録画中の表示は初期設定のまま使えば相手にも出ます。この記事に出てくるフラグ・判定・エラーの返し方は、すべて実装からそのまま書き出したもので、最後の穴も同じコードを読んで見つけたものです。