Ubuntu16.04にnginx-rtmp-moduleを入れてRTMP配信をする

最終的にストリーミングキーにパスワードを入れる簡易認証について書くのですが、全て一つの投稿にすると長くなるのでまずは前段の環境構築から。
[追記] RTMPSできないと中間者攻撃対策できなくて、nginx-rtmp-moduleで対応していないということもあり一旦保留。

RTMPについて


ストリーミングでデータをやり取りするためのプロトコルで、ここでは映像をライブストリーミング(生放送)するために使用する。
通常利用するポートはTCP 1935番。

NginxでRTMPを扱うためのモジュールが公開されており、ソースに追加してMakeすることで利用可能。

確認環境


  • ubuntu 16.04

インストール手順


必要パッケージのインストール

makeするために必要なものを一通り準備。

sudo aptitude install build-essential libpcre3 libpcre3-dev libssl-dev unzip

Nginxのソースとrtmpモジュールをダウンロードしてmake/install

mkdir -p ~/work/nginx
cd ~/work/nginx

wget http://nginx.org/download/nginx-1.11.7.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

tar -zxvf nginx-1.11.7.tar.gz
unzip master.zip

cd nginx-1.11.7/

./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --add-module=../nginx-rtmp-module-master

make
sudo make install

サーバ起動時に自動起動するためSystemdにサービスとして登録

sudo vi /lib/systemd/system/nginx.service

/lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Nginxの設定

RTMPと、テスト用のプレーヤーページを用意。

sudo vi /usr/local/nginx/conf/nginx.conf

/usr/local/nginx/conf/nginx.conf

worker_processes  1;

user  www-data www-data;
pid        /run/nginx.pid;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;

        application app {
            live on;
            record off;
        }
    }
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen 80;
        server_name  localhost;
        #デフォルトのルートディレクトリは /usr/local/nginx/html
        #変えるのめんどいのでそのまま使う
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        index index.html index.htm;
    }
}

テスト用のプレーヤーページを作成

テストなのでCDNのvideo.jsを利用させていただき簡易的に作る。

sudo vi /usr/local/nginx/html/live.html

/usr/local/nginx/html/live.html

<!DOCTYPE html>
<html lang="en" class="">
<head>
    <title>Test Live</title>
    <link href="//vjs.zencdn.net/5.11/video-js.min.css" rel="stylesheet">
    <script src="//vjs.zencdn.net/5.11/video.min.js"></script>
</head>
<body>
    <video id="player" class="video-js vjs-default-skin" height="450" width="800" controls autoplay preload="auto">
        <source src="rtmp://(サーバのIP or ドメイン)/app/StreamKey" type='rtmp/mp4' />
    </video>
    <script>
        var player = videojs('#player');
    </script>
</body>
</html>

一応、所有者を変更しておく。

sudo chown www-data:www-data /usr/local/nginx/html/live.html

Nginxの起動と自動起動設定

sudo systemctl start nginx.service
sudo systemctl enable nginx.service

OBSで配信する際のURL指定


OBSClassicを使う場合は以下の値をいい感じに設定。

設定 -> 放送設定
FMS URL : rtmp://192.168.30.16/app
プレイパス/ストリームキー : StreamKey

使用方法は別途調べてください。

視聴


HTML5が見れるWEBブラウザで以下を開く。

http://(サーバのIP or ドメイン)/live.html

もちろん、配信していないと何も再生されないので注意。


TeamSpeak3をセットアップする時に使うクエリ

TeamSpeak3を立て直す時に、いつも同じようなクエリを叩くので残しておく。

ローカルからTelnetでTS3のクエリポートにアクセス


telnet localhost 10011

ログイン


パスワードはTeamSpeak3の初回起動時に表示されるやつ。
トークンと間違えないよう注意。

login client_login_name=serveradmin client_login_password=パスワード

バーチャルサーバを選択


デフォルトは1。
複数ポートで運営している方は適当に変更。

use sid=1

公開リストにサーバ情報を載せない


デフォルトだとサーバ立ててることをどこかのリストにおっぴろげてしまうらしい。
特定の用途や趣味により立てるのであれば、以下でオフにしたほうが良いかも。

serveredit virtualserver_weblist_enabled=0

ビューワからクエリで情報を参照できるようパーミッションを設定


TSStatusを使ったときのパーミッション設定。

servergroupaddperm sgid=1 permsid=b_virtualserver_info_view permvalue=1 permnegated=0 permskip=0
servergroupaddperm sgid=1 permsid=b_virtualserver_channel_list permvalue=1 permnegated=0 permskip=0
servergroupaddperm sgid=8 permsid=b_virtualserver_servergroup_list permvalue=1 permnegated=0 permskip=0
servergroupaddperm sgid=8 permsid=b_virtualserver_channelgroup_list permvalue=1 permnegated=0 permskip=0
servergroupaddperm sgid=1 permsid=b_virtualserver_select permvalue=1 permnegated=0 permskip=0

もしそれでもパーミッションが足りなくて「failed_permid=25」みたいなエラーが出る場合は以下を参照して適当に追加。
https://www.tsviewer.com/index.php?page=faq&id=12

ビューワからのクエリは時間による回数制限がかかるため、無制限にするならホワイトリストにIPを追加しておくこと。

  • /(TS3のインストールディレクトリ)/query_ip_whitelist.txt

セッションを切る


quit

UnityのSteamVRでViveタッチパッドの入力を4分割して取得

やりたかったこと

UnityでViveをいじって遊んでいる途中で、下の図みたいなバッテン型に分割して入力したくなった。

たいした内容じゃないけど、マニュアルで上手く見つけられなかったからメモしておきます。
実際にはコントローラに視覚的な目印を表示することも必要だと思う。

コード

コンポーネントとして「Controller (left)」または「Controller (right)」に追加して使用。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TouchPadPress : MonoBehaviour {

    void Start () {

    }

    void Update()
    {
        SteamVR_TrackedObject trackedObject = GetComponent<SteamVR_TrackedObject>();
        var device = SteamVR_Controller.Input((int)trackedObject.index);

        if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad))
        {
            Vector2 touchPosition = device.GetAxis();
            if (touchPosition.y / touchPosition.x > 1 || touchPosition.y / touchPosition.x < -1)
            {
                if (touchPosition.y > 0)
                {
                    //タッチパッド上をクリックした場合の処理
                    Debug.Log("Press UP");
                }
                else
                {
                    //タッチパッド下をクリックした場合の処理
                    Debug.Log("Press DOWN");
                }
            }
            else
            {
                if (touchPosition.x > 0)
                {
                    //タッチパッド右をクリックした場合の処理
                    Debug.Log("Press RIGHT");
                }
                else
                {
                    //タッチパッド左をクリックした場合の処理
                    Debug.Log("Press LEFT");
                }
            }
        }
    }
}

Pocketみたいに後で読むサービスをホストできるwallabagをインストールしてみた

Wallabagについて

オープンソースで開発されてるPHP製のWebアプリケーションです。

後で読みたいWebサイトの情報を保存しておくことができ、Chrome/Firefox等の拡張プラグインやAndroidのアプリ、ブックマークレットから手軽に呼び出すことができるようになっています。

これを書いている時点での最新バージョン(2.1.5)だと検索機能がありませんが、2.2.0には簡易検索機能が追加される予定。

  • 2017/4/9追記 2.2.0で検索機能が追加されました。

似たようなオープンソースのWebアプリだとunmarkがあるのですが、こちらは一度登録したものがUIから消せないため、私はWallabagを使ってます。

インストール手順

公式ドキュメントのインストール方法には以下2つの環境で動作させる方法が記述されてます。

  • PHPのビルトインウェブサーバー
  • Apache/Nginx/lighttpd

ここではApacheによる方法を記載します。

確認環境

  • Wallabag 2.1.5
  • ubuntu 16.04
  • PHP 7.0
  • apache 2.4

データベースはデフォルトのSQLiteを使用します。

手順

ApacheとPHPのインストール

sudo aptitude -y install\
apache2 php\
libapache2-mod-php\
php-session\
php-ctype\
php-dom\
php-hash\
php-simplexml\
php-json\
php-gd\
php-mbstring\
php-xml\
php-tidy\
php-iconv\
php-curl\
php-gettext\
php-tokenizer\
php-bcmath\
php-sqlite3

Wallabagのダウンロードと展開

mkdir -p ~/work/wallabag
cd ~/work/wallabag

wget http://wllbg.org/latest-v2-package
tar xvf latest-v2-package

sudo mv release-2.1.5 /var/www/wallabag

sudo chown -R www-data:www-data /var/www/wallabag

設定ファイルの編集

sudo vi /var/www/wallabag/app/config/parameters.yml
# /var/www/wallabag/app/config/parameters.yml
secret: (任意の文字列に変更)

データベースをSQLite以外にする場合も同じファイルの設定変更が必要。

Apacheのバーチャルホストを設定

cd /etc/apache2/sites-available/
sudo vi bag.local.conf
# bag.local.conf
<VirtualHost *:80>
    ServerName bag.local
    DocumentRoot /var/www/wallabag/web
    ErrorLog /var/log/apache2/bag.local.error.log
    CustomLog /var/log/apache2/bag.local.access.log combined
    LogLevel warn
    <Directory /var/www/wallabag/web>
       AllowOverride None
       Require all granted
       <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app.php [QSA,L]
        </IfModule>
    </Directory>

    <Directory /var/www/wallabag/web/bundles>
        <IfModule mod_rewrite.c>
            RewriteEngine Off
        </IfModule>
    </Directory>
</VirtualHost>
sudo a2ensite bag.local
sudo systemctl reload apache2.service

初回アクセス

Webブラウザでアクセス。
上記の例なら「http://bag.local/」
デフォルトのユーザとパスワードは以下。
– ユーザ : wallabag
– パスワード : wallabag