かなり久々の投稿である(汗)
とあるJOBで、ネットワークカメラと組合せてWEBで画像などを見せる機器用のソフト(WEB)を作成していた。
カメラは直接グローバルなネットワークには接続されておらず、機器と直結。機器がカメラへのゲートウェイ的な役割をしている。
動画の形式としては、MPEG-4とMotion JPEGがあり、そのどちらも(IEで)表示させるためのActiveXが用意されていた。
最初は単純に apache の hpptd.conf に以下のように書いて、カメラへ接続させていた。
とりあえず、これで、MPEG-4については RTP over HTTP でならうまく表示されたのだが、Motion JPEG については画像が乱れて最後にはIEが(おそらくはMotionJPEG用のActiveXが)アプリケーションエラーを起こしてしまう。
設計を進めていくうち、カメラに対しての認証をトラップする必要が出てきて、PHPでゲートウェイ用スクリプト redir.php を作り、 httpd.conf も以下のように変えた。
ところが、今度はMPEG-4がうまく繋がらなくなり、Motion JPEGは表示されるようになった。
ちなみに httpd.conf を以下のように変えると
最初のとき同様、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 は以下のようになった。
これでとりあえず両方表示されるようになったけど、こんなんでいいのか?
とある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>
これでとりあえず両方表示されるようになったけど、こんなんでいいのか?
| ホーム |
SHOJI's Code



