2025,江端さんの技術メモ

GStreamerのC言語のライブラリの、res = gst_structure_get_double(stats, "bandwidth-mbps", &bandwidth_mbps); g_print("bandwidth-mbps: %d %f\n", res, bandwidth_mbps);の値が何の値を返しているのか教えて下さい

このプログラムにおける bandwidth_mbps の値は、SRT(Secure Reliable Transport)通信における推定帯域幅(Mbps) を示していると考えられます。


bandwidth_mbps の取得と用途

1. どこで取得しているか

bandwidth_mbps は、以下のコードで取得されています。

c
res = gst_structure_get_double(stats, "bandwidth-mbps", &bandwidth_mbps);
g_print("bandwidth-mbps: %d %f\n", res, bandwidth_mbps);

この部分では、GStreamer の srtserversink から取得できる SRTの統計情報 (stats) から "bandwidth-mbps" というキーの値を取得しています。

GStreamer の SRTプラグイン (srtserversink) は、SRTプロトコルのメトリクス情報を提供し、その中に "bandwidth-mbps" というパラメータが含まれています。

つまり、SRT通信時の「利用可能な推定帯域幅」をリアルタイムで取得している。

bandwidth_mbps の意味

  • SRTの推定帯域幅(Mbps)
  • リアルタイムでSRTの通信状況から取得される
  • 現在のネットワーク環境で送信可能な最大帯域を示す

bandwidth_mbps の用途

  • エンコードのビットレート調整に使用
  • ネットワークの状況に応じて、適切なビットレートを決定

「SRTの推定帯域幅(Mbps)」というのは、「今使っている帯域なのか」、「まだ使える帯域なのか」どちらでしょうか

bandwidth_mbps は、SRT (Secure Reliable Transport) における「推定帯域幅 (Estimated Bandwidth)」を示す値であり、その意味合いは 「まだ使える帯域」= 利用可能な推定帯域 に近いものです。


1. bandwidth_mbps は「今使っている帯域」ではない

理由 ①: "send-rate-mbps" や "receive-rate-mbps" という項目が別にある

プログラム内では、SRTの統計情報 (stats) から bandwidth-mbps の他に、send-rate-mbpsreceive-rate-mbps という値も取得できるようになっています。

c
res = gst_structure_get_double(stats, "send-rate-mbps", &send_rate_mbps);
g_print("send-rate-mbps: %d %f\n", res, send_rate_mbps);

res = gst_structure_get_double(stats, "receive-rate-mbps", &receive_rate_mbps);
g_print("receive-rate-mbps: %d %f\n", res, receive_rate_mbps);

  • send-rate-mbps → 現在の送信レート(今実際に使っている帯域)
  • receive-rate-mbps → 現在の受信レート(今実際に使っている帯域)
  • bandwidth-mbpsSRTプロトコルが推定した、利用可能な最大帯域

このことから、bandwidth-mbps は「現在使っている帯域」ではなく、「ネットワークが許容できる帯域の推定値」 であると考えられます。


2. bandwidth-mbps の定義(SRT公式の仕様より)

SRTの公式仕様では、"Estimated Bandwidth"(推定帯域)は次のように説明されています。

bandwidth-mbps: The estimated maximum available bandwidth of the connection, calculated by the SRT protocol based on observed network conditions such as packet loss and RTT.

要点

  • 「ネットワークの状況(パケットロスやRTTなど)を基にSRTが計算した、利用可能な最大帯域」 である。
  • 現在の送信レートとは異なる
  • "available bandwidth"(利用可能な帯域) という表現が使われている。

つまり、SRTが「この回線ではこのくらいの帯域が利用できるはずだ」と推定している値 であり、今実際に使用している帯域とは違う ということです。

4. まとめ

指標 意味 役割
send-rate-mbps 今使っている帯域(送信速度) 実際の送信速度をモニタリング
receive-rate-mbps 今使っている帯域(受信速度) 実際の受信速度をモニタリング
bandwidth-mbps まだ使える帯域(推定値) SRTが計算した利用可能な最大帯域

結論

bandwidth_mbps は「まだ使える帯域」= 利用可能な推定帯域
SRTがネットワーク状況を解析して算出した、回線が許容できる最大帯域を示している
「今使っている帯域(現在の送信速度)」ではなく、「どのくらいの帯域が利用可能か」という指標

この値を使って、適切なビットレートを動的に調整し、映像配信を安定させる仕組みになっています。

2025,江端さんの技術メモ

GStreamer (gst-launch-1.0) と tc (Traffic Control) の "bitrate" の意味が異なるため、混乱するのは自然です。以下に、それぞれの設定が どの部分を制御しているのか を整理して説明します。


1. GStreamer (bitrate=1700) の意味

x264enc bitrate=1700
  • GStreamer の bitrate=1700 は、エンコード時のビットレートを指定 しています。
  • 単位は kbps(キロビット毎秒) なので、この場合 1.7 Mbps になります。
  • エンコード後の映像ストリームのデータ量を決定 し、これが ネットワークに流れるデータ量の目安 になります。
  • つまり、GStreamer の設定は「この映像ストリームのビットレートを 1.7 Mbps にしなさい」という指示 です。

換算

  • 1700 kbps = 1.7 Mbps
  • 1.7 Mbps = 約 0.212 MB/s(メガバイト毎秒)
    • 計算式: 1.7 Mbps ÷ 8 = 0.212 MB/s

2. tc (rate 5mbit) の意味

tc qdisc add dev eth0 root tbf rate 5mbit burst 10kb latency 50ms
  • tcrate 5mbit は、ネットワークインターフェース (eth0) の最大帯域を制限する設定 です。
  • 単位は Mbps(メガビット毎秒) なので、この場合 5 Mbps になります。
  • これは 「eth0 から送信できる最大速度を 5 Mbps に制限しなさい」という指示 です。
  • つまり、GStreamer が 1.7 Mbps の映像を送信しようとしても、5 Mbps の帯域制限があるため、この範囲内なら問題なく送信できる

換算

  • 5 Mbps = 約 0.625 MB/s(メガバイト毎秒)
    • 計算式: 5 Mbps ÷ 8 = 0.625 MB/s

3. GStreamer bitrate=1700tc rate=5mbit の関係

(1) GStreamer のビットレートが tc の制限内に収まる場合

  • GStreamer (bitrate=1700 kbps = 1.7 Mbps)
  • tc の制限 (rate=5mbit = 5 Mbps)
  • 1.7 Mbps < 5 Mbps → 問題なく通信できる
  • 映像ストリームのデータ量は 1.7 Mbps なので、帯域 5 Mbps では十分

(2) GStreamer のビットレートが tc の制限を超える場合

例えば、GStreamer の bitrate=6000(6 Mbps)と設定した場合:

  • 6 Mbps > tcrate=5mbit
  • 制限(5 Mbps)を超えているため、パケットロスが発生する可能性がある
  • 映像が乱れたり、ストリームが停止する可能性がある

このように、GStreamer の bitrate は映像のエンコード後のデータ量、tcrate はネットワークの最大許容量を決める ため、両者の関係を考える必要があります。


4. まとめ

設定 役割 値の意味 設定値(例)
GStreamer bitrate 映像エンコードのビットレート 送信するストリームのデータ量 bitrate=1700 → 1.7 Mbps
tc rate ネットワークの最大帯域制限 インターフェースの最大通信速度 rate=5mbit → 5 Mbps

結論

  • GStreamer の bitrate は「どれだけのデータを送るか」
  • tcrate は「送れるデータ量の上限」
  • GStreamer のビットレートが tc の制限内なら問題なし(1.7 Mbps < 5 Mbps)
  • GStreamer のビットレートが tc の制限を超えるとパケットロスの可能性あり(例: 6 Mbps > 5 Mbps)

つまり、現在の設定(bitrate=1700rate=5mbit)では 1.7 Mbps の映像を 5 Mbps の帯域内で余裕をもって送信できる ということになります。

よし、これは分かった。

2025,江端さんの技術メモ

添付ファイルのように、解像度やフレームレートが決まっているので、ビットレートは自動的に決まるような気がします。「1クライアントあたりのビットレート」とは何でしょうか?

「1クライアントあたりのビットレート」とは、ストリーミング配信時に1つのクライアント(視聴者)に対して割り当てられるビットレートを指します。

考えられる動作

  • 固定ビットレート(CBR: Constant Bitrate)の場合

    • 設定したビットレート(例:3072kbps)が、そのまま1クライアントあたりの配信ビットレートとして適用されます。
    • クライアントが増えても、各クライアントに同じビットレートで送信されるため、サーバーの総帯域は**「3072kbps × 接続クライアント数」**となる。
  • 可変ビットレート(VBR: Variable Bitrate)の場合

    • ネットワークの状態や映像の動きによってビットレートが変動する可能性があります。
    • クライアントごとに適応的に異なるビットレートが設定されることがある。

サーバー側の負荷との関係

  • クライアント数が増えると、総帯域も増加
    例えば、10人のクライアントが接続すると、合計ビットレートは 3072kbps × 10 = 30.72Mbps になります。
    サーバーの帯域幅が限られている場合、クライアント数が増えるとストリーミングの品質が低下する可能性があります。

  • マルチキャスト配信(UDP)であれば帯域が一定
    画像の設定では「インターネットモード:Off(UDP)」になっています。
    UDPマルチキャストを使う場合、同じストリームを複数のクライアントに送信できるため、クライアント数が増えてもサーバーの総帯域には影響しにくいです。

設定の意味

この設定が「1クライアントごとのビットレート」になっているため、

  • クライアントごとに3072kbpsで配信される
  • クライアント数が増えると、サーバーの帯域も比例して増加
  • UDP(マルチキャスト)であれば、帯域が固定されて効率的に配信可能

という仕組みになっていると考えられます。

つまり「1クライアントあたりのビットレート」というのは「1クライアントあたりのビットレートの上限値」という解釈で良いですか。つまり、それ以上のビットレートは出せない、という意味である、ということで良いですか?

「1クライアントあたりのビットレート」=「1クライアントあたりのビットレートの上限値」 という解釈でほぼ正しいです。
つまり、設定したビットレートを超えるデータ量は送信されない という意味になります。

ただし、可変ビットレート(VBR) の場合は少し異なり、最大値としての上限 になりますが、実際のビットレートは映像の内容に応じて変動 します。
逆に、固定ビットレート(CBR) では 常に設定値で送信 されます。

具体的な挙動

配信モード 「1クライアントあたりのビットレート」の意味
固定ビットレート(CBR) 常に設定値のビットレートで送信(超えないし、下回らない)
可変ビットレート(VBR) 最大値としての上限(超えないが、低くなることはある)
フレームレート指定 フレームレートを固定しつつ、CBRまたはVBRを適用
ベストエフォート指定 ネットワーク状況に応じて変動(上限なしの場合も)

結論

「1クライアントあたりのビットレート」は、基本的には「上限値」として機能し、設定値を超えることはない
ただし、ビットレートの挙動は配信モードに依存する ため、VBRでは上限値未満で可変、CBRでは常に設定値 という違いがある。

今回の場合、ユーザは数人程度しかいません。
配信モードは「固定ビットレート」「可変ビットレート」「フレームレート指定」「ベストエフォート指定」のメニューがあります。
解像度は640x360で、5fps,10fps,20fpsの3種類の転送実験を行いたいと思っています。

選択すべき配信モード、解像度とfpsに対する、1クライアントあたりのビットレートを表にして示して下さい

推奨設定とビットレート表

1. 配信モードの選択

  • 「フレームレート指定」 が適切
    • 実験の目的が「解像度 640×360」で 5fps, 10fps, 20fps の転送実験 を行うことなので、フレームレートを固定できるモードを選択するのが適切。
    • 「固定ビットレート」では画質が保証されず、特に低fps時に無駄なビットレート消費が発生する可能性がある。
    • 「ベストエフォート指定」ではネットワーク状況に応じて変動するため、実験の統一性が損なわれる可能性がある。
    • 「可変ビットレート(VBR)」も画質を維持しやすいが、フレームレートとの相性が不明なため、今回の実験には適さない可能性がある。

2. 各設定における推奨ビットレート

解像度 フレームレート 推奨ビットレート(H.264, 1クライアントあたり)
640×360 5fps 93kbps(最低100~150kbps推奨)
640×360 10fps 185kbps(最低200~300kbps推奨)
640×360 20fps 370kbps(最低400~600kbps推奨)

3. 補足

  • ビットレートの決定方法
    • 参考値として フルHD(1920×1080, 30fps)の5000kbps を基準に、解像度とfpsの比率を使ってスケーリングして計算。
    • 実際の設定では、若干高めのビットレート(表の推奨範囲)を指定した方が安定する。
  • 配信モードの調整
    • 「フレームレート指定」+「固定ビットレート」(上記の推奨値)で安定した画質を維持しやすい。
    • ネットワーク帯域に余裕があれば 「可変ビットレート(VBR)」を試して、最低ビットレートを表の値以上に設定する ことで、より滑らかな映像が得られる可能性もある。

4. 最適な設定の結論

設定項目 推奨値
配信モード フレームレート指定
解像度 640×360
フレームレート 5fps, 10fps, 20fps(それぞれ実験)
1クライアントあたりのビットレート 最低値を超えるよう設定(推奨範囲:100~600kbps)

結論:

  • 実験では「フレームレート指定」モードを選択
  • 各fpsに対応する最低ビットレートを超えるように設定
  • ネットワークに余裕があれば、少し高めのビットレート(推奨範囲内)を選択
  • 可変ビットレートも試してみる価値あり(最低値を超える設定で)

2025,江端さんの技術メモ

DockerのPostgreSQLデータベースをWindows→WSLのDockerへ移行する方法

Windows上のDockerで動作するPostgreSQLデータベースを、WSL(Windows Subsystem for Linux)のDockerに移行する 手順を説明します。


🔷 方法 1: Dockerボリュームごと移行する(推奨)

Windowsでは grepbusybox は不要 で、標準的な PowerShellコマンド を使用して移行できます。

📌 ① ボリューム名を確認

まず、PostgreSQLのデータが保存されているボリューム名を確認します。

powershell
docker volume ls

出力例:

DRIVER VOLUME NAME
local hakata_db-data

この hakata_db-data がPostgreSQLのデータが格納されているボリュームです。


📌 ② ボリュームをtarファイルにバックアップ

PowerShellを管理者権限で開き、以下のコマンドを実行します。

docker run --rm -v hakata_db-data:/data -v C:\Users\tomoi\backup:/backup ubuntu tar czf /backup/hakata_db_backup.tar.gz -C /data .

重要なポイント

  • C:\Users\tomoi\backup はWindows側のバックアップ保存先(任意のフォルダを指定)
  • ubuntu イメージを使用(busybox は不要)
  • hakata_db_backup.tar.gz という圧縮ファイルが作成される

この hakata_db_backup.tar.gz をUSBやネットワーク経由で 移行先のマシンへコピー します。


📌 ③ WSLのDocker環境にファイルをコピー

WSLのファイルシステムにバックアップを移動します。

powershell
wsl

WSL内で以下のコマンドを実行して、WindowsのバックアップファイルをWSLの /home/ ディレクトリにコピー。

cp /mnt/c/Users/tomoi/backup/hakata_db_backup.tar.gz /home/

📌 ④ WSLのDockerでボリュームを作成

WSL内で以下を実行し、新しいボリュームを作成します。

docker volume create hakata_db-data

作成したボリュームにデータを展開します。

docker run --rm -v hakata_db-data:/data -v /home:/backup ubuntu tar xzf /backup/hakata_db_backup.tar.gz -C /data

📌 ⑤ WSLのDockerでPostgreSQLコンテナを起動

WSL内で以下を実行し、データをマウントしたPostgreSQLコンテナを起動。

docker run -d --name postgres_hakata -p 15432:5432 -v hakata_db-data:/var/lib/postgresql/data postgres:16

📌 ⑥ データが正しく復元されたか確認

PostgreSQLコンテナに接続してデータを確認。

docker exec -it postgres_hakata psql -U postgres

データベース一覧を表示:

\l

2025,江端さんの技術メモ

音声を無視して、最も一般的な webm → mp4 変換コマンドは以下のようになります。

ffmpeg -i input.webm -vf "scale=640:360" -r 5 -c:v libx264 -preset slow -crf 23 -an output.mp4

説明:

  • -i input.webm:入力ファイルの指定
  • -vf "scale=640:360":解像度を640x360に変更
  • -r 5:フレームレートを5fpsに変更
  • -c:v libx264:H.264コーデックでエンコード
  • -preset slow:エンコード速度と圧縮率のバランスをとる(品質優先)
  • -crf 23:品質を指定(数値が低いほど高品質)
  • -an:音声を削除(無音にする)
  • output.mp4:出力ファイルの指定

このコマンドで、音声なしの mp4 に変換できます。

2025,江端さんの技術メモ

TC帯域を設定して、レイテンシーを設定した後、パケロスや遅延を設定する場合、だいたい、こうやるのですが、

sudo tc qdisc add dev eth0 root handle 1: tbf rate 10mbit burst 10kb latency 500ms
sudo tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10000ms loss 1%

RTNETLINK answers: No such file or directory と言われます。

Webで調べてみたところ、山のように、同じ"悲鳴"が飛んでいました。

で、解決方ですが、ChatGPTが、逆転の発想のやりかたを教えてくれました。

# 既存の設定を削除
sudo tc qdisc del dev eth0 root (何か表示されるが無視する)

# `netem` を root にして、まずパケットロスを設定
sudo tc qdisc add dev eth0 root handle 1: netem loss 1% delay 10000ms

# その上に `tbf` を適用
sudo tc qdisc add dev eth0 parent 1:1 handle 10: tbf rate 10mbit burst 10kb latency 500ms

つまるところ、ルールの親と子を引っくり返す、という手法です。

まあ、理由は不明ですが、これで動いているようです。

2025,江端さんの技術メモ

例題: 水道の蛇口に例える

ネットワークの「ビットレート (bitrate)」と「帯域 (bandwidth)」 の違いを、水道の蛇口に例えて説明します。


1. 帯域 (bandwidth) = 水道管の太さ

  • 水道管の太さが 「ネットワークの帯域」 に相当する。
  • 例えば 「10Gbpsの回線」 というのは 「直径10cmの水道管」 に相当する。
  • 「最大で10Gbps流せる」 という意味だが、実際にどれくらい流すかは別の話。

2. ビットレート (bitrate) = 水の流量 (蛇口の開き具合)

  • 蛇口をどれくらい開くかが 「ビットレート」 に相当する。
  • 例えば tcrate 5mbit を設定すると、蛇口を半分だけ開くようなイメージ。
  • 回線が10Gbps(帯域)でも、実際に使うのは5Mbps(ビットレート)に制限される。

3. tc を使った制限の具体例

(1) 10Gbpsの回線を持つPC (帯域 = 10Gbps)

  • 例えば、自宅のネット回線が 10Gbps だったとする。
  • しかし、tc を使って rate 5mbit に制限すると、実際のデータ転送は 5Mbps しか出ない。

(2) tc で 5Mbps のビットレート制限

sudo tc qdisc add dev eth0 root tbf rate 5mbit burst 10kb latency 1ms

この設定をすると、10Gbpsの回線を持っていても、実際の転送速度は 5Mbps に制限 される(=蛇口を少ししか開かない)。

(3) tc で 5Mbps ~ 10Mbps の変動を許可

sudo tc qdisc add dev eth0 root handle 1: htb default 10
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 5mbit ceil 10mbit
  • 最低 5Mbps最大 10Mbps まで許可 する設定。
  • 普段は5Mbpsだが、ネットワークに余裕があれば 最大10Mbps まで利用可能

4. 結論

項目 水道の例 ネットワークの意味
帯域 (bandwidth) 水道管の太さ 利用可能なネットワークの最大容量 (例: 10Gbps)
ビットレート (bitrate) 蛇口の開き具合 実際に流せるデータ速度 (例: 5Mbps)
  • 帯域は「最大でどれくらい流せるか」 を決める(物理的な上限)。
  • ビットレートは「実際にどれくらい流すか」tc で調整できる。

2025,江端さんの技術メモ

OBSの録画時にCPU負荷が増大し、操作が困難になる場合、以下の設定を調整することで負荷を軽減できます。


1. 録画のエンコーダを変更

設定 → 出力 → 録画 → エンコーダ

  • 「ハードウェアエンコード (NVENC, QuickSync, AMF)」を使用する
    • NVIDIANVENC (H.264)
    • Intel CPU内蔵GPUQuickSync H.264
    • AMD GPUAMF
    • ハードウェアエンコードがない場合x264のプリセットを変更(後述)

      私の場合、エンコードするハードウェアがにないからスキップ


2. 録画の品質を下げる

設定 → 出力 → 録画

  • 録画品質:低品質、ファイルサイズ優先
  • 録画フォーマット: mp4(またはflv)
  • エンコーダ設定: CBR (固定ビットレート)
    • ビットレート: 1500~2500kbps(画質が多少荒くなるが負荷が下がる)
    • キーフレーム間隔: 2秒
    • CPUプリセット: 「ultrafast」(x264使用時のみ)

      録画の方には、上記メニューに該当するものがなかったので、こちらもスキップ

3. 解像度とフレームレートを下げる

設定 → 映像

    • 基本 (キャンバス) 解像度: 1280×720
    • 出力 (スケーリング) 解像度: 640×360 または 854×480
    • FPS: 30 FPS または 24 FPS

      出力は最低値に、FPSは手動で10fps位まで落した→ 動作が軽くなって、マウス操作ができるようになった

2025,江端さんの技術メモ

OBSでブラウザ全体が表示されず、一部が大きく拡大されてしまう場合、以下の点を確認してください。

1. ソースのプロパティを確認

  • OBSの「ソース」リストでブラウザをキャプチャしているソースを右クリック → 「変換」→「画面にフィット」 を選択
  • これで画面全体がOBSのプレビューに収まるか確認

    # 私は、ここで解決したので、以下省略

2025,江端さんの技術メモ

VSCodeでCSVファイルの文字エンコーディングを Shift_JIS(SJIS) にする方法はいくつかあります。


① VSCodeの「文字コードの変更」機能を使う

  1. CSVファイルを開く
  2. 画面の右下に エンコーディング(例: UTF-8, UTF-16など) が表示されているのでクリック
  3. 「エンコーディングの変更」 を選択
  4. 「Shift_JIS」または「Japanese (Shift_JIS)」を選択
  5. 「エンコードされた内容を保存」 をクリックし、Shift_JIS形式で保存