2012年9月28日金曜日

webmのライブストリーミング

chromeには、webmのライブストリーミングを再生する能力があります。
で、対応しているストリームを吐くことができるのは、stream-mというアプリケーションがあります。
以前紹介したことがありますね。

で、このwebmのライブストリーミングがどうなっているかというと
range指定でサイズが不明な状態でhttpのダウンロード要求が送られます。
するとサーバーからは、ある分と追記された分を順次送り届けます。
ブラウザ側では、うけとったデータをその都度再生可能な量たまったら順次再生しているという次第です。
新規アクセスがある場合に、アクセスがあった時刻以降の動画をうまく送信してやれば、webmのライブストリーミングがいっちょあがりという次第です。

いままでのhttp経由のストリーミングでは、それぞれの小さなメディアパケットがきまっていて、それを順次ダウンロードするという形だったので様相が違いますね。

なお、stream-mをつかってライブストリーミングを実行していると、socketの例外で接続が死ぬことがあります。この場合、webmのライブストリーミングでは、再接続の方法はないみたいです。このあたりはjavascriptでうまくプログラムを書いて調整しないといけないということかもしれませんね。

このhttpのストリーミングの方式、結構おもしろいですね。
長期間にわたって、任意のデータを送り続けることが可能というもので、ヘッダの送信は1回ですむので、httpTakStreamingもこの方式を取り入れて可能なかぎり1回のアクセスで送信をするみたいなことができたら、転送量の節約につかえるかもしれません。

もっとも、http転送のベーシックなものとはいえ、こんなダウンロードの仕方をflashで制御できるのかは調査してみないとわかりませんけど・・・

まとめ:
・webmのストリーミングはwebmの動画を転送量不明状態で送り続ける形で成立している。
・レジューム機能はついていない
(videoタグの動作を調査すればなにかしらあるかもしれない。)
(たぶんjavascriptで制御しろということなのだろう。)
・stream-mは長時間利用してるとsocketの例外がでて接続がきれちゃうことがある。

2012年9月22日土曜日

flazrで自作プログラムをとりあえず動作させる。

前回のflazrインストールの続きです。
こちらでは、自作プログラムをとりあえず動作させてエラーがでなくなることを目指します。(あたらしいプログラムは作りかけなので、まだきちんと動作しないですが、xuggleの動作をちょっとだけ実行するので、全体の組み合わせに問題ないか確認くらいにはなるかとおもいます。)

で、やったこと。
1:必要なライブラリをいれる。
jarファイルの追加です。
・xuggle-xuggler.jar(以前gitからコンパイルしたxuggleのやつです。コンパイルしたxuggleのrootから参照するとdist/lib/xuggle-xuggler.jarにあります。)
・streaming.jar(https://github.com/taktod/streaming/tree/streamingここのブランチから落としてきたデータからつくったjarファイル)

2:起動スクリプトをつくっておく。
内容はclient.shを参考に日本語を使えるようにしておくのと、設定を日本語にしておく。

java -Duser.language=ja -Duser.region=JP -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Tokyo -Xmx512m -cp conf:lib/xuggle-xuggler.jar:lib/streaming.jar:lib/commons-cli-1.2.jar:lib/commons-codec-1.2.jar:lib/commons-httpclient-3.1.jar:lib/flazr.jar:lib/jcl104-over-slf4j-1.4.2.jar:lib/log4j-1.2.14.jar:lib/netty-3.1.5.GA.jar:lib/slf4j-api-1.4.2.jar:lib/slf4j-log4j12-1.4.2.jar -Dflazr.log.suffix=-client com.ttProject.flazr.ex.RtmpClient $*

長いけど・・・
あとは動作にencode.xmlが必要なのでそれをコピーしておく。
flazr/confにでもいれておけばいいと思う。

で、起動
$ ./test.sh -host localhost -app live test test.flv

プログラム上の出力で出力用のストリームデータがきちんと表示されていれば、とりあえずOKとなります。
19:07:16,417 [New I/O client worker #1-1] INFO [ClientHandlerEx] - 視聴開始
19:07:16,485 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - tak
19:07:16,865 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - tak
19:07:16,866 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - tak
19:07:16,866 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - tak
19:07:16,866 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - tak
19:07:16,867 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - tak
19:07:16,867 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - hls
19:07:16,868 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - hls
19:07:16,868 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - hls
19:07:16,868 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - webm
19:07:16,869 [New I/O client worker #1-1] INFO [EncodeXmlAnalizer] - webm
19:07:16,870 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,870 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,871 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:h264
19:07:16,872 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:1024
19:07:16,872 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:768
19:07:16,872 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:1200000
19:07:16,872 [New I/O client worker #1-1] INFO [MediaManager] - videoGlobalQuality:0
19:07:16,873 [New I/O client worker #1-1] INFO [MediaManager] - properties
19:07:16,874 [New I/O client worker #1-1] INFO [MediaManager] - {qmax=30, directpred=1, g=25, qdiff=4, cqp=0, i_qfactor=0.71, partitions=-parti8x8+parti4x4+partp8x8+partp4x4-partb8x8, b_strategy=1, keyint_min=25, cmp=+chroma, qmin=10, async=4, wprefp=0, me_method=hex, level=30, qcomp=0.6, subq=5, me_range=16, bf=0, coder=0, sc_threshold=40}
19:07:16,874 [New I/O client worker #1-1] INFO [MediaManager] - flags
19:07:16,877 [New I/O client worker #1-1] INFO [MediaManager] - {FLAG2_FAST=true, FLAG_CLOSED_GOP=true, FLAG_LOOP_FILTER=true}
19:07:16,877 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,877 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,878 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:mp3
19:07:16,878 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,878 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,878 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,879 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,879 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,879 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:h264
19:07:16,879 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:800
19:07:16,880 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:600
19:07:16,880 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:1000000
19:07:16,880 [New I/O client worker #1-1] INFO [MediaManager] - videoGlobalQuality:0
19:07:16,880 [New I/O client worker #1-1] INFO [MediaManager] - properties
19:07:16,881 [New I/O client worker #1-1] INFO [MediaManager] - {qmax=30, directpred=1, g=25, qdiff=4, cqp=0, i_qfactor=0.71, partitions=-parti8x8+parti4x4+partp8x8+partp4x4-partb8x8, b_strategy=1, keyint_min=25, cmp=+chroma, qmin=10, async=4, wprefp=0, me_method=hex, level=30, qcomp=0.6, subq=5, me_range=16, bf=0, coder=0, sc_threshold=40}
19:07:16,881 [New I/O client worker #1-1] INFO [MediaManager] - flags
19:07:16,881 [New I/O client worker #1-1] INFO [MediaManager] - {FLAG2_FAST=true, FLAG_CLOSED_GOP=true, FLAG_LOOP_FILTER=true}
19:07:16,881 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,882 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,882 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:mp3
19:07:16,882 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,882 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,883 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,883 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,883 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,883 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:h264
19:07:16,884 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:640
19:07:16,884 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:480
19:07:16,884 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:800000
19:07:16,884 [New I/O client worker #1-1] INFO [MediaManager] - videoGlobalQuality:0
19:07:16,884 [New I/O client worker #1-1] INFO [MediaManager] - properties
19:07:16,885 [New I/O client worker #1-1] INFO [MediaManager] - {qmax=30, directpred=1, g=25, qdiff=4, cqp=0, i_qfactor=0.71, partitions=-parti8x8+parti4x4+partp8x8+partp4x4-partb8x8, b_strategy=1, keyint_min=25, cmp=+chroma, qmin=10, async=4, wprefp=0, me_method=hex, level=30, qcomp=0.6, subq=5, me_range=16, bf=0, coder=0, sc_threshold=40}
19:07:16,885 [New I/O client worker #1-1] INFO [MediaManager] - flags
19:07:16,885 [New I/O client worker #1-1] INFO [MediaManager] - {FLAG2_FAST=true, FLAG_CLOSED_GOP=true, FLAG_LOOP_FILTER=true}
19:07:16,886 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,886 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,886 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:mp3
19:07:16,886 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,887 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,887 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,887 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,887 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,888 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:h264
19:07:16,888 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:320
19:07:16,888 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:240
19:07:16,888 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:300000
19:07:16,889 [New I/O client worker #1-1] INFO [MediaManager] - videoGlobalQuality:0
19:07:16,889 [New I/O client worker #1-1] INFO [MediaManager] - properties
19:07:16,889 [New I/O client worker #1-1] INFO [MediaManager] - {qmax=30, directpred=1, g=25, qdiff=4, cqp=0, i_qfactor=0.71, partitions=-parti8x8+parti4x4+partp8x8+partp4x4-partb8x8, b_strategy=1, keyint_min=25, cmp=+chroma, qmin=10, async=4, wprefp=0, me_method=hex, level=30, qcomp=0.6, subq=5, me_range=16, bf=0, coder=0, sc_threshold=40}
19:07:16,890 [New I/O client worker #1-1] INFO [MediaManager] - flags
19:07:16,890 [New I/O client worker #1-1] INFO [MediaManager] - {FLAG2_FAST=true, FLAG_CLOSED_GOP=true, FLAG_LOOP_FILTER=true}
19:07:16,890 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,890 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,890 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:mp3
19:07:16,891 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,891 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,891 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,891 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,891 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,892 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:h264
19:07:16,893 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:160
19:07:16,893 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:120
19:07:16,893 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:64000
19:07:16,893 [New I/O client worker #1-1] INFO [MediaManager] - videoGlobalQuality:0
19:07:16,893 [New I/O client worker #1-1] INFO [MediaManager] - properties
19:07:16,898 [New I/O client worker #1-1] INFO [MediaManager] - {qmax=30, directpred=1, g=25, qdiff=4, cqp=0, i_qfactor=0.71, partitions=-parti8x8+parti4x4+partp8x8+partp4x4-partb8x8, b_strategy=1, keyint_min=25, cmp=+chroma, qmin=10, async=4, wprefp=0, me_method=hex, level=30, qcomp=0.6, subq=5, me_range=16, bf=0, coder=0, sc_threshold=40}
19:07:16,899 [New I/O client worker #1-1] INFO [MediaManager] - flags
19:07:16,899 [New I/O client worker #1-1] INFO [MediaManager] - {FLAG2_FAST=true, FLAG_CLOSED_GOP=true, FLAG_LOOP_FILTER=true}
19:07:16,899 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,899 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,899 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:mp3
19:07:16,899 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,900 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,900 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,900 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,900 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,900 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:h264
19:07:16,900 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:640
19:07:16,901 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:480
19:07:16,901 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:800000
19:07:16,901 [New I/O client worker #1-1] INFO [MediaManager] - videoGlobalQuality:0
19:07:16,901 [New I/O client worker #1-1] INFO [MediaManager] - properties
19:07:16,902 [New I/O client worker #1-1] INFO [MediaManager] - {qmax=30, directpred=1, g=25, qdiff=4, cqp=0, i_qfactor=0.71, partitions=-parti8x8+parti4x4+partp8x8+partp4x4-partb8x8, b_strategy=1, keyint_min=25, cmp=+chroma, qmin=10, async=4, wprefp=0, me_method=hex, level=30, qcomp=0.6, subq=5, me_range=16, bf=0, coder=0, sc_threshold=40}
19:07:16,902 [New I/O client worker #1-1] INFO [MediaManager] - flags
19:07:16,902 [New I/O client worker #1-1] INFO [MediaManager] - {FLAG2_FAST=true, FLAG_CLOSED_GOP=true, FLAG_LOOP_FILTER=true}
19:07:16,902 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,902 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,902 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:mp3
19:07:16,902 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,902 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,903 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,903 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,903 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,903 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:h264
19:07:16,903 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:320
19:07:16,903 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:240
19:07:16,903 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:300000
19:07:16,904 [New I/O client worker #1-1] INFO [MediaManager] - videoGlobalQuality:0
19:07:16,904 [New I/O client worker #1-1] INFO [MediaManager] - properties
19:07:16,904 [New I/O client worker #1-1] INFO [MediaManager] - {qmax=30, directpred=1, g=25, qdiff=4, cqp=0, i_qfactor=0.71, partitions=-parti8x8+parti4x4+partp8x8+partp4x4-partb8x8, b_strategy=1, keyint_min=25, cmp=+chroma, qmin=10, async=4, wprefp=0, me_method=hex, level=30, qcomp=0.6, subq=5, me_range=16, bf=0, coder=0, sc_threshold=40}
19:07:16,904 [New I/O client worker #1-1] INFO [MediaManager] - flags
19:07:16,904 [New I/O client worker #1-1] INFO [MediaManager] - {FLAG2_FAST=true, FLAG_CLOSED_GOP=true, FLAG_LOOP_FILTER=true}
19:07:16,905 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,905 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,905 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:mp3
19:07:16,905 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,905 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,905 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,905 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,905 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,906 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:h264
19:07:16,906 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:160
19:07:16,906 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:120
19:07:16,906 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:64000
19:07:16,906 [New I/O client worker #1-1] INFO [MediaManager] - videoGlobalQuality:0
19:07:16,906 [New I/O client worker #1-1] INFO [MediaManager] - properties
19:07:16,907 [New I/O client worker #1-1] INFO [MediaManager] - {qmax=30, directpred=1, g=25, qdiff=4, cqp=0, i_qfactor=0.71, partitions=-parti8x8+parti4x4+partp8x8+partp4x4-partb8x8, b_strategy=1, keyint_min=25, cmp=+chroma, qmin=10, async=4, wprefp=0, me_method=hex, level=30, qcomp=0.6, subq=5, me_range=16, bf=0, coder=0, sc_threshold=40}
19:07:16,907 [New I/O client worker #1-1] INFO [MediaManager] - flags
19:07:16,907 [New I/O client worker #1-1] INFO [MediaManager] - {FLAG2_FAST=true, FLAG_CLOSED_GOP=true, FLAG_LOOP_FILTER=true}
19:07:16,907 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,907 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,907 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:mp3
19:07:16,908 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,908 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,908 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,908 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,908 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,908 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:vp8
19:07:16,908 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:640
19:07:16,909 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:480
19:07:16,909 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:300000
19:07:16,909 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,909 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,909 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:vorbis
19:07:16,909 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,909 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,909 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,910 [New I/O client worker #1-1] INFO [MediaManager] -   video
19:07:16,910 [New I/O client worker #1-1] INFO [MediaManager] - hasVideo:true
19:07:16,910 [New I/O client worker #1-1] INFO [MediaManager] - videoCodec:vp8
19:07:16,910 [New I/O client worker #1-1] INFO [MediaManager] - videoWidth:320
19:07:16,910 [New I/O client worker #1-1] INFO [MediaManager] - videoHeight:240
19:07:16,910 [New I/O client worker #1-1] INFO [MediaManager] - videoBitRate:300000
19:07:16,910 [New I/O client worker #1-1] INFO [MediaManager] -   audio
19:07:16,911 [New I/O client worker #1-1] INFO [MediaManager] - hasAudio:true
19:07:16,911 [New I/O client worker #1-1] INFO [MediaManager] - audioCodec:vorbis
19:07:16,911 [New I/O client worker #1-1] INFO [MediaManager] - AudioBitRate:64000
19:07:16,911 [New I/O client worker #1-1] INFO [MediaManager] - audioChannels:2
19:07:16,911 [New I/O client worker #1-1] INFO [MediaManager] - audioSampleRate:44100
19:07:16,911 [New I/O client worker #1-1] INFO [ClientHandler] - onStatus code: NetStream.Play.Start

実際にダウンロードもコンバートもしてませんが、h.264 vp8 vorbis mp3きちんと認識できているみたいですね。

余談ですが、https://github.com/taktod/streaming/tree/mediastreaming
こちらのブランチのデータはxuggleのバージョンがあわずに動作しないみたいです。


さて、次はメインとなるコンバート部分の再構築ですね。
とりあえずの目標は、rtmp→flv mpegts webmの出力をつくるところかな。

flazrをインストールしました。

sakuraのvpsにflazrをインストールしました。

ちょっとややこしかったのでブログの記事に残しておきます。

javaはすでにjava7が導入済み。
flazrをダウンロードしてきます。最新は0.7 RC2みたいですね。
http://sourceforge.net/projects/flazr/files/latest/download?source=files
今回はローカルにもっていたのでそれをサーバーにアップロードしました。
flazr-0.7-RC2.zip
$ unzip flazr-0.7-RC2.zip
解凍したら
$ ln -s flazr-0.7-RC2/ flazr
コマンド入力が面倒なので、シンボリックリンクつけておきました。
$ cd flazr
なぜかclient.shに実行権限がついていなかったので付与しました。
$ chmod +x client.sh
ここで動作確認。
$ ./client.sh -host localhost -app live test test.flv

とりあえず、問題なく動作しました。
が、実は問題ありです。
というのも、このアーカイブ化されているプログラムとflazrのsvnにあがっているプログラムでは、アクセシビリティとかに少々違いがあります。(privateとかpublicとかのやつ。)
そして、僕のプログラムでは、svnにあがっている方をベースにしてつくっているのでそちらに合わせます。

以下の作業はローカルPCで実行しました。(iMac)
$ svn co https://flazr.svn.sourceforge.net/svnroot/flazr/trunk/flazr flazr
そのままeclispeでプロジェクトを開く
必要なライブラリをひもづけておきます。

commons-cli-1.2.jar
commons-codec-1.2.jar
commons-httpclient-3.1.jar
jcl104.over-slf4j-1.4.2.jar
log4j-1.2.14.jar
netty-3.1.5.GA.jar
slf4j-api-1.4.2.jar
slf4j-log4j12-1.4.2.jar

すべてflazrのアーカイブに入っているとおもいます。
一応欲しい部分があるか確認しておきます。
1つ目:com.flazr.rtmp.RtmpWriter.java
2つ目:com.flazr.rtmp.client.ClientOptions.javaにpublicなコンストラクタ(引数なし)があるかどうか?
この2点だけ確認し、問題なければ、jarファイルを作成します。
とりあえずflazr.jarにします。
testの方のプログラムがエラーでていますが、junitまわりの設定がないだけなので、放置します。

サーバー側にプログラムをアップロードしておきます。flazr/libの中におけばOK
以前のflazr-0.7-RC2.jarは消して、新しいプログラムをいれます。
flazr/client.shの中身を確認すると、jarファイルが前のまま指定されているので、flazr-0.7-RC2.jarをflazr.jarに変えてきちんと動作できるようにします。

$ ./client.sh -host localhost -app live test test.flv
先ほどのコマンドラインで問題なく動作することを確認しておきます。

ここまでで、とりいそぎのflazrのセットアップは完了です。

が、自作のプログラムを動作させるために、もうちょっと改造が必要になります。

2012年9月20日木曜日

openSourceなrtmfp再び

以前インストールしたCumulusサーバーですが、先日centos6にバージョンアップしたsakuraのvpsに再度いれてみました。

バージョンがあがってて、いれにくかったです。

では、やったこと。
まず、opensslとpocoが必要ってわかっていたので、いれました。

1:openssl
# yum install opensslとやったところ、既にインストール済みでした。
# yum install openssl-develとこちらはインストールされていませんでした。いれて問題ないので、いれました。

2:poco
wgetでダウンロード
$ wget http://jaist.dl.sourceforge.net/project/poco/sources/poco-1.4.4/poco-1.4.4.tar.gz
解凍
$ tar zxvf poco-1.4.4.tar.gz
$ cd poco-1.4.4
$ make
# make install
これで完了。

本題のCumulusを取得
$ git clone https://github.com/OpenRTMFP/Cumulus.git cumulus
先ほどいれたpocoが/usr/local/libにはいっているので環境変数にいれて利用できるようにしておく。
$ export LD_LIBRARY_PATH=/usr/local/lib
コンパイルする。
$ cd cumulus/CumulusLib
$ make
CumulusEdgeというのもあるので、一応コンパイルしておく。
$ cd ../CumulusEdge
$ make
本題のCumulusServerをコンパイルする。
$ cd ../CumulusServer
$ make
ここでエラーがでる。どうやら、luaというのが必要らしい。
luaそのものは一応はいっていたけど、ヘッダーファイルとかはなさそうだったのでdevelをいれることにする。
# yum install lua-devel
ここで/usr/includeにlua.hやlua.hppが入っていることを確認しました。
標準ライブラリにはいったので#include <lua.h>で対処できるようになりました。
Cumulusのプログラムの記述では、その部分が、相対パスになっているのでプログラムを書き換えます。
変更点はcumulus/CumulusServer/sources/Script.hとScript.cppです。
Script.h

extern "C" {
// #include "lua5.1/lua.h"
// #include "lua5.1/lauxlib.h"
#include <lua.h>
#include <lauxlib.h>
}

Script.cpp
extern "C" {
// #include "lua5.1/lualib.h"
#include <lualib.h>
}

あとはmakeしておわりだと思ったんですがまだ障害がありました。
/usr/bin/ld: cannot find -llua5.1
こんなエラーがでて、makeに失敗します。

サーバーの中身を確認してみたところ
luaはちゃんとはいっていました。makeFileの書き方かな・・・と思ったところビンゴでした。
#LIBS ?= -lCumulus -lPocoFoundation -lPocoXML -lPocoUtil -lPocoNet -lcrypto -lssl -llua5.1
LIBS ?= -lCumulus -lPocoFoundation -lPocoXML -lPocoUtil -lPocoNet -lcrypto -lssl -llua
ライブラリ指定の部分を-llua5.1から-lluaに変更して、再度makeを実行したところmake完了!

前に一度インストールしたソフトウェアなのに、面倒なことになりましたね。
これで起動して終わりといいたいところだったんですが、ポートをデフォルトのまま使うとFlashMediaServerとかち合ってしまうので修正しました。

cumulus/CumulusServer/にCumulusServer.iniというファイルをつくって
port記述等を適当にいれて全部完了。

これで、sakuraのvpsにオープンソースなrtmfpサーバーのcumulusが入りました。

2012年9月8日土曜日

sakuraのVPS再構築

まぁ、というわけでsakuraのVPSの再構築を実行。

・vpsのコンソール画面にいく。
https://secure.sakura.ad.jp/vpscontrol/main/
・OSの再インストールにいく。
パスワードいれて実行
・VPSホームでステータスが停止中になっているのでしばらく待つ。
・稼働中にかわったので、ターミナルではいってみる。
→なんかconnection refuseされた
・VPSホームで仮想サーバー操作→再起動を実行。
・ターミナルで再度入ってみる。
OK
# cat /etc/redhat-releaseで6.3 finalになっているのを確認。
ここまでで、OSの再インストール完了。

さて、サーバーの構築。
・とりあえず、httpとphpかな。
# yum install httpd
# yum install php php-mbstring php-mcrypt
これでapache2とphp5.3.3が入った。
よきかなよきかな。
→とりあえず、httpd.confを適当にいじる。

・jdkをいれる。
これがないと始まらんw
oracleのページからjdk-7u7-linux-x64のrpmをダウンロード
# rpm -ivh jdk-7u7-linux-x64.rpm

・いれたかったxuggleをいれる。
http://xuggle.com/xuggler/build
ここによると、次のものが必要。
 Sun java 1.6 or higher(1.7さっきいれた)
 Ant 1.7 or higher(apache-ant-1.8.4-bin.tar.gzをいれました。yumでいれるとopenjdk入るみたいなので、apacheのページから落としました。)
/usr/local/libに展開して、/usr/local/binにシンボリックリンクをおいときました。
 Perl 5.6 or higher(そもそも入ってた5.10.1)
 gcc/g++ 3.2 or higher(そもそも入ってた4.4.6)
 gmake 3.81 or higher(そもそも入ってた3.81)
 yasm 0.7 or higher(yumでいれた、1.2.0)
 pkg-config 0.26 or higher(はいってたけど0.23だ)

pkg-config 0.27.1をインストール
http://pkgconfig.freedesktop.org/releases/
ここからダウンロード
# tar zxvf pkg-config-0.27.1.tar.gz
で解凍
# cd pkg-config-0.27.1
# ./configure
ここでエラー発生。
pkg-config and glib-2.0 >= 2.16 not found・・・
えと・・・ないのはglibだよね?

というわけでglibをダウンロード
glib-2.32.4のインストール
glib-2.32.4.tar.xzを取得
# tar Jxvff glib-2.32.4.tar.xz
# cd glib-2.32.4
# ./configure
今度はzlibがないだとw
zlibそのものはあるけど、たぶんzlib-develがないんだなw

# yum install zlib-devel
さくっといれた。

glibに戻ります。
# ./configure
→package libffiがない・・・なにこれ?
# yum install libffi
→最新の3.0.5がはいっているとのこと・・・
まぁこれもdevelだろう・・・
# yum install libffi-devel

glibに再度戻ります。
# ./configure
とおった(^o^)
# make
# make install

よく見たらpkg-configにglibがなければinternalのをつかうというオプションがあった。
pkg-configにとりかかります。
# ./configure --with-internal-glib
# make
# make check
# make install

これでOKのはず。

gitにxuggleのソースがあるらしいのでダウンロードする。
# git clone git://github.com/xuggle/xuggle-xuggler.git xuggle

環境変数の設定が必要らしい。
# export XUGGLE_HOME=/usr/local/xuggler
# export PATH=$XUGGLE_HOME/bin:$PATH
# export LD_LIBRARY_PATH=$XUGGLE_HOME/lib:$LD_LIBRARY_PATH

antでコンパイル実行
# cd xuggle
# ant
ながかったけど、なんとかおわった。
# ant run-tests
# ant install
入った!

最後にFlashMediaServerをつっこむ。
# tar zxvf FlashMediaServer4.5_x64.tar.gz
# cd FMS_4_5_0_r297
# ./installFMS
ここでエラーが・・・
libcapがいるらしい。

調べてみたところcentOS6はアウトらしい。
http://myhour.orz.hm/archives/1044

cd_checkの行をかかれている通り追加して、シンボリックリンクを追加して・・・
# ./installFMS
とりあえず次のようにした。


----------- Install Action Summary -----------
Installation directory         = /home/fms

Adobe Flash Media Server Port        = 1935,xxxx
Adobe Flash Media Admin Server Port  = xxxx

Administrative username        = admin
Administrative password        = (suppressed)

service owner                  = fms

service user                   = fms
service group                  = fms

・serviceとして登録しなかったので、まだちょっとつまずきました。
/home/fms/serverのスクリプトも
cd_check "CentOS release 6" /etc/redhat-release centos-6-i686
を追加
libcapのシンボリックリンクを/home/fmsにも実行。
以上で/home/fms # ./server startで動作実行できました。

これでsakuraのvpsのOSをcentOS 6にバージョンアップし、javaとxuggleとfmsがはいりました。

長かった・・・

sakuraのvpsをあたらしくしようと思う。

いろいろ調査していたのですが、sakuraで利用していたVPSをいったんクリアして一新しておきたいとおもいます。

理由は
・webMのストリーミングを扱いたい
→けどxuggleの最新にしないとvp8は扱えないっぽい。
→ということはcentOSのバージョンをあげる必要がある。
→では、vpsを一新しよう

ということになったためです。
いままでつくったもののソースコードはバックアップしてるけど、環境はバックアップしていませんので、過去の記事の関連データはすべてなくなります。

なお、httpDynamicStreamingですが、どうやら、h264+aac or mp3しかコンテナのフォーマット的に利用できないらしいし、再生直前でMediaFrameworkのプログラムによるとflvの形に直してnetStreamのappendBytesにデータをわたしている模様です。
となってくると、nerrymoserやspeexが使えるflvの方に分がある気がするというのと、どうやらそれぞれの接続用にサーバー側でデータフォーマットをいじって送っている?疑惑があるのでなんかめんどくさそうという2点から、やる気がなえています。

いまはどちらかというとwebMのストリーミングに興味ありですね。

というわけで、言い訳っぽい投稿でした。
では、sakuraのvpsの再構築いってきます。