stream.mを使ってwebmフォーマットのライブストリーミング 1

chakemiです。

本日は、オープンソースのstream.mを使ってwebmフォーマットのライブストリーミングを行なってみました。

stream.mはGPL V3のオープンソースで、HTML5のビデオタグとGoogleのwebmビデオフォーマットを使用して、ブラウザにライブストリーミング配信を可能とするソリューションだそうです。 実際には、webmフォーマットへの変換にはffmpegを使用して、stream.mへpostしstream.mによってストリーミング配信されているようです。

構築環境

  • WindowsXP SP3
  • vlc media player
  • FFmpeg git-N-29196-ge61b83d

stream.mはJAVAで書かれていて、WindowsでもLinuxでも動かせたので、FFmpegを一から準備するのが億劫で今回はWindowsで試してみました。 エンコードで肝心な部分はlibvpxを使用する点で、FFmpegと言えばこの方、あべちんさんのサイトよりバイナリを頂戴致しました。 お気に入りの動画を携帯で見よう

stream.mはこちらからダウンロードします。 http://code.google.com/p/stream-m/

zipを解凍しましたら、「server.conf.sample」をエディタで開き、配信に使用するポート、ストリーム名、パスワード、同時接続数を指定し、ファイル名を「server.conf」に変更して保存します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#
# Sample configuration file
# Empty lines and lines starting with # and ; are ignored.
# Format:  =
# Syntactic elements (words) can be separated by linear whitepace.
#

# server.port
# listening port
server.port = 8080

# stream.
# if defined then a stream can be started with this name
streams.first = true

# stream..password
# determines the password to accept the stream
streams.first.password = secret

# stream..limit
# maximum number of clients for this stream
streams.first.limit = 100

今回はデフォルトのまま使用しました。

準備が出来たら、コマンドプロンプトからサーバを起動。

1
2
C:\Documents and Settings\Administrator>java -cp lib/stream-m.jar StreamingServer server.conf
Stating server on port: 8080

次にライブエンコード部分ですが、FFmpegからwebmへエンコード出来る形式ならファイルでもデバイスでもソースに出来そうです。

せっかくのライブストリームなので、例にならってwebカムのソースを配信してみました。 まず、vlc Media Playerで音声のみストリーム変換を行ないます。

1
C:\Documents and Settings\Administrator>vlc.exe -I dummy dshow:// --sout "#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=44100} :http{mux=ts,dst=127.0.0.1:8081/}" --dshow-vdev=none --no-sout-rtp-sap --no-sout-standard-sap --sout-keep

次に、FFmpegでwebカムの映像とvlcからオーディオストリームをソースにして、webmへ変換→stream.mへpostします。

1
C:\Documents and Settings\Administrator>ffmpeg.exe -f vfwcap -r 16 -i 0 -i http://localhost:8081/ -g 52 -acodec libvorbis -ab 64k -vcodec libvpx -vb 448k -f matroska http://localhost:8080/publish/first?password=secret

FFmpegのエンコードが無事開始されたら、stream.m側で「Segment found」と表示されると思います。

これで配信が開始出来ました。

ブラウザから「http://localhost:8080/consume/first」へアクセスすると、下のように確認ができます。

実際にHTML5で記述する際は、下記のように書きます。

1
<video src="http://127.0.0.1:8080/consume/first" />

また、stream.mには管理コンソール機能があります。 ダウンロードしたパッケージ内にconsole.zipが同梱されているので解凍し、

ブラウザから「http://127.0.0.1:8080/console/client.html」へアクセスします。

設定したストリーム名とパスワードを入力し、ログインすると下のようにBandwidthや接続数が確認出来ます。

実際に配信してみましたが、バッファリング毎にノイズだけ発生しているような感じで、vlcのバージョンが古いのが原因かと思いましたが、突き詰められてません。

ビデオソースもデバイスから入力しようと思ったら、FFmpegではvfwしか選択肢無いし、、、 rtmpのストリームを食わせられるんじゃないかとも思うので、空いた時間に少し試してみたいと思います。

Comments