2020年11月30日月曜日

サテライト会場のある会議における設営方法 | ライタス株式会社

ライタス代表の箕谷です。
新型コロナウィルスの関係で、オンライン会議の引き合いを多数いただいております。

オンライン会議の環境作成には、いろいろと工夫方法が展開されてきており、数人クラスの会議では、ほぼ問題なく実施されているように見受けられます。
ただ、大人数が参加する会議(総会など)の開催のノウハウについては、まだ浸透していないのではないかと思います。

たまたまの機会を頂いて、別室で別会場のあるパターンの会議を設置運営させていただきましたので、参考までに事例報告したいと思います。

両隣内扉でつながっているの広めの部屋を2つ使いまして、会場を設営しています。(イメージ図は次の通り
仕様したシステムや機材の概略は以下の通りです。

場所概要
会議システムGoogle Meet
メイン会場PCノートPC
Jabra SPEAK 510 (BlueTooth接続)
キャプチャーボード HSV323 (USB接続)
ビデオカメラ HC-VX870 (HDMI接続)
別室PCノートPC
マイクスピーカー YVC-330
プロジェクター BENQ MH550
スクリーン PRS-Y90HD

各機器の接続方法については、マニュアル参照としてここでは記載しません。
手順としては、各PCに機材を接続して、各部屋にあるノートPCからGoogle Meetの同じ会議に参加すれば出来上がりです。
接続するときに、カメラや音声の接続デバイスに注意すれば、取り急ぎの環境はできると思います。

会議を運営する上で、注意しないといけない点がいくつかありましたので、記載しておきます。

・部屋が隣だと、マイクが音を拾ってしまいエコーが発生してしまう
・別室側には係員を配置して、質問等があったときに連携する必要がある
・別室発言者は、マイクの前でマイクをオンにするか、メイン会場に行く必要がある
・カメラは録画モードにしておかないと、省電力モードになってしまい画面が落ちてしまう
・Jabraの音が拾える範囲は3mが限度なので、発言者が変わる場合は、Jabraを移動させる必要がある(他のPCで展開しても回避できるが、ハウリングに注意)
・Jabraのボタンが運んでいるうちにボタンを押してしまい、モードがおかしくなる

事前に検証していたので、そこまで本番ではトラブルなく運営できました。
また、会議が長丁場になって心配していたJabraの電源は、3時間ぐらい給電なしで耐えられたのが、ナレッジとしては収穫でした。

また、この方式であれば、遠隔地にいる参加者も参加できるということで、今回も遠方の方が数名参加されました。

機材費はそこそこ費用が掛かるものの、ノートPCを除くと30万円以内には収まるはずなのと、
その後のWeb会議にも使えるはずなので、そこまで悪い投資ではないと思います。

以上、事例報告でした。

弊社では機材調達から、このような運営の支援なども実施しております。
お問い合わせは弊社HPよりお寄せください。



2020年11月24日火曜日

Dockerコンテナ化させたHLSのwebストリーミング配信環境構築(さくらのクラウド,Centos, Nginx,FFmpeg,docker) | ライタス株式会社

こんにちわ。
10月より新入社員として入社しました田所です。

今回もストリーミングサーバーネタです!
今回は前回構築したffmpegとnginxを使ったHLSでwebストリーミング配信環境をDockerでコンテナにまとめて、 どこでも簡単に環境を構築できるようにしちゃいます(^^♪
前回の記事↓
https://blog.litus.co.jp/2020/11/hlsflashplayerwebcentos-nginxffmpeg.html

さて、今回もコンテナ化するにあたってアーキテクト図を書きます!
参考記事↓
https://blog.soushi.me/entry/2017/02/17/135834/

基本は前回のcentos上で構築したもののと同じにするのですが、下記の通りコンテナならではの構成に若干変更しました。
  • RTMP→HLS変換するコンテナとweb配信するコンテナで分割
  • 二つのコンテナをdocker-composeでまとめて起動、停止可能
  • hls配信に必要なm3u8ファイル等はdockerボリューム上に置き、コンテナ間で共有させる

なんだかモダンでかっこいい!!(笑)



今回はローカル環境にDockerを入れてローカル上で構築を確認できたら、まるっと本番に移します。
というわけで本日の作業は環境構築含め以下の内容で進めていきます
  • Docker for windowsをインストール(起動確認まで)
  • Dockerfile、docker-compose.yml等必要なファイルを作成
  • ローカルでイメージをビルド→コンテナ起動→確認
  • さくらのクラウド(CentOS)上で起動→確認


1.Docker for windowsをインストール

※Windows10 Pro 64bitでのDockerインストールした手順について記述しています。
参考記事↓
https://www.public.ne.jp/2020/06/02/%E3%80%90docker%E3%80%91%E7%AC%AC9%E5%9B%9E%E3%80%80windows-10-pro-%E3%81%B8-docker-desktop-for-windows-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/
https://docs.docker.jp/docker-for-windows/install.html


Hyper-Vを有効化


[コントロール パネル] > [プログラムと機能] > [Windowsの機能の有効化または無効化] > [Hyper-V]にチェック
変更後に再起動が必要

Docker Desktop for Windowsをインストール


↓Docker Hubにインストーラーがあるので「Get Docker」をクリックしてダウンロード
https://hub.docker.com/editions/community/docker-ce-desktop-windows/
ダウンロードが完了したら実行し、ポチポチと押して進めていきます(※基本OKを押してインストールまで終わらして問題ないので、割愛)
完了したら再起動します
再起動後は自動でDockerが起動する(はず)のでタスクトレイからDockerが起動していることを確認する。

起動確認


コマンドプロンプト(またはpowershell)でDockerとdocker-composeバージョン確認
> docker version
Client: Docker Engine - Community
 Cloud integration: 1.0.2
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:00:27 2020
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:07:04 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
docker-compose の確認
> docker-compose --version
 docker-compose version 1.27.4, build 40524192
完璧です!
お試しでHello Worldを出力するだけのコンテナを実行してみます!
> docker run --rm hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
※--rm オプションで実行後にコンテナを自動で削除するようにしています。
上記のようなメッセージが出力されたら成功です。
ついでに「docker run -it ubuntu bashでubuntuコンテナ起動してみなはれ。」って言っているのでやってやりましょう(笑)
> docker run -it --rm ubuntu bash
root@703f8d0cae30:/#    
※ここも--rmつけて停止後にコンテナを破棄するようにしています。
起動したubuntuコンテナ内にbashで操作できるようになりました。
一応OSの確認。
root@703f8d0cae30:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"
「exit」コマンド or 「Ctrl + D」でコンテナから抜け出せます。
セットアップ完了です!
超簡単にDockerを構築できました!



2.Dockerfile、docker-compose.yml等必要なファイルを作成

ファイル構成は以下の通りとしました。
streamserver/
├─ rtmp/
|  ├─ Dockerfile
|  └─ nginx.conf
├─ web/
|  ├─ Dockerfile
|  ├─ index.html
|  └─ nginx.conf
└─ docker-compose.yml

各ファイル内容は以下の通りです。
  • streamserver/docker-compose.yml
  • version: "3"
    services:
      rtmp_ffmpg:
        build:
          context: ./rtmp
        volumes:
          - hls:/var/www/vhosts/live_stream
        ports:
          - 1935:1935
      web:
        build:
          context: ./web
        volumes:
          - hls:/var/www/vhosts/live_stream
          - ./web/index.html:/usr/share/nginx/html/index.html
        depends_on:
          - rtmp_ffmpg
        ports:
          - 80:80
    volumes:
      hls:
    
    ポイントはvolumesでhlsというdockerボリュームを作成し、rtmp_ffmpgとwebコンテナで共有している点です。
    このhlsボリュームにffmpegがコンバートしたhlsファイルが置かれるようにします

  • streamserver/rtmp/Dockerfile
  • FROM tiangolo/nginx-rtmp:latest
    COPY nginx.conf /etc/nginx/nginx.conf
    RUN apt-get -y update \
      && apt install -y ffmpeg \
      && mkdir -p /var/www/vhosts/live_stream \
      && chmod -R o+rwx /var
    
    tiangolo/nginx-rtmpというイメージを拝借しています。
    このイメージ単体で初回構築したときのような RTMPでのストリーミング配信が可能です。
    これに更にffmpegを追加インストールし、rtmp/nginx.confをコンテナ内にコピーしています。
    ちみなに
    && mkdir -p /var/www/vhosts/live_stream \
    && chmod -R o+rwx /var
    
    この部分はffmpegがhlsファイルを吐き出すディレクトリを作成しています。更にパーミッションを変更しています。
    ※パーミッションが変更されていないとコンテナ起動時にffmpegにPermission Deniedと怒られました。
    docker-compose.ymlにコンテナ間で共有するディレクトリとして指定しているのが原因と思われます。

  • streamserver/rtmp/nginx.conf
  • worker_processes auto;
    rtmp_auto_push on;
    events {}
    rtmp {
       server {
         listen 1935;
         allow play all;
         access_log /var/log/nginx/rtmp_access.log;
         application live1 {
         live on;
         exec ffmpeg -i rtmp://localhost/live1/$name -async 1 -vsync cfr -acodec copy -c:v libx264 -b:v 128K -f flv rtmp://localhost/live2/$name_low;
       }
       application live2 {
         live on;
         hls on;
         hls_path /var/www/vhosts/live_stream;
         hls_variant _low  BANDWIDTH=300000;
       }
      }
    }    
    
    1935ポートでRTMPを受け付けて、ffmpegが/var/www/vhosts/live_streamにhlsファイルを吐き出す旨を書いています。


  • streamserver/web/Dockerfile
  • FROM nginx:latest
    
    RUN apt-get -y update \
      && mkdir -p /var/www/vhosts/live_stream \
      && chmod -R 777 /var
    COPY nginx.conf /etc/nginx/nginx.conf
    COPY index.html /usr/share/nginx/html/index.html  
    
    webサーバーのnginxコンテナイメージを使用しています
    コンテナ間の共有ディレクトリとして/var/www/vhosts/live_streamを作成し、
    nginx.confとindex.htmlをコンテナ内にコピーさせています。


  • streamserver/web/index.html

  • <html>
      <head>
        <title>HLS Test</title>
        <link href="https://vjs.zencdn.net/7.4.1/video-js.css" rel="stylesheet">
      </head>

      <body>
        <video-js id=example-video width=640 height=360 class="vjs-default-skin" controls>
          <source src="http://「IPアドレス」/live_stream/「OBSストリームキー」_low.m3u8" type="application/x-mpegURL">
        </video-js>
        <script src="https://vjs.zencdn.net/7.4.1/video.js"></script>
        <script>
          var player = videojs('example-video');
        </script>
      </body>
    </html>

    「IPアドレス」と「OBSストリームキー」は各自で書き換えてください。
    ローカル上で動きを確認する場合はIPアドレスは「localhost」でよろしいかと思います。


  • streamserver/web/nginx.conf
  • user  nginx;
    worker_processes  2;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    http {
      include mime.types;
      default_type application/octet-stream;
      sendfile on;
      server {
        listen 80;
        server_name  localhost;
        location / {
        root /usr/share/nginx/html/;
        index index.html index.htm;
        }
        location /live_stream {
        types {
            application/vnd.apple.mpegurl m3u8;
        }
        root /var/www/vhosts/;
        }
      }
    }
    
    webサーバーとして80番ポートで受け付けています。

    準備が整いました!!


    3.ローカルでイメージをビルド→コンテナ起動→確認

    とりあえずローカル上での挙動確認のため、obsの配信設定はlocalhostに配信するように設定を変更しておきます。
    さっそくイメージをビルドします。
    docker-compose.ymlがあるstreamserverディレクトリまでpowershellやコマンドプロンプトで移動し、以下のコマンドを実行します。
    > docker-compose build
    
    時間がかかるのでしばらく待ちます。
    終了したらイメージ一覧を確認します
     > docker-compose images
    REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
    streamserver_nginx             latest              ef56cc44a48e        34 minutes ago      156MB
    streamserver_rtmp_ffmpg        latest              f373c5e5f450        47 minutes ago      1.06GB
    nginx                          latest              daee903b4e43        5 days ago          133MB
    tiangolo/nginx-rtmp            latest              e2efd1d48936        3 months ago        850MB
    
    4つイメージがあれば成功です!!
    ではビルドしたイメージを起動します!
    docker-compose.ymlがあるstreamserverディレクトリで以下を実行
    > docker-compose up -d
    Creating network "streamserver_default" with the default driver
    Creating streamserver_rtmp_ffmpg_1 ... done
    Creating streamserver_nginx_1      ... done 
    
    起動しているか確認します
    > docker ps
    CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS              PORTS                    NAMES
    741416b21ea2        streamserver_nginx        "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp       streamserver_nginx_1
    83d8673c3580        streamserver_rtmp_ffmpg   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:1935->1935/tcp   streamserver_rtmp_ffmpg_1
    
    STATUSが2つともUPとなっているので問題なさそうです!
    まずはwebサーバーが起動しているか確認します
    ブラウザからlocalhostにアクセスします。
    問題なさそうです!
    続いてOBSでlocalhostに向けて配信を開始します!
    上手くいってそうです!!
    再度localhostにアクセスすると...

    きたー!!!!(^_-)-☆

    問題なく見れています!
    コンテナをまとめて終了させる際は
    > docker-compose down
    
    でコンテナが破棄されます。


    4.さくらのクラウド(CentOS)上で起動→確認

    環境は前回までで構築したインスタンスをそのまま使います。
    作業としてはsshでサーバーへ接続してdockerとdocker-composeをインストールするだけですね
    sshで接続するまでの工程は割愛します(詳細は前々回の記事参照)
    参考記事↓
    https://qiita.com/subretu/items/549bc720165004bca3c3
    以下のコマンドを実行し、インストールする。
    #dockerインストール
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum -y install docker-ce
    #Docker Composeインストール
    curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    
    これでエラーがなければバージョンが表示されるはずです
    docker --version
    docker-compose --version
    
    続いてローカルで作ったstreamserverディレクトリをサーバーの中へコピーします
    teratermであればフォルダをzipとかに圧縮してドラッグ&ドロップします
    SCPを選んでコピー先を指定します。(今回はホームディレクトリ(~))
    解凍
    > cd ~
    > ls
    streamServer.zip
    > unzip streamServer.zip
    > ls
    streamServer streamServer.zip
    
    ※web/index.htmlの「IPアドレス」、「OBSストリームキー」は適宜vimやnanoを使って変更してください
    ※OBS設定で配信先をサーバーURLに変更しておいてください
    では、本題!!
    解凍したディレクトリへ入って起動させます!
    > cd ~/streamServer
    > docker-compose up -d
    Creating network "streamserver_default" with the default driver
    Creating streamserver_rtmp_ffmpg_1 ... done
    Creating streamserver_nginx_1      ... done 
    
    2つのコンテナが起動し、Doneと出力されたら完了です

    ブラウザでサーバーへアクセス
    webサーバーコンテナは無事動いています。
    ではOBSで配信を行います!
    やったーーーーー!!!
    これで無事Dockerで環境構築できました!



    今後の課題、目標等

    • 前回に引き続き遅延はかなりのあるので最小限にできるよう改善する
    • docker-composeではなく、ECS、EKS、kubernetes等のコンテナオーケストレーションツールで実装してみる

    これからも精進いたします!!😉
    それでは。

    2020年11月9日月曜日

    HLSでFlashPlayerを使用しないwebストリーミング配信環境の構築(さくらのクラウド,Centos, Nginx,FFmpeg) | ライタス株式会社

    こんにちわ。
    10月より新入社員として入社しました田所です。

    前回記事にしました、さくらのクラウド上で構築したストリーミングサーバーを更に進化させていきたい思います!!
    前回のストリーミングサーバーの構築記事↓
    https://blog.litus.co.jp/2020/10/centosnginx.html


    前回構築したストーリングサーバーでは再生するにはFlashPlayerが必要でした。
    FlashPlayerは2020年にサポート終了することもありますし、Chromeでは再生するにはいちいち許可したりする必要があり、なるだけ使用は避けたい、というところで終了しました。
    なので今回はこのRTMPを使用したストリーミングサーバーを生かしつつ、FlashPlayerを使用しないでストリーミング配信できる環境に進化させます!
    具体的にはHLS (HTTP Live Streaming)というプロトコルを使用します。
    ↓参考記事
    https://engineer.dena.com/posts/2018.12/knowledge-for-livestreaming
    .m3u8っていう拡張子のデータに映像を記録したプレイリストがはいってるわけですね。
    なるほど、なるほど。この.m3u8の配信映像データがあれば、いい感じにwebで動画を再生できるというわけ
    例のごとく前例はもちろんたくさんありました。
    FFmpegというライブラリを使います。
    こいつをNginxと組み合わせることで PCからRTMP配信→Nginx経由でFFmpegに.m3u8のデータを生成してもらう→.m3u8データを再生するJavaScriptコードが入ったHTMLを配置(Nginxのwebサーバー)
    って感じです。
    というわけで今回もイメージを作成↓
    基本は前回のさくらのクラウドの環境をそのまま使って
    • FFmpegをインストール
    • nginx.conf書き換え(FFmpegを実行する旨等記載)
    • htmlファイルの書き換え
    これらの追加作業をするだけです。

    今回の参考にさせていただいた記事
    https://qiita.com/khagi/items/b99f5a36846d9ab65daa
    https://qiita.com/nabeyaki/items/9ddece8231af8e691c3a

    さっそく行きましょう!!


    1.FFmpegをインストール

    前回の記事の通りさくらクラウドのサーバーにSSHで入った所から始めます


    FFmpegをダウンロード
    FFmpeg Static Builds
    cd /usr/local/share/
    wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-arm64-static.tar.xz
    tar Jxf ffmpeg-git-arm64-static.tar.xz
    

    ffmpegをインストール
    ln -s /usr/local/share/ffmpeg-git-arm64-static.tar.xz/ffmpeg /usr/bin/ffmpeg
    
    シンボリックリンクを作成して、コマンドで実行できるようにしている

    ffmpeg確認
    ffmpeg -version
    
    正常にインストールされていればバージョン情報がみれる
    これでFFmpegのインストールは終了です

    2.nginx.conf書き換え

    vimで編集
    vim /etc/nginx/nginx.conf
    
    下記のように設定しました。
    rtmp {
       server {
         listen 1935;
         allow play all;
         access_log /var/log/nginx/rtmp_access.log;
         application live1 {
         live on;
         exec ffmpeg -i rtmp://localhost/live1/$name -async 1 -vsync cfr -acodec copy -c:v libx264 -b:v 128K -f flv rtmp://localhost/live2/$name_low;
       }
       application live2 {
         live on;
         hls on;
         hls_path /var/www/vhosts/live_stream;
         hls_variant _low  BANDWIDTH=300000;
       }
    }
    
    http {
        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        server {
            listen 80;
            server_name  localhost;
            location / {
            root html;
            index index.html index.htm;
            }
            location /live_stream {
            types {
                application/vnd.apple.mpegurl m3u8;
            }
            root /var/www/vhosts/;
            }
        }
    }
    
    
    rtmpのlive2内の
    hls_path /var/www/vhosts/live_stream;
    
    このディレクトリ内にFFmpegが頑張ってコンバートしたデータが入ってくれます。 なのでこのディレクトリがない場合は作成しておきます。
    mkdir -p /var/www/vhosts/live_stream
    
    これでnginxの設定は終了です。

    Nginx起動
    /usr/sbin/nginx
    
    この時点でOBSで配信を開始すれば/var/www/vhosts/live_streamにFFmpegが作った.m3u8等が生成されていることを確認します。
    OBSの設定は前回の記事のままで問題ありません。
    「配信開始」を押します。
    エラー警告もなく、右下が緑になっていればサーバーに接続ができています。
    ではサーバー側で/var/www/vhosts/live_streamをのぞいてみます。
    [root@ホスト名 ~]# ls /var/www/vhosts/live_stream/
    test.m3u8  test_low-28.ts  test_low-29.ts  test_low-30.ts  test_low-31.ts  test_low.m3u8
    
    無事、hls配信に必要なデータが生成されています。
    ※ちなみにファイル名の「test」の部分はOBSの配信設定のストリームキーの値です。

    3.htmlファイルの書き換え

    headタグ

    <link href="http s://vjs.zencdn.net/7.4.1/video-js.css" rel="stylesheet"></link>

    bodyタグ

    <source src="http://サーバーグローバルIPアドレス/live_stream/test_low.m3u8" type="application/x-mpegURL"></source>
    </video-js>
    <script src="https://vjs.zencdn.net/7.4.1/video.js"></script>
    <script>
      var player = videojs('example-video');
    </script>



    ※「サーバーグローバルIPアドレス」、「test_low.m3u8」の部分は自身の環境に沿って書き換えてください
    これでwebからアクセスすればみれるはずです。

    完璧!!!

    再生ボタンをワンポチで動画が見れます(^^



    が、遅延がヤバイ(笑)

    30秒くらいの遅延が確認できました(汗)


    症状の原因に下記の可能性があるかと思います。
    • FFmpeg自体が重たい
      topコマンド実行したら
      FFmpegさんのCPU使用率120%越えでむせび泣いてました(笑)
      →他に軽いソフトがあれば検討
    • ひとつのサーバーでNginxがRTMPとWeb両方を担っているのがキツい

      →RTMPとWebの役割を分けて行うと改善するかも??
    • サーバースペック的にストリーミング配信自体がきつい

      現在のさくらのクラウドサーバーのスペックは 仮想コア: 2, メモリ: 4GB
      →スケールアップで改善するかも??
    • 設定が悪い(OBS,Nginx,FFmpeg)
      →OBSのビットレートやキーフレーム,FFmpegの実行コマンドのパラメーター等を変えると改善するかも??
    等が考えられそうです。

    次回は色んな方法を模索し負荷を減らして遅延の少ない配信を目指します


    後Dockerコンテナ化してどこでも簡単に使いまわせるようにしてみたいと思います
    これからも精進いたします!!😉
    それでは。

    2020年10月29日木曜日

    さくらのクラウドにCentOS、Nginxを使い、ストリーミングサーバーを構築してライブ配信したい | ライタス株式会社

    こんにちわ。
    10月より新入社員として入社しました田所です。

    入社して1か月が経とうとしています。 まだまだ分からないことだらけで参っております。 さて、今回も初学者の私目線で業務で学んだことをまとめていきます😘


    今回やりたいことは記事のタイトルの通りで
    1. さくらのクラウドを使って
    2. CentOSに
    3. Nginxを入れて
    4. OBSでPCの画面を配信
    ってだけです。



    めっちゃ簡単そうや!!!!




    とかいってみたい人生です。

    とにかく PCの画面をwebページで配信して閲覧できる様にします。
    Youtubeの非公開とか限定公開のライブ配信みたいな感じです。
    と、いうわけでざっくりですがアーキテクト図に落とし込んでみました。
    絵に書くとなんかわかった気になれます(知らんけど)


    今回RTMPという通信プロトコルで配信します。
    RTMPの基礎的知識は↓で学びました
    https://ygoto3.com/posts/live-streaming-and-rtmp-for-frontend-engineers/
    ※RTMPはTCPらしいです。(知らんかった)

    いやぁ~初心者の僕からすると情報量多すぎです(^^)/(笑)

    ひとつずつ確実に消化していきます!!
    ※今回は実施しませんが、キャプチャボードを使って別の端末画面(PCのBIOSやゲーム等)をキャプチャして配信もできます(また記事にします)

    ではいきましょう!!

    1.サーバー(さくらのクラウド)を立てる

    AWSなら触ったことあるんですが(実はAWS SAA持ち)、さくらのサーバーは一切使ったことなかったのでここもまとめておきます。
    基本的にAWSでイメージすれば特に問題なくクリアできました。
    ↓こちらを参考にしました↓
    https://mebee.info/2019/11/09/post-3567/


    さくらのクラウドのコンソール画面から「サーバー」→上にある「追加」を押す
    そしてサーバーのスペックを決めていきます
    今回は以下のようにしました(抜粋)
    • 仮想コア: 2
    • メモリ: 4GB
    • SSD: 20GB
    • OS: CentOS7.7
    今回はSSHでサーバーに入り込む際に公開鍵認証を行うことにします。
    やり方は↓の公式に詳細があるのでこの通りに行います。
    https://manual.sakura.ad.jp/cloud/controlpanel/settings/public-key.html
    C:\Users\ユーザー名>ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (C:\Users\ユーザー名/.ssh/id_rsa):
    Created directory 'C:\Users\ユーザー名/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in C:\Users\ユーザー名/.ssh/id_rsa.
    Your public key has been saved in C:\Users\ユーザー名/.ssh/id_rsa.pub.
    The key fingerprint is:
    xxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx XXXXX\ユーザー名@PC
    The key's randomart image is:
    +---[RSA 2048]----+
    |=**++.o          |
    |OEo* o o         |
    |==*+* o o        |
    |=oo+*o o .       |
    |..o= o..S        |
    |. o.o oo         |
    |.+ . o.          |
    |o . ..           |
    |   ..            |
    +----[SHA256]-----+
    

    これで
    C:\Users\ユーザー名/.ssh/にid_rsa.pub(公開鍵)が
    C:\Users\ユーザー名/.ssh/にid_rsa(秘密鍵)が
    生成されました。

    で、メモ帳でもなんでもいいのでC:\Users\ユーザー名/.ssh/の中のid_rsa.pub(公開鍵)を開いて中身をまるっとコピーし、
    このようにペーストしたらおけ!(秘密鍵はSSH接続の時使用する)
    そして「作成」をポチっと押したら起動し始めるので暫し待ちます。
    その間にさくらクラウド側でのファイアウォールの設定をやってしまいます。
    「ネットワーク」→「パケットフィルタ」を押して右上の追加を押します。
    ルールのコピー元: なし
    名前: ストリームサーバー(任意)
    を入れて、「作成」を押します。
    作られたパケットフィルタを選択して「ルール」タブの「追加」を押してルールを設定していきます。
    最終的にはこんな感じにしました。
    1. 自分のPCからのRTMP(1935番ポート)を許可
    2. webからのアクセス(80番ポート)を許可(※必要に応じて送信元ネットワークを追加してください)
    3. SSHでの接続を許可(送信元ネットワークに自分のグローバルIPを追加しておくとより安全)
    4. それ以外の通信を拒否
    フィルタリングルールは上から評価されるので3.の拒否のルールは一番下に設定します。
    そして右上の「反映」を押すことで設定が有効化されます。
    以上でクラウド側でのフィルタ設定は終了です。

    先ほどのサーバー起動状態になっているはずなので、次はSSHでログインします。



    2.SSHでサーバーへ入る

    次はSSHでサーバーへ入ります
    伝家の宝刀Tera Termさんを使って接続します。
    さくらクラウドのコンソールからサーバーのグローバルIPをコピーします。(NICの欄に有る)
    そしてTera Termを起動!!!
    先ほどコピーしたIPアドレスを入れて
    ユーザーはrootとして、「RSA/SDA/ECDSA/ED25519鍵を使う」を選択し先ほど生成した秘密鍵(C:\Users\ユーザー名/.ssh/にid_rsa)を選択
    [root@root ~]
    
    これで無事サーバーへ接続できました。
    次はNginxの諸々をインストール&セットアップします

    3.NginxとRTMP モジュールをインストール


    ここがなかなかのつまりポイントでした。(笑)

    基本は↓こちらを参考
    https://qiita.com/hagane5563/items/842afe6d6e7100db3a28
    とりあえずアプデ(地味に時間かかる奴)
    yum update -y
    
    いろいろ足りていないツール達をインストール
    yum install -y wget gcc pcre-devel openssl openssl-devel vim
    
    RTMPモジュールダウンロード
    git clone https://github.com/arut/nginx-rtmp-module.git
    
    Nginxをダウンロード
    wget http://nginx.org/download/nginx-1.8.0.tar.gz
    tar zxf nginx-1.8.0.tar.gz
    
    .configureを実行
    cd nginx-1.8.0
    ./configure --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/run/nginx.lock \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_sub_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-http_gzip_static_module \
    --with-http_random_index_module \
    --with-http_secure_link_module \
    --with-http_stub_status_module \
    --add-module=/root/nginx-rtmp-module
    
    makeしてインストール
    make
    make install
    
    ※CentOS8でmakeするとシェルスクリプトの構文エラーが連発しました。
    結局解決できずだったので、7に変更したらいけました。
    Nginx、RTMPライブラリ、CentOSのバージョンが関係ありそうです
    後日改めて対処法を探そうと思います。
    Nginxユーザー追加
    groupadd nginx
    useradd -g nginx nginx
    usermod -s /bin/false nginx
    
    Nginxの設定を弄っていく
        vim /etc/nginx/nginx.conf
    
    下記内容を追加する
    rtmp {
        server {
            listen 1935;
            access_log /var/log/nginx/rtmp_access.log;
                application live1(※任意で変える) {
                live on;
                wait_video on;
                hls on;
                hls_path /usr/local/nginx/html/;
                hls_fragment 5s;
            }
        }
    }
    
    ※live1名前の所は問題ないが、後でOBSの設定で使用する
    Nginx起動
    /usr/sbin/nginx
    
    firewall-cmdでポートを解放する
    #80と1935を解放
    firewall-cmd --add-port=80/tcp --zone=public --permanent
    firewall-cmd --add-port=1935/tcp --zone=public --permanent
    #有効化
    firewall-cmd --reload
    #有効化されているか確認する
    firewall-cmd --list-all
    public (active)
    (略)
    ports: 80/tcp 1935/tcp
    (略)
    
    #lsofコマンドでもポートの確認
    lsof -i -P |grep nginx
    nginx   31473  nginx    7u  IPv4  XXXXX      0t0  TCP *:1935 (LISTEN)
    nginx   31473  nginx    8u  IPv4  XXXXX      0t0  TCP *:80 (LISTEN)
    
    index.htmlの編集
    vim /usr/local/nginx/html/index.html
    
    以下に書き換えます。
    HTMLの編集には↓を参考

    https://qiita.com/okumurakengo/items/0c69d95553be89521b6d
    headタグ

    <meta charset="UTF-8"></meta>
     <meta content="width=device-width, initial-scale=1.0" name="viewport"></meta>
     <meta content="ie=edge" http-equiv="X-UA-Compatible"></meta>
     <title>Document</title>
     <link href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.css" rel="stylesheet"></link>
    <link href="https://vjs.zencdn.net/7.3.0/video-js.css" rel="stylesheet"></link>
        <script src="https://vjs.zencdn.net/7.3.0/video.js"></script>"
        <script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-flash/2.1.2/videojs-flash.min.js"></script>
        <style>
            .disabled {
                cursor: not-allowed;
                opacity: .5;
            }
        </style>


    bodyタグ
    <video class="video-js vjs-default-skin u-full-width" controls="" data-setup="{}" height="500" id="example_video_1" poster="" preload="none">

    <source src="rtmp://グローバルIPアドレス/任意の名前/任意のパス" type="rtmp/mp4"></source>
    <p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that
    <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
    </p>
    </video>
    ブラウザからサーバーにHTTPアクセスすると動画再生のプレイヤーが表示されていたらとりあえずOK

    4.OBSでPCの画面を配信

    ↓OBSをこちらからダウンロード&インストール
    https://obsproject.com/ja/download


    ソースの「+」を押して「画面キャプチャ」を追加するとPC画面をキャプチャしてくれます。
    カメラ、ビデオキャプチャ等は「映像キャプチャデバイス」を追加します。

    さ、続いて立てたサーバーへ配信する設定をします。
    「設定」→「配信」で次のように設定します。
    rtmp://サーバーグローバルIPアドレス/live1
    「live1」はnginx.confで任意で付けたサーバー名ですので変えている場合はその名前を入れます。
    これで設定はオッケーです!
    OBSで「配信開始」を押します。
    右下のバーが緑色になっていればサーバーにちゃんと接続が成功している、ということになります。

    さぁ配信をみてみましょう!!!!

    さくらサーバーにHTTPでアクセスします

    ちゃんとPC画面を配信できてます!

    ただ問題がありまして、実は動画を再生するにはFlashPlayerを使用します。
    FlashPlayerは2020年にサポート終了することもありますし、Chromeでは再生するにはいちいち許可したりする必要があるのでスマートではないですねぇ~"(-""-)"
    ただ、RTMPはそもそもFlashPlayerの使用が前提みたいです。
    (※chromeでFlashPlayerを許可する方法は
    https://helpx.adobe.com/jp/flash-player/kb/cq09042354.htmlを参考)
    なので

    次回はFlashPlayerを回避して再生できるサーバー構築に挑戦します!!

    これからも精進いたします!!😉
    それでは。

    2020年10月12日月曜日

    ZELMAN ZM-VE350のセットアップでハマったこと | ライタス株式会社

    こんにちわ。 10月より新入社員として入社しました田所と申します。

    IT系の知識は基本的にはないと思っていただいて、
    初心者向けな内容のインフラ周りで学んだことのアウトプットとして日々発信していけたらと思います。
    よろしくお願いいたします👦

    さて、さっそくですが、今回は以前にもブログでとりあげられていました



    こいつです。
    ZalmanのZM-VE350
    以前のレビュー記事は↓こちらからどうぞ

    USB接続のHDD、SSDとして使用もできますし、ドライブの中にISOファイルを突っ込んでおけば
    こいつのボタンをぽちぽちしてISOファイルを選択すれば光学ディスクとして使用できるというのでOSのインストール等にとても重宝するインフラエンジニアにはとても助かるアイテムです!!


    ざっくりとセットアップの手順を記載しますと、
    1. 用意したSATA I/II/III接続のHDDかSSDを装着
    2. USB接続すると電源がはいる(ドライブして認識される)
    3. ドライブをフォーマットする
    4. ドライブの中に「_iso」フォルダを作成する
    5. 「_iso」フォルダの中にisoファイルを入れる(複数可能)
    6. 本体のボタンからMode Select → Dual ModeかVCD Modeにする
    7. 本体のボタンから「_iso」にあるisoファイルを選択できるようになるので使用したいisoファイルを選択

    といった流れで使用何点か詰まってしまった点があったのでピックアップして対処方法を残しておきます。

    1.USB接続してもドライブ認識されない



    ZMV-VE350からなにも進まないやん.....


    結果これについてはデスクトップPC等に接続するといけました。
    単純に電力不足のようです。
    セルフパワータイプのUSBハブを使用したら使用しているノートPCでも使えました。(私が使用した商品詳細はこちら)

    2.「_iso」の中にisoをいれても「no iso file」と表示されisoファイルを選択できない。

    これにしばらく悩んだのですが、結論としてフォーマットの方法に問題がありました。

    公式HPにも記載があったのですが、
    MBRディスク/NTFSフォーマット
    を見逃してました👨


    どうやらGPTでフォーマットしていたみたいです。


    本来ならwin10なら「ディスクの管理」からフォーマットしなおせるはずなんですが、失敗したので、この際勉強がてらコマンドプロントで挑戦しました。



    ※ちなみにGUIでやってくれるフリーソフトもあるみたいです。


    参考記事(ほとんどこれだけで完結しました。)


    コマンドプロントを開いて

    diskpart


    一旦今認識しているディスクを確認します。

    DISKPART> list disk

      ディスク      状態           サイズ   空き   ダイナ GPT
      ###                                          ミック
      ------------  -------------  -------  -------  ---  ---
      ディスク 0    オンライン           XXX GB      0 B        *
      ディスク 1    オンライン           XXX GB      0 B        *


    今回はディスク1をフォーマットするので選択します

    DISKPART> select disk 1

    ディスク 1 が選択されました。

    DISKPART> list disk

      ディスク      状態           サイズ   空き   ダイナ GPT
      ###                                          ミック
      ------------  -------------  -------  -------  ---  ---
      ディスク 0    オンライン           XXX GB      0 B        *
    *ディスク 1    オンライン           XXX GB      0 B        *


    ディスク1の左に*がついていることを確認



    パーティションを削除します。

    DISKPART> clean

    DiskPart はディスクを正常にクリーンな状態にしました。

    これでGPTでフォーマットしてしまったパーティションはなくなります。



    本日の主役MBR形式を選択します

    DISKPART> convert mbr

    DiskPart は選択されたディスクを MBR フォーマットに正常に変換しました。

    これがしたかった

    これで今から作るパーティションがMBR形式となります。

    プライマリーのパーティションを作成します。



    DISKPART> create partition primary

    DiskPart は指定したパーティションの作成に成功しました。

    DISKPART> list partition

      Partition ###  Type                Size     Offset
      -------------  ------------------  -------  -------
      Partition 1    予約                  XX MB    XX KB
    * Partition 2    プライマリ             xxxx GB    XX MB

    これでMBRのパーティションの完成です。
    続いてファイルシステムをNTFSで指定してフォーマット開始


    DISKPART> format fs=ntfs quick

      100% 完了しました

    DiskPart は、ボリュームのフォーマットを完了しました。

    これでNTFSのファイルシステムでフォーマットしてくれます。
    ちなみに末尾にquickがついてますがこれがないと100年くらいかかるらしいので必ずつけましょう。


    DISKPART> assign letter=f

    DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

    これでちゃんとMBRでフォーマットされたドライブがFドライブとして認識されます。


    そして「_iso」フォルダの中にISOファイルをいれてやると無事本体の画面からisoを選択できるようになります。

    ※それでも表示されない(no iso file)場合は上に数秒ボタンを上げると「_iso」内のisoファイルを読み込みなおしてくれるみたいです。


    いやぁ~、すっきり!!!


    最後に「I-O DATA ハードディスクフォーマッタ」のヘルプページに
    フォーマット形式(FAT,NTFS等)、パーティション形式(GPT,MBR)の特徴についてわかりやすくまとめていただいていたので備忘録として掲載しておきます。
    (よく忘れちゃう)
    https://www.iodata.jp/support/qanda/answer/s16470.htm
    これからも精進いたします!!😉

    2020年1月6日月曜日

    CHUWI Aerobook13.3インチ購入レビュー | ライタス株式会社

    中華なノートでコスパの良いCHUWIのAerobookを購入しました。
    おもな仕様は以下。
    • Core M3 6Y30 14nm
    • Dual Core Four Threads, 2.2GHz
    • メモリー8GB(DDR3)
    • 256GB SSD
    • microSDカードスロット
    • 3.5mmジャック
    • USB3.0×2
    • DCポート
    • mini HDMI
    • USB Type-C
    • Windows10 Home
    • グレア液晶(光沢)















    開梱

    箱を横から開けると












    アダプター類が入った細長い箱。











    本体もきちんと収められてます。

















    主な同梱物(内容)は

    • AeroBook本体
    • ACアダプタ
    • マニュアル(ペラ1枚)等
    • 謎のもの??

















    ↓謎のもの






    (謎。。。教えてください。)



    次に側面のポート類

    間違えてDCを右の3.5mmジャックに挿しそうになりました(-_-;)

    注意点としては
    miniHDMIですかね。
    他でmicroHDMIの記述も見られましたが
    miniです。
    客先でプレゼンする機会があれば、変換アダプタ必要かと。

    液晶を最大で開くとこんな感じ










    バーンと液晶を180度開けて画面見せたくなる時ありますが、ご注意を。

    【Amazon】Aerobook

    起動

    初期起動、セットアップはほぼ問題なく終わりました。
    (電源ボタンは約三秒ほど押していないと起動しないですが(;^ω^))

    ただ早速タスクバーを自分仕様にカスタマイズしようとしたら、ライセンス認証されていないので設定できない
    ??
    アラートが。。。
    たまたま当該機がされていなかっただけかもしれませんが。
    "問題のトラブルシューティング"、クリックしたら解消されたので
    ま、問題なしということで。

    あと他の記事ではSSDのパーティション、Cドライブのみということが書いてありましたが、
    弊社のAerobookはC、Dと区切られておりました。







    D無くしてCに統合しようかな。


    使用感

    小一か月使用した感触

    まずキーボード!
    以前USキーボードで痛い目に合ってるだけに。。。
    (カスタマイズして余計使いにくくなったという(笑)。なので今回は何もカスタマイズしません。)
    デフォルトのまま使用しました。

    まず打鍵ですがキーピッチが19mmあることもあって、問題ないように思えます。
    ただ、"Enter"と"Backspace"は頻繁に打ち間違えてしまいます。。。














    一番多いのがEnter打ったつもりがPgUpを打ってしまい
    画面が移動、何が起こったかわからん状態(笑)
    次にBackspaceを打ったつもりが、Home押して画面が明後日に。。。


    日本語入力切替は下記で切り替えられるので、慣れれば問題ないですかね。
    • 「Shift」+「CAPS Lock」
    or
    • 「Alt」+「~」


    ファンクションキーは
    他サイトではFnキーを押さないと操作できないとありましたが
    弊社の当該機ではデフォルトでF××、使えるようになっていました。
    自分、F2はエクセル、ファイル名の変更でもよく使うし
    F10も日本語入力時に多用するので改善されて良かったです。


    何気にキーボードにバックライトがあるのが良いですね
    なれないUSキーボードを暗いところで打っても確認できます!!









    Fn+F5でバックライト ON/OFF切替





    動作については、office、メール、WEB用途なら問題なく使えてます。
    (例 - excel複数ファイルオープンし、ブラウザ複数開き且つタブも複数等)
    ゲーム用途はゲームしないのでわかりませんww


    ※参考までにベンチ
    【CrystalDiskMark】※C、D両方で取得










    【CrystalMark2004R7】※ドライブはDで取得
    143960


















    【cinebenchR20】
    401






































    【WINSCORESHARE】


















    追記

    こちらのブログを作成中に
    wifiが突然つながらなくなると云う事象がおきました。。。











    デバイスマネージャーを見てみてもwifiアダプターが見つからず


    しかしながらこちらはAerobookに限った話ではなく
    Windows10で起こる事象みたいです。
     PC(windows10)を完全shutすることによって認識するようになりました(;^ω^)
    (Shift+シャットダウン)