- PR -

[C#] MotionJPEGの高速処理

1
投稿者投稿内容
たかおファン
会議室デビュー日: 2006/11/21
投稿数: 2
お住まい・勤務地: 神奈川
投稿日時: 2006-11-21 18:56
お初にお目にかかります。
ふつつか者ですが、どうぞよろしくお願いします。

私は現在ネットワークカメラから受信するMotionJPEG(単にJPEG画像がHTTPのサーバプッシュで連続的に送られるだけ)
をリアルタイムに表示やその他の処理をするといった内容の開発をしています。
ここで受信するJPEG画像データは最大で毎秒30枚となるのですが、
いかんせんデコード処理が重くてかなりマシンパワーを食うので困っています。
高速処理という点で標準のGDI+は頼りないのでSusieプラグインを使うという手も試してみましたが、やはり重いです…

そこで無理な質問かもしれませんが、
他にC#の上で高速なJPEGデコードを実現できる方法はないでしょうか?

あるいはデコードだけに限らず、
MotionJPEGを高速に描画することができる手段があればご教授お願いいたします。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-11-21 19:20
引用:

たかおファンさんの書き込み (2006-11-21 18:56) より:
私は現在ネットワークカメラから受信するMotionJPEG(単にJPEG画像がHTTPのサーバプッシュで連続的に送られるだけ)
をリアルタイムに表示やその他の処理をするといった内容の開発をしています。
ここで受信するJPEG画像データは最大で毎秒30枚となるのですが、


どうせ人間には知覚出来ないので、無意味に高速処理を求めない。
毎秒20枚もあれば十分。

引用:

いかんせんデコード処理が重くてかなりマシンパワーを食うので困っています。


Intelのデコードプログラムが割りと高速で定評がある。
出来たら画像のデコードと表示は別スレッドで行い、それぞれが非同期に動けるような工夫をすること。ちらつき無く表示するにはリフレッシュレートとの同期が必須になるのだけど、表示の同期待ちしている間もバックグラウンドでデコード処理をおこなったほうが良い。

引用:

高速処理という点で標準のGDI+は頼りないのでSusieプラグインを使うという手も試してみましたが、やはり重いです…


リフレッシュレートとの同期が必要な時点で、普通に使う描画命令では無理がある。描画にはDirectXを使う。

引用:

MotionJPEGを高速に描画することができる手段があればご教授お願いいたします。


Video for Windowsあたりを使ってMotionJPEGのストリームとして流し込むとかすれば、自前でMotionJPEGのエンジンを作らなくてすむはずだけど。それでも30fpsは厳しいだろう。
たかおファン
会議室デビュー日: 2006/11/21
投稿数: 2
お住まい・勤務地: 神奈川
投稿日時: 2006-11-22 11:00
甕星さん>
早速のご返答感謝します。

今回は単にJPEGの高速デコードについてお聞きしましたが、
実際には最大5箇所からのMotionJPEGを受信し、
リアルタイムにデコード&描画し、受信データのうち1箇所分をLANを介して別のPCへ送信する
という無理難題というか実験的な内容となっています…

引用:
どうせ人間には知覚出来ないので、無意味に高速処理を求めない。
毎秒20枚もあれば十分。


そうなんですよね、ごもっともです。
ただ上司がVGAサイズで30fpsくらい欲しいと要求してきたので
「そりゃ無理です」とはいったもののできる限りを尽くしたいと思った所存です。
自分としては現状のPen2.4GHzマシン15fps弱でも出せたら上出来なのではと思っています。

引用:
Intelのデコードプログラムが割りと高速で定評がある。
出来たら画像のデコードと表示は別スレッドで行い、それぞれが非同期に動けるような工夫をすること。ちらつき無く表示するにはリフレッシュレートとの同期が必須になるのだけど、表示の同期待ちしている間もバックグラウンドでデコード処理をおこなったほうが良い。


Intelのライブラリはいつの間にか統合されて有料になっているんですよね。
なんだか開発費はあまり出せないようなのでフリーの素材で頑張っています。
今のところ受信、デコード&表示はそれぞれ別スレッドで動いていますが、
デコードと表示の部分も分離した方がいいのですね。
なぜか今のところ表示でちらつきは発生していません。
フレームスキップを利かせているのですが、それとも関係なさそう…

引用:
リフレッシュレートとの同期が必要な時点で、普通に使う描画命令では無理がある。描画にはDirectXを使う。


DirectXの使用は検討していますが、なにぶん今まで触ったことがなかったものでまだ良く分かりません。
なにか参考になるサイト、書籍ありましたら教えていただけませんか?

引用:
Video for Windowsあたりを使ってMotionJPEGのストリームとして流し込むとかすれば、自前でMotionJPEGのエンジンを作らなくてすむはずだけど。それでも30fpsは厳しいだろう。


やはりVFWの使用が適当であるとお考えですか、なるほど。
一応カメラの標準的な使い方としてはWEBブラウザを使ってサーバプッシュ画像を表示するのですが、
これがなんとも激重でして、15fpsでもCPUパワーを60%以上消費してしまいます。
ブラウザで見られるってのが長所であるのは分かるけど、こんなに重いのに専用のクライアントソフトが無いのが疑問。
1

スキルアップ/キャリアアップ(JOB@IT)