・目的は、
ネットワークカメラBB-HCM311
http://panasonic.biz/netsys/netwkcam/lineup/hcm3 …
http://panasonic.biz/netsys/netwkcam/support/dow …
から流れてくるMotionJpegをパソコンのファイルに格納すると言うものです。
・現状としては、MotionJpegのJpegを切り出して保存することが出来ています。
・未解決の問題は、カメラから配信されているデータを100%取得できていないと言う所です。なぜならば、下のソースに示すように、Read()でバッファに格納しもう一度Read()を行うまでにf()を実行するために、f()の実行中にカメラからの配信が進んでしまうためです。
通常のファイルをサーバーから取得する場合は順次読み込めば問題ないと思うのですが、このようなストリーム配信の場合、何か参考になるものをご存じないですか?
よろしくお願いします。
開発環境 VC6.0, OS WinXP Pro
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>スレッド中でRead()だけを繰り返し処理した場合に、Read()が終わって次のRead()を呼ぶ間に必ず遅延が起こると思っているからです。
よーく考えてみてくださいね。
これがちゃんと出来なきゃ何にもできませんよねぇ(^^;;;
無限大のバッファなんて準備できないんですから。
>OSがWindowsXPですから、リアルタイム性は保証して無いだろうと思っているわけです。
うーん、ネットワーク、TCP/IPという時点で、リアルタイム性はそこまで意味は無いかと・・・
あくまでも受信データの取りこぼしが無ければいいのですから。十分なサイズのバッファと、単位時間に送られてくるデータ量以上の速さでデータをOSのバッファから自分の準備した領域に取り出せればいいんですよね。OS側のバッファがあふれる前に。
あと、
>あとマルチスレッドなら、取りこぼし防ぐために受信スレッドの方をプライオリティをあげておいたほうがいいでしょう。
確かに受信スレッドのプライオリティあげるべきですけど、それによってファイル書き込みが間に合わなくなると本末転倒ですのでバランスが肝心です。
いやー。 たのしいっすねここ。
まわりにこういうネタについてきてくれる人がいなくて(汗) 所詮私も含めて開発系には弱いということでしょうか・・・。
よーく考えてやってみます。
No.3
- 回答日時:
ダブルバッファでは足らないこともあるように思えますので、
さらに多くのバッファを用意して、
既に回答があるようにファイル書き込みを別スレッドで行うか、
非同期I/O(オーバーラップ I/O)を使うかでしょうね。
あとマルチスレッドなら、取りこぼし防ぐために受信スレッドの方をプライオリティをあげておいたほうがいいでしょう。
ありがとうございます。今のネットワーク環境の転送速度のせいか、取りこぼしを考慮して1秒間に8枚程度しかデータが流れてきていないようです。ということで、ダブルバッファリングを使ってもうちょっときっちりやってみます。
taka_tetsuさんterra5さん、また後日報告いたします。
No.2
- 回答日時:
>ダブルバッファリング+(スレッドで2回線つないで交互に取り込む)も考えましたが、どうも接続数を増やすとパフォーマンスが落ちてあまり速度が得られないようです。
なぜ接続数を増やすんですか?
Read()を連続しておこないたいんですよね?
別スレッド内で処理を行えばいいのはf()なんですから。
Read()をしてるメインスレッド内のループはバッファに書き込むだけ、f()の内部処理を行うスレッドのループは1つのバッファが満杯になったかチェックし、なってたらファイル格納を行うようにするのが普通かと。
ありがとうございます。
接続数を増やし2回線で冗長に取り込もうと思った理由について→スレッド中でRead()だけを繰り返し処理した場合に、Read()が終わって次のRead()を呼ぶ間に必ず遅延が起こると思っているからです。
OSがWindowsXPですから、リアルタイム性は保証して無いだろうと思っているわけです。
ちょっと詳しく実験してみます。
スレッドはあまり詳しくないので、まずf()で何もせずにRead()を繰り返してみました。その時つなぎ目が怪しかったので、私のプログラムにどこかにバグがあるかもしれません。少しお時間をください。
No.1
- 回答日時:
一般的にはダブルバッファリングでしょう。
バッファを2つ以上準備し、1つのバッファが満杯になったら別スレッドで保存を行い、データの受信は残りのバッファで行えばいいかと。
この回答への補足
ソースを補足します。
const int max_2len=一度に取得するデータの大きさ;
UINT nRead=0;
CInternetSession session;
CHttpConnection* pConnection
= session.GetHttpConnection( "IPアドレス" , ポート番号 , "ID" , "パスワード");
CHttpFile* pFile[2];
pFile[0]= pConnection->OpenRequest
( CHttpConnection::HTTP_VERB_GET
, "/nphMotionJpeg?Resolution=640x480&Quality=Motion HTTP/1.0\r\n" );
pFile[0]->SendRequest();
DWORD dwRet;
pFile[0]->QueryInfoStatusCode( dwRet );
if( dwRet == HTTP_STATUS_OK )
{
BYTE* m_cambuf[2];// カメラからのデータを格納
m_cambuf[0]=new BYTE[max_2len];
int gflag[2]={0};
while( 1 )
{
nRead = pFile[0]->Read( m_cambuf[0], max_2len );// カメラからデータ取得
f(); // カメラからのデータをファイルに保存等
}
delete[] m_buf;
delete[] m_cambuf[0];
}
delete pFile[0];
delete pConnection;
session.Close();
お返事ありがとうございます。
私もそう思いますが、カメラ(HTTPサーバー)より送られてくる信号は、ソース中のRead()を間髪いれずに実行し続けなければ連続データを取り込むことができないようなのです。なぜかというと、Webカメラの画像をリアルタイムで配信する特性上、受け取らなかったデータは捨てて、常に新しいデータを配信する必要性があるからです。
ダブルバッファリング+(スレッドで2回線つないで交互に取り込む)も考えましたが、どうも接続数を増やすとパフォーマンスが落ちてあまり速度が得られないようです。
むしろ、リングバッファのようなイメージで、途切れず取り込みながら保存していく方法って無いかと模索中です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
WriteFile()でのデータ送信がで...
-
winsockでソケット通信の開発を...
-
ソケット通信内 read関数について
-
SerialPortのDataReceivedイベ...
-
COMポートの同時オープン同時読...
-
popen実行時にバッファが空の場合
-
UDP処理のエラーについて
-
winsockの動作について。
-
RS-232Cでバイナリデータを受信...
-
recv関数の受信結果について
-
バイナリデータ受信時のデータ順
-
ネットワークカメラの動画保存...
-
シリアルポート通信
-
「スイッチングハブのバッファ...
-
シリアル通信の出力バッファと...
-
TCP/IP通信プログラミングにお...
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
-
メッセージボックスのボタン名変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
WriteFile()でのデータ送信がで...
-
winsockでソケット通信の開発を...
-
socket: recvはいつ,どれだけ...
-
シリアル通信の出力バッファと...
-
「スイッチングハブのバッファ...
-
SocketのSend関数でのCLOSEの検...
-
Connection reset by peer
-
WaitForMultipleObjects関数の...
-
RS232C通信(PC⇔PLC)
-
VB2005でWin32APIを用いてRS-23...
-
Linuxでのシリアル通信について...
-
UDP処理のエラーについて
-
シリアルポート通信
-
ソケット通信内 read関数について
-
TCP/IP通信プログラミングにお...
-
rs232cでの受信データ(mscomm)...
-
write関数でEAGAINのエラー発生...
-
シリアル通信ができません
-
【CAsyncSocket::OnReceive()呼...
おすすめ情報