ようこそゲストさん

無能日記

メッセージ欄

分類 【R&D (streaming)】 で検索

一覧で表示する

2006/10/01(日) ストリーミングしてみよう(その2)

はてブ 2007/04/09 13:28 R&D (streaming)poti
先週何も書いてなかったが、ストリーミングの作業は地道に進行中
とりあえず、今はまってる問題を解決するには
1、MPEG2エンコード可能なカードを買ってきて別のマシンにつける。
2、MPEG4エンコードできるものにする。
3、マルチキャストルーティングができる無線ルータを買う。
4、そもそもマルチキャストをあきらめる。
ぐらいだとおもう。

で、これだけ読むと前回とのつながりが全くないので
今までやってきたことを書いておこう。

まず、ストリーミングしようという話をM君にしてみたところ
マルチキャストして見たら面白いのではという話になりました。
そこで、マルチキャストの勉強もかねて、サーバーからローカルな
ネットワークにマルチキャスト配信するように設定をしてみました。
使ったのはmroutdでDVMRPをもちいたマルチキャストルーティングを行う
これそのものに結構はまったorz。
<- 他localnet                             自分localnet        ADSLインターネット ->
  ----|無線AP1|^^^^^|無線AP2|^^^^|無線PCルータ|-------|ルータA|-----------
               wds                (FreeBSD)      |             |
                                             |自分PC|          -----|配信PC|
                                                               DMZ
実際はこんな感じのネットワークでごにょごにょやっています。
無線PCルータとルータAに対してmroutedの設定をいれてみました。
すると自分がマルチキャストを受信しているとigmp reportが投げられたあとに
ルータAの下のノードに対してpruneメッセージがルータAから発行されて
自分がマルチキャストを受けられなくなった。何故?
自分localネットワーク自体は非ブロードキャストにするつもりはないので。。。
mroutedの設定で、pruneをしないようにする設定があったので(推奨されないようですが)
設定してみると、受信できるようになった。
しかしこの方法が正しいのかどうかは正直不明です。。。

つぎに、マルチキャスト配信ができるようになったので、WEBでの配信の段階に移った。
ここで、考えないといけない点は、自分はADSLなためUP帯域がとても貧弱1Mbps程度
しかし、他のローカルネットは光なのでアップ帯域は豊富にある。
そこで、他のローカルネット上でマルチキャスト配信のデータを受信してそれをWEB配信にする

プログラムをざっくり書いて、テストをしてみた。
#マルチキャスト名プログラムなんて書いたことなかったけど、
#setsockoptするだけだったのね

すると、みれない。。。
そもそもVLCでしかみれないんだが、自分の部屋からは見れるのに
WEBからはみれない。。。
なんでだとおもい、いろいろつついているうちに、
ローカルネットワークへの疎通がなくなったので原因を調査してみると

無線PCルータのassosiationが切れていた。
無線AP2(buffalo)とつながらなくなっていた、しかもこの状態になると
無線AP2の再起動が必須になるようです。。。

なんだそれとおもいつつ調べてみると、
どうやら、高ビットレートのデータを流すとこれが起こるらしい。。えーーー!
iperfではかったところ2Mbps程度なら問題ないようだったが、通常の通信もあるため
マルチキャストの配信のデータソースのビットレートを1Mbpsにした。
しょぼーん

でも、問題はこれだけではなかった、ビットレートを下げWEBからたたいてみると
見れるようにはなった?というか途切れ途切れ途切れ。。。。
みれたもんじゃない
なんでだー
ということで原因を調べてみる。
自分ローカルネットから見ると普通に見れる
無線回りのような気がして、無線PCルータから他のlocalnetに対してpingを打ってみる
send(): no buffer space avaliavble。。。。
これか。。。
ここでおちてるのか
検証のため、他のローカルネットで通常のマルチキャストを拾ってみるとWEBから見れる
それとほぼ同じ。。。。
まじか。。。
FreeBSD+athrosめ!

困った。
とりあえず、athrosのドライバ周りを除いてみてrxbuf,txbufをあげてやるも変わらず
というか送信が追いついてないんだからあたりまえですよ。。。
ちなみにカーネルコンフィグレーションの設定は以下
options ATH_DEBUG
options ATH_RXBUF=80
options ATH_TXBUF=200

といことで、この問題を解決させる方法として
はじめにあげた4つが考えられる。

正直、本来の目標としてはWEBで配信することなので、マルチキャストじゃないんだけど。。。
4番かなー。。。とか
でもってADSLを光にする。
これですべて解決?

2006/09/18(月) DCT-MTVP1

はてブ 2007/04/09 13:18 R&D (streaming)poti
クロッサムと連携して、webからいろいろ遊んでやろうネタです。
ビデオの入出を取り込みたいのでキャプチャーカードが必要になってきました。
でもソフトウェアエンコードだとCPUに常に負荷がかかることになってしまうため、 よろしくない。
ということで、ハードウェアエンコードの物を探す。
でも、linuxで動くハードウェアエンコードのキャプチャーカードは、conexantのcx23416を使ったものだけのよう。
以前NECのチップをつんだキャプチャカードを買ってきたのだが使えない。orz
探してみると、GV-MVP/RX2系が使えそうだがどれもすでに生産終了。
秋葉にいってみるもどこにもなさげ、。。。
あきらめきれず、ivtv 0.7のドライバを落として、ChangeLogを見てみると
DCT-MTVP1をサポートしたとかいてるので、ぐぐってみると売ってそうな気配
もう一度秋葉に行ってみるとTWOTOPにハケーン!(大陸志向。。。)
買って帰って早速試す。

まず、ivtvのドライバをReadme.installに沿ってインストール
途中、なにやら
5. unload any old drivers
と書いてるのがよくわからない(wikiのhowtoに詳細が書いてた)が無視してインスト
modprobe ivtv すると
ivtv: Unknown symbol tveeprom_read
ivtv: Unknown symbol tveeprom_hauppauge_analog
となる

どうやらカーネルで関数が定義されていない模様。。。

ivtvドライバとかぶらない上のエラーが出た関数を使ってるドライバを
make menuconfigで追加してやることに
grep -r tveeprom_ drivers/*
するとbt848のドライバが使っているようだったので、
とりあえず、いいやということで入れてみる

再度modprobe ivtv すると
upd64031a, upd64083, saa7115モジュールがロードできねーよといわれた

(ログなくなちゃった。。。)

make menuconfigで上の3つのドライバモジュールを選択

再度modprobe ivtvすると
なんかきちんと読み込まれているみたい。
でもあきらかに、違うデバイスとして認識されてる予感。。。
ぐぐってみると
ivtvをmodprobeする際のパラメータで変更できるみたい。
ivtvのソースコードから
grep -ir cowboy * とやって番号を探してみると
18っぽいぞ!

というわけで、以下の設定を書いて
/etc/module.conf
alias char-major-81 videodev
alias char-major-81-0 ivtv
options ivtv ntsc=j cardtype=18

再度modprobe ivtv
キターーー!
ivtv:  ==================== START INIT IVTV ====================
ivtv:  version 0.7.0 (tagged release) loading
ivtv:  Linux version: 2.6.17.13 SMP mod_unload PENTIUM4 REGPARM 4KSTACKS gcc-3.4
ivtv:  In case of problems please include the debug info between
ivtv:  the START INIT IVTV and END INIT IVTV lines, along with
ivtv:  any module options, when mailing the ivtv-users mailinglist.
ivtv0: User specified Digital Cowboy DCT-MTVP1 card (detected cx23416 based chip)
ACPI: PCI Interrupt 0000:02:00.0[A] -> GSI 18 (level, low) -> IRQ 16
tuner 1-0060: All bytes are equal. It is not a TEA5767
tuner 1-0060: chip found @ 0xc0 (ivtv i2c driver #0)
tda9887 1-0043: chip found @ 0x86 (ivtv i2c driver #0)
saa7115 1-0021: saa7115 found @ 0x42 (ivtv i2c driver #0)
upd64031a 1-0012: chip found @ 0x24 (ivtv i2c driver #0)
upd64083 1-005c: chip found @ 0xb8 (ivtv i2c driver #0)
ivtv0: loaded v4l-cx2341x-enc.fw firmware (262144 bytes)
ivtv0: Encoder revision: 0x02050032
ivtv0: Allocate DMA encoder MPEG stream: 128 x 32768 buffers (4096KB total)
ivtv0: Allocate DMA encoder YUV stream: 194 x 10800 buffers (2048KB total)
ivtv0: Allocate DMA encoder VBI stream: 120 x 17472 buffers (2048KB total)
ivtv0: Allocate DMA encoder PCM audio stream: 455 x 4608 buffers (2048KB total)
tuner 1-0060: type set to 53 (Philips FQ1286)
ivtv0: Initialized Digital Cowboy DCT-MTVP1, card #0
ivtv:  ====================  END INIT IVTV  ====================
テレビのチャンネルは
ivtv-tune -t japan-bcast -c
でかえれるようだ

ライン入力もしらべなきゃ
調べてみたところ、驚愕の事実発見
外部入力がtunerの映像しかでない?!
これじゃぜんぜんだめじゃんーー

次はこの問題を解決させよう。

2006/09/18(月) ストリーミングしてみよう

はてブ 2007/04/09 13:11 R&D (streaming)poti
前回コンポジットの入力はうけつけられなかったのだけれども、
コンポジットとS−端子を変換するアダプタを買ってきてS端子の入力を
試してみたところ、うまく映りました。(近場で売ってなかったので秋葉まで行くことに)

とりあえず、ストリーミングをしようと思い、探してみると
nc (netcat)
vlc (video lan)
helix server+producer
でできそうでした。
最終的にはmedia plyerやrealone serverでうごかせるところにもって行きたいと思ってはみる。
とりあえずは、vlcで映像がきちんと見れることを確認しようとおもい。
HTTPでアクセスできるようにしてみました。

さくっと、無事視聴できました。
次は、他のでも再生できる簡単な方法でもさがして、webからみれるようにしよう。

/dev/video0の出力がすでにエンコードされているので、
helix producerでエンコードするの無駄なきがするんだけど、
helix serverだけでどうにかできるのだろうか?。。。