ようこそテクノおじさんホームページへ!(2022年4月1日号)

旧アイテム(1月)は過去ログ倉庫を参照ください。202201_1
旧アイテム(2月)は過去ログ倉庫を参照ください。202201_2
旧アイテム(3月)は過去ログ倉庫を参照ください。202202_1
4月です。暖かくなってきました。しかしなぜか私はこの季節になると喉、鼻の調子が悪くなります。人間ドックも控えており精神的にもよくありません。
毎日ウクライナ情勢とコロナの暗い話ばかりで憂鬱になります。
さて今回は以前にも取り上げたのですが動画をネットでリアルタイムに送るストリーミング配信についてもう少し掘り下げたいと思います。
コロナ禍でリモートでの会議や学校での講義が盛んに実施されるようになってきました。またYoutubeでもリアルタイム配信がよく見られます。
私は商用のサイトを用いることなく私的な配信ができないかと調べてみましたので紹介します。
お暇なときにお読みください。

リアルタイム配信の方法
    はじめに
    動画をストリーミング配信するためには二つの方法があります。
    ・動画ファイルを単位時間ごとに分割し受信者はTCPで該当ファイルを要求する
    ・受信者にデータをUDPで送り続ける

    ・TCP (Transmission Control Protocol) は、IPの上位プロトコルのトランスポート層で動作するプロトコルです。
    インターネットにおいて標準的に利用されているプロトコルでネットワーク層のIPとセッション層以上のプロトコル
    (例:HTTP、FTP、Telnet) の橋渡しをする形で動作しています。
    TCPは、高信頼性(3 way ハンドシェイクによる通信前の打診、ack による相手の受信確認や再送処理、等)や
    通信効率の最適化機能(Windowによるフロー制御や輻輳制御)を提供します。そのため、UDPと比べて負荷がかかります。
    ・UDP (User Datagram Protocol) は、TCPと同様にIPの上位プロトコルのトランスポート層で動作するプロトコルです。
    インターネットにて標準的に利用されているプロトコルでネットワーク層のIPとセッション層以上のプロトコル
    ( 例:DNS、NTP、DHCP )の橋渡しをするかたちで動作しています。 UDPは、コネクションレス型のプロトコルであることから、TCPに比べると信頼性がないものの高速に転送を行うことができます。
    もうお分かりかと思いますがTCPを使う方法は確実だが遅延時間が長い、UDPを使えば遅延時間を短くできるということです。 さて両者はどれほど遅延時間が違うかを検証してみます。
  • Nginxサーバーを用いたTCP配信(hls配信)
    下のビデオはTCP配信の例です。OBSで送信しChromeブラウザーで受信しています。
    遅れはほぼ30秒程度発生しています。これはYouTubeのリアルタイム配信とほぼ同じです。

    hls配信の場合は受信側はchrome、EdgeなどのHTML5対応のブラウザが使えます。
    その場合同一Lan内であればURLに http://192.168.xxx.yyy:8080/index-hls.htmlで受信できます。(192.168.xxx.yyyはサーバー側PCのローカルIPアドレス)
    一方Web配信された場合のURLはhttp://abc.def.ghi.jkl:8080/index-hls.htmlとなります。(abc.def.ghi.jklはサーバー側PCのグローバル
    IPアドレス)

  • Nginxサーバーを用いたUDP配信
    下のビデオはUDP配信の例です。OBSで送信しVLCメディアプレイヤーで受信しています。
    以前ならFlashPlayerで受信できたのですがAdobeが完全に使用不能にしたためVLCplayerで受信しています。
    遅れは5秒程度になります。
    VLCプレイヤーの場合ストリーミングURLはrtmp://localhost:1935/live/livekeyとなります。
    live,livekeyはOBSの配信設定で記述されたものです。


--------------------------------------------------------------------------------------------------------------------------

今月の技術Tips

(1)C言語の学び方
エンジニアの方なら誰もがC言語を一度は使ってみたいと思ったことがあるかと思います。しかしなかなか馴染めないのではないでしょうか。
その理由はFortranやBASICなどはあまりコンピュータのハードウェアのことを気にしないで記述できる言語なのですがC言語はメモリー上の変数格納
を考慮して記述する言語のためわかりにくさがあります。しかし実行形式に無駄がなくなり速い速度でプログラムが動きます。メモリーの制約が厳しい
Arduinoなどのマイコンボード用プログラムにC言語が使われるのはこのためです。

・まずポインター変数を理解しよう
C言語の第一の特徴はポインター変数です。
ポインタ変数の宣言は int *p; となります。
*がついていても、変数名はあくまでもpになります。
ポインタ変数とは、アドレスを代入する変数です。
Pはアドレス *pはそのアドレスにある数値またはデータを表します。

次のコーディングは簡単にポインター変数を理解するためのものです。print出力は同じアドレスになります。

#include <stdio.h>
int main(void)
{
int *p;          // ポインター変数 P を宣言
int i;           // 整数 i を宣言
p = &i;          // p にi が格納されているメモリーアドレスをコピー
printf("p = %p\n", p);   // p をプリントアウト
printf("&i = %p\n", &i);   // i のアドレスをプリントアウト
return 0;
}


次の例です。

int main(void)
#include <stdio.h>

{
int *p;
int i;
p = &i;
*p = 10; /* 通常変数モードに切り替えたポインタ変数に代入 */
printf("*p = %d\n", *p);
printf("i = %d\n", i);
return 0;
}


このプログラムの実行結果は、次の通りになります。

実行結果
*p = 10
i = 10


関数の変数引き渡し

次のコーディングは戻り値(return value)を持つ関数の例です。円の面積と円周を計算する関数です。

#include <stdio.h>
const float pi = 3.14;
// 関数の宣言と定義
float calc_a(float r) {
float area = pi * r * r;
return area;
}
float calc_l(float r) {
float len = pi * 2 * r;
return len;
}
void prt(float r, float f1, float f2) {
printf("半径%.1fの円の面積は%.2f、円周の長さは%.2f\n", r, f1, f2);
}

// 関数の呼び出し、実行
int main(void) {
float r = 10.0f, ans = 0, len = 0;
ans = calc_a(r);
len = calc_l(r);
prt(r, ans, len);
return 0;
}

実行結果:

半径10.0の円の面積は314.00、円周の長さは62.80


ここで一つ疑問がわくと思います。ファンクションだと戻り値が一つしか取れない。一つの計算で複数の値を
出力する場合はどうするのか。
次の例は複数の計算結果を出力するためのサブプログラムです。aとbとの和と差を計算して出力する例です。
このような場合はサブルーチンにポインター変数を使いサブルーチンコール時は出力したい変数のアドレスを指定します。
アドレス渡しでサブルーチン計算をするのがC言語の使い方です。

#include <stdio.h>
// サブルーチンの宣言と定義
void kagensan(int a,int b ,int *wa ,int *sa) {
*wa=a+b;
*sa=a-b;
}
// サブルーチンの呼び出し、実行
int main(void) {
int x,y,xx,yy;
x=100;
y=250;
kagensan(x,y,&xx,&yy);
printf("和 = %d\n", xx);
printf("差= %d\n", yy);
return 0;
}


今回はC言語らしいポインターについて解説させていただきました。次の回には構造体などについて解説します。

最近気になるスパムメール

最近頻繁にスパムメールが届くようになりました。
Amazon、 クレジットカード、 ETC 交通カードなど沢山のメールが届きます。
一見本物と見分けがつかないのが特徴です。しかしこれらはすべて偽メールです。
まず偽メールかどうか見分け方は次のようにすれば良いです。
一般的に言うとカード期限切れとか他人が自分のカードで買い物したとかという主旨をメールで知らせることはありません。
これらの偽メールは他のURLに導き情報を抜き出そうとします。所謂フィッシングメールです。
心配な場合はまず登録しているホームページにログインすることをお勧めします。
もしも何か支払い口座に不具合があればこのホームページに何らかの情報が得られるでしょう。
またメールののタイトルをコピーしてグーグルで検索すればほとんどヒットします。

例 わずか3日間でのメール受信結果です。私の場合はカスペルスキーインターネットセキュリティがスパムメール判定をしているようです。
[spam]【メルカリ】お買い物3000円分ポイント必ずもらえる!
[spam]【重要】えきねっとアカウントの自動退会処理について
[spam]【重要】「えきねっと」リニューアルに伴う変更点や注意点
[spam]Amazon株式会社から緊急のご連絡
[spam][重要]:【Amazonプライム会費のお支払い方法に問題があります】
[spam]【重要】ビューカードご利用確認
[spam]【ジャックスインターコムクラブ】お取引のご確認
[spam]【重要】 AEONカードお 客様情報の確認
[spam]【ETC利用照会サービス】【通知書】番号:E0672819234
[spam]【ジャックスインターコムクラブ】お取引のご確認
[spam]支払い方法を更新してください
[spam]【重要】 Suicaアカウントの自動引き出し処理について
[spam]最終通知:お客様のプライム 会員資格がキャンセルされます
[spam][au ID緊急問題]