03.ネットワークカメラからのビデオストリームを表示する
「ネットワークカメラのスナップショット画像を読み込み、表示する」ことを、連続で行うことで、映像として表示しても、たかだか 2 [FPS] ほどしかでず、映像は滑らではありませんでした。
滑らかな映像表示をするために、ネットワークカメラから送信されるビデオストリームを受信し、映像として表示します。
(使用ネットワークカメラは、9060AK)
使用開発環境はVisual C++ 2005です。
概要
9060AK のビデオストリームのアドレスは、
http://<ipaddress>/cgi-bin/Stream?Video&name=<user>&pass=<password>
<ipaddress>、<user>、<password>は、設定に合わせて入力します。
ビデオストリームの内容としては、JPEGデータが、順次送られてきます。JPEGデータのフォーマットは、イメージ開始が「FFD8」、イメージ終了が「FFD9」となっています。
ビデオストリーム中の「FFD8」から「FFD9」を切り取るとそれは、1枚のJPEGデータになります。
HTTP通信処理により、ビデオストリームの内容をBYTE配列として取得します。
取得したBYTE配列から、「FFD8」から「FFD9」を切り取り、CImageクラスのLoad関数を用いてCImageオブジェクト化します。
CImageオブジェクト化されたならば、CImageクラスのBitBiltを用いて画面に画像を表示します。
画像表示処理およびウインドウメッセージ処理を行うメインスレッドとは別に、HTTP通信処理からCImageオブジェクト化処理を行うビデオストリーム読み込みスレッドを作成して処理します。
プロジェクトの作成
「メニュー/新規作成/プロジェクト」を選択します。
プロジェクトの種類:Win32
テンプレート:Win32 プロジェクト
プロジェクト名:NetworkCameraStreamVideoViewer
場所:適当なフォルダを指定
ソリューションのディレクトリの作成:チェックしない
でOKボタンを押します。
次へボタンを押します。
アプリケーションの種類:Windows アプリケーション
空のプロジェクト:チェックしない
で完了ボタンを押します。
ビルドし、エラー、警告がないことを確認します。
スレッドコントロール列挙型の作成
メインスレッドとスナップショット画像読み込みスレッドとが協調して動作するために必要な、スレッドの状態を表す定数を列挙型として定義します。
「メニュー/プロジェクト/新しい項目の追加」でファイル名「ThreadControlStatus.h」のファイルを作成します。
ThreadControlStatus.h の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
スナップショット画像読み込みスレッド関数のヘッダーファイルの作成
「メニュー/プロジェクト/新しい項目の追加」でファイル名「ReadStreamVideoThread.h」のファイルを作成します。
ReadStreamVideoThread.h の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
スナップショット画像読み込みスレッド関数のソースファイルの作成
「メニュー/プロジェクト/新しい項目の追加」でファイル名「ReadStreamVideoThread.cpp」のファイルを作成します。
ReadStreamVideoThread.cpp の内容を以下のようにします。
ヘッダー部
バイト配列をIStreamオブジェクトに変換する関数
ストリーム読み込みループ関数
HTTPリクエスト関数
ビデオストリーム読み込みスレッドエントリ関数
ビルドし、エラー、警告がないことを確認します。
メインファイルのヘッダー部の編集
メインファイルのヘッダー部に、
・スナップショット画像読み込みスレッド関数のヘッダーファイルのインクルード
・FPS計測用のインクルードおよびライブラリリンクプラグマ
HTTP通信のパラメータ定数の定義
を追加します。
ビルドし、エラー、警告がないことを確認します。
ビデオストリーム読み込みスレッドの作成関数
メインファイルのWndProc関数の定義のすぐ上に、ビデオストリーム読み込みスレッドの作成関数の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
ウィンドウプロシージャー関数の 静的変数
ウィンドウプロシージャー関数に 静的変数を追加します。
ビルドし、エラー、警告がないことを確認します。
ウィンドウプロシージャー関数の WM_CREATE ケース
ウィンドウプロシージャー関数の WM_CREATE ケースを追加し、FPS計測用の分解能設定処理、CImageオブジェクトの作成処理、ビデオストリーム読み込みスレッドの作成関数呼び出し処理、を追加します。
ビルドし、エラー、警告がないことを確認します。
ウィンドウプロシージャー関数の WM_PAINT ケース
ウィンドウプロシージャー関数の WM_PAINT ケースに、描画処理、FPS計測処理、を追加します。
ビルドし、エラー、警告がないことを確認します。
ウィンドウプロシージャー関数の WM_DESTROY ケース
ウィンドウプロシージャー関数の WM_DESTROY ケースに、スナップショット画像読み込みスレッドの終了要請、終了待ち、クローズ、CImageオブジェクトの削除処理、を追加します。
ビルドし、エラー、警告がないことを確認します。
実行
表示は非常になめらかです。
FPSは、だいたい 25 [FPS] から 30 [FPS] ほどで、表示されました。
実行結果
ダウンロード
ソースファイルダウンロード (NetworkCameraStreamVideoViewer.zip)