SHOJI's Code
 仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2017.10<<123456789101112131415161718192021222324252627282930>>2017.12
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

かなり久々の投稿である(汗)

とあるJOBで、ネットワークカメラと組合せてWEBで画像などを見せる機器用のソフト(WEB)を作成していた。
カメラは直接グローバルなネットワークには接続されておらず、機器と直結。機器がカメラへのゲートウェイ的な役割をしている。
動画の形式としては、MPEG-4とMotion JPEGがあり、そのどちらも(IEで)表示させるためのActiveXが用意されていた。

最初は単純に apache の hpptd.conf に以下のように書いて、カメラへ接続させていた。
<VirtualHost 0.0.0.0:8080>
ProxyPass / http://(カメラのアドレス)/
ProxyPassReverse / http://(カメラのアドレス)/
</VirtualHost 0.0.0.0:8080>


とりあえず、これで、MPEG-4については RTP over HTTP でならうまく表示されたのだが、Motion JPEG については画像が乱れて最後にはIEが(おそらくはMotionJPEG用のActiveXが)アプリケーションエラーを起こしてしまう。

設計を進めていくうち、カメラに対しての認証をトラップする必要が出てきて、PHPでゲートウェイ用スクリプト redir.php を作り、 httpd.conf も以下のように変えた。
<VirtualHost 0.0.0.0:8080>
RewriteEngine On
RewriteRule ^/(.*)$ http://(自分のアドレス)/redir.php/$1 [L]
</VirtualHost 0.0.0.0:8080>


ところが、今度はMPEG-4がうまく繋がらなくなり、Motion JPEGは表示されるようになった。

ちなみに httpd.conf を以下のように変えると
<VirtualHost 0.0.0.0:8080>
ProxyPass / http://(自分のアドレス)/redir.php/
ProxyPassReverse / http://(自分のアドレス)/redir.php/$1
</VirtualHost 0.0.0.0:8080>


最初のとき同様、MPEG-4は表示され、Motion JPEGは表示されない。

で、それぞれ、キャプチャーして、うまくいくときとうまくいかないときを比べてみると、問題はActiveXからのHTTPのリクエストにあった。

MPEG-4の場合、ActiveXがRTP over HTTPでRTPを取得するときに、どうやらカメラから決まったヘッダしか付かないことを前提にプログラムが組んであるようで、Apacheが勝手につけるDateヘッダやServerヘッダが付いているとうまく動かない。これらのヘッダは Header unset Server などとしてもうまく削除できないのだが、ProxyPass でリダイレクトさせたときはリダイレクト先の応答をそのまま返すからなのか、それらのヘッダは付かずうまく動く。

Motion JPEGの場合、ActiveXからのリクエストに従ってカメラにアクセスするのだが、カメラからの応答にはContent-Lengthがなく、Content-Typeがmultipart/x-mixed-replaceであるため、接続が切れるまで、応答は終わらないのだが、それをクライアントに返すときにApacheが勝手にCHUNKにしてしまっていた。CHUNKでの応答でなく生だと思っているActiveXはそのままJPEGとして表示し、画像が乱れるということらしい。
でも、ActiveXからのリクエストにはHTTP/1.1となっているからCHUNKにも対応しなきゃいけないはずなんだけど、いまいち作りが中途半端。

結局最終的な httpd.conf は以下のようになった。
ServerTokens Prod
<VirtualHost 0.0.0.0:8080>
BrowserMatch ^$ downgrade-1.0
ProxyPass / http://127.0.0.1/fme100p/root/redir.php/
ProxyPassReverse / http://127.0.0.1/fme100p/root/redir.php/
Header unset Server
Header unset Date
</VirtualHost>


これでとりあえず両方表示されるようになったけど、こんなんでいいのか?

テーマ:PHP - ジャンル:コンピュータ
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。