S2MMSHの使い方 - shinji3/S2MMSH GitHub Wiki

必要なものをダウンロード

S2MMSHはココからダウンロードをして下さい
https://github.com/shinji3/S2MMSH/releases

ffmpegはココからダウンロードをして下さい
http://ffmpeg.zeranoe.com/builds/

ffmpegの古いバージョンはココからダウンロードをして下さい
32bit版
http://ffmpeg.zeranoe.com/builds/win32/
64bit版
http://ffmpeg.zeranoe.com/builds/win64/

SCFFはココからダウンロードをして下さい※デスクトップをキャプチャする場合
https://github.com/Alalf/SCFF-DirectShow-Filter

初期設定

ffmpegパスの右側にある参照ボタンを押してffmpeg.exeを指定して配信ポートを8080にして下さい
上級者向けのタブにあるffmpegコマンド直接修正で下のようなコマンドを書き込んで下さい

-v error -rtbufsize 100M -f dshow -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -tag:v M4S2 -flags:v +global_header -me_range 128 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -threads 0 -c:a libmp3lame -q:a 6 -f asf_stream -

※動画デバイスと音声デバイスは自分にあったものを入力して下さい
ffmpegで使えるデバイスの一覧を出力させるコマンドです
ffmpeg -list_devices true -f dshow -i dummy 2> dshow.txt

-video_sizeは入力解像度で-sは出力解像度です。
-framerateは入力フレームレートで-rは出力フレームレートです。

※動画のビットレートの指定方法
-b:vは平均ビットレートを指定します
-gはキーフレームの間隔です。フレームレートの10倍が目安です。例えば30fpsなら-gは300

-threadsはスレッド数で(CPUのコア数+α)を指定するとエンコードを高速化できる。
-threadsを0にすると(CPUのコア数-1)が指定される。デフォルト値は0。

-maxrateは最大ビットレートです。-b:vと同じ値を指定します。
-bufsizeは-maxrateの1倍から2倍の値を指定します。
-bufsizeのサイズは小さいほど-maxrateの効果が高くなりますが、その分画質が悪くなります。

※-maxrateと-bufsizeの例
-b:v 1000k -maxrate 1000k -bufsize 1000k

配信の仕方

S2MMSHのPULL接続ボタンを押して配信して下さい
あとは http://localhost:8080/ のURLを使ってPeerCastでWMV配信が出来ます

注意する点

上級者向けのタブにあるffmpegコマンド直接修正で配信して下さい
tcp://127.0.0.1:6665経由で配信をしないで下さい
理由はffmpegコマンド直接修正じゃないとWMVのヘッダーが壊れてKagamin2でリレーできないからです。

ffmpegでmpeg4の配信の場合は以下のコマンドは必ず入れること

入れないと再生出来ないことが有ります

-tag:v M4S2 -flags:v +global_header -me_range 128

WMP11以下で画面がバグるのを無くすには-me_range 128を入れます。

ffmpegでmpeg4の配信の場合は以下のコマンドは必ず入れないこと

入れると(Advanced Simple Profile)になりWMP11以下で再生出来ないです

Bフレーム(-bf)とQpel(-flags:v +qpel)

mpeg4の配信の場合はGMC(-flags:v +gmc)が使えますが
使うと再生が重くなり画質も悪くなる場合が多いのでオススメしません

WMP11以下(XPとVista)で再生可能か確認する方法

配信を始めたらffmpegに同封してあるffprobeに以下のようなコマンドを打つ
ffprobe mmsh://localhost:8080/

WMP11以下で再生できる例
Video: mpeg4 (Simple Profile) (M4S2 / 0x3253344D)

WMP11以下で再生できない例
Video: mpeg4 (Simple Profile) (xvid / 0x64697678)
Video: mpeg4 (Advanced Simple Profile) (M4S2 / 0x3253344D)
Video: mpeg4 (Advanced Simple Profile) (xvid / 0x64697678)

実際に再生して見ないと安心できない人は仮想マシンで試して見ましょう※無料です
https://dev.modern.ie/tools/vms/windows/

最適な解像度について

解像度の一覧が書いています。動画の幅と高さは16の倍数を推奨。次善の選択は8の倍数、さらに次善の選択は4の倍数。
https://lunatilia.wordpress.com/knowledge/dtv/

16の倍数を推奨する理由は下記にURLを参照
http://www.wikihouse.com/htumenc/index.php?cmd=read&page=Doc%2Fmenc-feat-dvd-mpeg4#df8b8b84

あとmpeg4は解像度を高くするとブロックノイズが出やすいのでSD以上の解像度は止めときましょう
4:3なら640x480、16:9なら768x432の解像度がオススメです

配信設定の例

初期設定に書いてある配信設定例はオプションを必要最低限入れたのものです
以下の配信設定例はオプションを必要以上入れたものなので参考にして下さい

配信設定は下記の例を試してみて下さい。下記の例は作者のオススメ設定です
特にこだわりが無ければ作者のオススメ設定をコピるだけでそれなりに綺麗にエンコ出来ます
設定例の数字が上がるほど軽い設定です。上から順に試しましょう。

mpeg4配信設定の例

設定例0
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header+mv4+aic -me_range 128 -me_method epzs -mpeg_quant 1 -mbd rd -mpv_flags +naq+skip_rd+qp_rd -last_pred 5 -cmp 2 -subcmp 2 -precmp 2 -dia_size -1 -pre_dia_size -1 -preme 2 -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例1
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header+mv4+aic -me_range 128 -me_method epzs -mpeg_quant 1 -mbd rd -mpv_flags +skip_rd -last_pred 5 -cmp 2 -subcmp 2 -precmp 2 -dia_size -1 -pre_dia_size -1 -preme 2 -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例2
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header+mv4+aic -me_range 128 -me_method epzs -mpeg_quant 1 -mbd rd -mpv_flags +skip_rd -last_pred 5 -cmp 2 -subcmp 2 -dia_size -1 -preme 2 -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例3
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header+mv4+aic -me_range 128 -me_method epzs -mpeg_quant 1 -mbd rd -mpv_flags +skip_rd -last_pred 5 -subcmp 2 -dia_size -1 -preme 2 -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例4
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header+aic -me_range 128 -me_method epzs -mpeg_quant 1 -mbd rd -mpv_flags +skip_rd -last_pred 5 -subcmp 2 -dia_size -1 -preme 2 -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例5
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header+aic -me_range 128 -me_method epzs -mpeg_quant 1 -mbd rd -mpv_flags +skip_rd -last_pred 5 -subcmp 2 -dia_size -1 -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例6
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header+aic -me_range 128 -me_method epzs -mpeg_quant 1 -mbd rd -mpv_flags +skip_rd -last_pred 5 -subcmp 2 -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例7
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header+aic -me_range 128 -me_method epzs -mpeg_quant 0 -mbd rd -subcmp 2 -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例8
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header+aic -me_range 128 -me_method epzs -mpeg_quant 0 -mbd rd -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例9
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header -me_range 128 -me_method epzs -mpeg_quant 0 -mbd rd -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

設定例10
-v error -rtbufsize 100M -f dshow -video_size 640x480 -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v mpeg4 -b:v 1000k -maxrate 1000k -bufsize 1000k -g 300 -tag:v M4S2 -flags:v +global_header -me_range 128 -me_method epzs -mpeg_quant 0 -threads 0 -sws_flags lanczos+accurate_rnd -c:a libmp3lame -q:a 6 -f asf_stream -map a -map v -

SSIMとPSNRのチェック方法

ffmpeg -i input.mp4 -c:v mpeg4 -tag:v M4S2 -flags:v +global_header -me_range 128 -b:v 1000k -g 300 -threads 0 -an -f asf output.asf
ffmpeg -i input.mp4 -i output.asf -lavfi "ssim;[0:v][1:v]psnr" -an -f null -
pause

なんでも実況Vで配信する時の注意点

TCP経由じゃなくて上級者向け設定(ffmpegコマンド直接修正)経由でやらないと
WMVのヘッダーが壊れてKagamin2の最新版(v2.1.15)で配信できないようです
なので、なんでも実況Vで配信したい方は上級者向け設定(ffmpegコマンド直接修正)経由で配信をして下さい

PUSH配信する時にサーバーがKagamin2の場合は音声ストリームがコンテナの先頭にこないとうまくリレーされないため、 上手くいかない場合はffmpegコマンドのオプションに「-map a -map v」を指定するとよい。(音声のストリーム位置を先頭にするオプション)

参考になるコマンドとURL

ffmpegのエンコーダーのドキュメントを出力させる方法
ffmpeg -h encoder=mpeg4 > mpeg4.txt
ffmpeg -h encoder=libmp3lame > libmp3lame.txt

mpeg4のオプションはここを参考にして下さい
https://www.ffmpeg.org/ffmpeg-codecs.html#Codec-Options

libmp3lameのオプションはここを参考にして下さい
https://www.ffmpeg.org/ffmpeg-codecs.html#libmp3lame-1

OBSで配信する時の設定

S2MMSHでOBSを使ってWMV配信をする使い方をする人が多いそうです
私もしてみましたが色々と不満な所もありましたがある程度は解決出来ました

一番の不満な所は配信まで面倒な所です
OBSのPUSH先をPeercastStationにしていたのですが
配信するたびにFLV配信の設定をしなければいけなかったので面倒でした
それではFlazrDumperを使ってみてはどうだろうと試して見たのですが
これは面倒じゃないけれどビットレートが増えるほどCPU負荷が高くなって重くなるので止めた方が良いでしょう

じゃあどうすれば良いのかと言うとnginxを使えば解決出来ました
これはWindowsで使えて設定も難しくなく軽いのでお勧めです

nginxはココからダウンロードをして下さい
http://nginx-win.ecsds.eu/

最新のnginxはrtmpモジュールが使えないのでnginx 1.7.12.1をお使いください
http://nginx-win.ecsds.eu/download/nginx%201.7.12.1%20Lizard.zip

nginxのconfフォルダの中にnginx.confを作成して入れてください
下のコードはnginx.confの中身です

worker_processes 1;

events {
    worker_connections 1024;
}

rtmp {
    server {
        listen 1935;

        application live {
            live on;
            interleave on;
            wait_video on;

            allow publish 127.0.0.1;
            allow publish 192.168.0.0/16;
            allow publish 172.16.0.0/12;
            allow publish 10.0.0.0/8;
            deny publish all;
            allow play 127.0.0.1;
            allow play 192.168.0.0/16;
            allow play 172.16.0.0/12;
            allow play 10.0.0.0/8;
            deny play all;

            #push rtmp://127.0.0.1:1935/live/livestream;
        }
    }
}

OBSでWMV配信するだけなら使わない機能ですが便利なので説明します
nginxには配信機能があって複数のライブ配信サイトに同時配信出来ます
nginx.confの#push rtmp://127.0.0.1:1935/live/livestream;
のコメントアウトを外して※#pushをpushにする
rtmp://127.0.0.1:1935/live/livestreamの部分を
配信するサイトのrtmpサーバーのURLにすれば配信することが出来ます
pushは複数書くことが出来るので同時配信が出来ます

pushの詳しい書き方は下記のURLに書いています
http://seesaawiki.jp/jaijai/d/Nginx%A4%C7RTMP%C6%B1%BB%FE%C7%DB%BF%AE

nginxのrtmpモジュールの公式ドキュメント
https://github.com/arut/nginx-rtmp-module/wiki

設定が終わったらnginx.exeをダブルクリックで起動させます
コマンドプロンプトのウィンドウが現れてすぐに消えますがバックグラウンドで動作しています
※コマンドプロンプトで起動させるとコマンドプロンプトのウィンドウが残ります

終了するときはコマンドプロンプトからnginx -s stopで終了できます
※終了できない場合はタスクマネージャーから終了して下さい

OBSの放送設定の設定は
サーバー:rtmp://127.0.0.1:1935/live
プレイパス/ストリームキー:livestream

OBSのエンコードの設定は
サウンドのコーデックをMP3にして下さい
そうすればffmpegで-c:a copyでサウンドのエンコードは1回で済みます

OBSの詳細設定の設定は
x264の詳細設定でqp=0を指定して下さい
x264のプリセットはultrafastを指定して下さい
エンコードプロファイルはhighを指定して下さい
qp=0はロスレス(無劣化)でultrafastはCPU負荷を下げるためです
ロスレスはhighプロファイルしかサポートしてないみたいです
画質よりもCPU負荷を下げたい場合はQuick SyncかNvidia NVENCを使用して下さい

ffmpegのコマンドは

-v error -i rtmp://127.0.0.1:1935/live/livestream -c:v mpeg4 -tag:v M4S2 -flags:v +global_header -me_range 128 -b:v 1000k -g 300 -c:a copy -f asf_stream -map a -map v -

ffmpegを起動させるときによく失敗したのですが、
interleave on;をnginx.confに追加したら失敗することが無くなりました

配信手順は
nginxを起動 -> OBSで配信 -> S2MMSHでPULL接続ボタンを押す -> Peercastで配信

データの流れは
OBS -> nginx -> ffmpeg -> S2MMSH -> Peercast

OBSで配信する時の設定(H.264+AAC or MP3)

S2MMSHを使えばWMV(H264+AAC)配信が出来るんだけど
WMV(H264+AAC)配信をしてもWMPで再生が出来なかったんだよね

でもWMV(H264+AAC)配信がWMPで再生できるコーデックを見つけました。

WMV-Codec-Pack
https://github.com/shinji3/WMV-Codec-Pack/releases

インストールをすれば、WMPでWMV(H264+AAC)配信が視聴することが出来ます。

上の項目にある「OBSで配信する時の設定」にある「OBSの放送設定」まで済ませます。
エンコードの設定はデフォルトでも良いです。音声はAACでもMP3でも出来ます。

次はS2MMSHの設定です

ffmpegのコマンドは -v error -i rtmp://127.0.0.1:1935/live/livestream -c copy -bsf:v h264_mp4toannexb -f asf_stream -map a -map v -

次は配信手順の説明です

S2MMSHの配信手順は
nginxを起動 -> OBSで配信 -> S2MMSHでPULL接続ボタンを押す -> PeercastもしくはKagamin2で配信

データの流れは
OBS -> nginx -> ffmpeg -> S2MMSH -> PeercastもしくはKagamin2

おまけ ffmpegだけで配信をするコマンド例

ffmpegコマンド直接修正の配信方法その1は
-v error -rtbufsize 100M -f dshow -framerate ntsc -i video="動画デバイス":audio="音声デバイス" -c:v libx264 -tag:v H264 -flags:v -global_header -preset ultrafast -b:v 1000k -maxrate 1000k -bufsize 1000k -c:a aac -b:a 128k -f asf_stream -map a -map v -

DivXで配信する時の設定

DivXとMP3のWMV配信に成功しましたのでやり方をメモ
libxvidとmpeg4のWMV配信と同じようにWMPで見ることが出来ます

※必要なもの
Icecast
http://icecast.org/download/

NSV tools
http://www.scvi.net/soft/NSVtools_repack.exe

NSV DivX encoder - decoder plugin
http://www.scvi.net/soft/nsv_divx.zip

LAME MP3 Encoder
http://www.free-codecs.com/lame_encoder_download.htm

DivX codec pack
http://dist.divx.com/divx/codecpack/standalone/DivXInstaller.exe

VC++ .NET ランタイムインストーラー
http://www.vector.co.jp/soft/win95/util/se353331.html

SCFH DSF※SCFFだとNSV toolsで解像度を設定できないため
http://mosax.sakura.ne.jp/yp4g/fswiki.cgi?page=SCFH+DSF

Stirling
http://www.vector.co.jp/soft/win95/util/se079072.html

DivXとMP3のWMV配信のやり方

まずS2MMSHのwikiを見て初期設定を済ませておく
https://github.com/shinji3/S2MMSH/wiki/S2MMSH%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

VC++ .NET ランタイムインストーラーでMSVCR70.dllをインストール※nsv_coder_divx.dllで必要
DivX codec packをインストール※いらないソフトがバンドルされているのでチェックを外してインストール
Icecastをインストール
SCFH DSFをインストール
NSV toolsをインストール

LAME MP3 Encoderを解凍して中にあるlame_enc.dllをコピーして
NSVtoolsのフォルダの中にあるlame_enc.dllを最新のやつに置き換える

nsv_divx.zipを解凍してnsv_coder_divx.dllをStirlingで以下のように書き換える
※ffmpegはFourCCがXVIDしか対応してないのでバイナリエディタでFourCCをDIVXからXVIDに書き換えてる

FILENAME nsv_coder_divx.dll
0000094E: 44 58
0000094F: 49 56
00000950: 56 49
00000951: 58 44

書き換えたらNSVtoolsのフォルダの中にnsv_coder_divx.dllを入れる

NSVtoolsのフォルダの中で以下の3つのファイルを作成する

headers.txt

hackme
content-type:video/nsv
icy-metadata:1
icy-reset:1

※nsvconfig.bat

nsvenc /config

※nsvenc.bat

nsvenc /cfgcap cap:0,0 sc:127.0.0.1:8001:headers.txt

ffmpegのフォルダの中で以下のファイルを作成する

※ffmpeg.bat

ffmpeg -i http://127.0.0.1:8000/stream -c copy -f matroska tcp://127.0.0.1:6665
pause

配信のやり方

nsvconfig.batを実行して動画をdivxで音声はmp3になるように設定する
スタートメニューからRun Icecast(Console)を実行する
nsvenc.batを実行してエンコードを開始する
※nsvenc.batのcap:0,0の数字を変えることで配信するデバイスを変えることが出来ます
S2MMSHのPULL接続ボタンを押した後にffmpeg.batを実行します
あとは http://localhost:8080/ のURLを使ってPeerCastでWMV配信が出来ます

データの流れは
nsvenc -> icecast -> ffmpeg -> S2MMSH -> Peercast