ListCam WHAT'S NEW | LABO | CAMERA | TECHNOLOGY | DOWNLOAD | LINK | PROFILE | BBS | GO TOP
ListCam logo Internet Web camera
fixed point observation image record system

最新より一つ古い画像から表示し、排他競合を回避する
インターネットWebカメラを構築する場合、カメラ側から保存最中に閲覧者側がブラウジングすると、タイミングが悪い場合には 排他ロックが掛り、カメラサーバーでエラーが発生したり、ブラウジングした画像が途切れる現象は既に こちらで解説 しているが、 PENTAX MN031 Webカメラなど、画像ファイル名を巡回連番「000.jpg、001.jpg、、、nnn.jpg」や特定の文字列ヘッダを付けて 保存できるカメラやソフトウェア「cam2001102322.jpg、cam2001102332.jpg、、、」などでは、閲覧するファイルを保存動作中の ファイルとタイミングを一つだけずらす事で、良好な結果が得られる。 紹介するプログラムはサーバー側で使用するCGIだ。ソースをご覧になれば仕掛けは単純だが、非常に有効なので是非お薦めしたい。

このプログラムは おおさむさんから頂いた、画像ファイルをファイル名順にソートして表示する CGIプログラムを、 PNETAX MN031AなどのWebカメラのファイル名規則に従い、ファイル名ではなくファイルの更新年月日(タイムスタンプ)を 元に、更新中の可能性が有る最新のファイルを避けて表示するように私が改竄したもの。 ファイルのタイムスタンプとソート処理の部分は新たに書き起こしたが、基本的なコード全体の流れはおおさむさんのCGIを ベースに使用させて頂いた。快諾して下さったおおさむさんに感謝したい。


#!/usr/bin/perl
# ↑使用可能なperlのディレクトリ
#
# 最新画像ではなく最新より一つ古い画像から表示して、デッドロックを回避するスクリプト
# ファイルモードは 755
# Ver 2001/11/11 by おおさむ (原形)
# Ver 2001/11/14 by muse    (大幅改竄)
#
$dir = '../live';                                        # このCGIファイルのあるディレクトリから見た画像ファイルの相対パス
$base='http://www.clavis.ne.jp/~listcam/live/';          # 表示対象の画像ファイルが置いてあるディレクトリのURL
$home='http://www.clavis.ne.jp/~listcam/index_j.ssi';    # 戻り先にするWebページのURL
$matsubi='ListCam Surveillance observation';             # 表示されたページの末尾(フッタ)に表示する文字列(なくても可)
$reload='3600';                                          # リロード(再読込)する間隔(秒数)デフォルト(無指定の場合)は、120秒
# 添え数字の前に有るファイル名ヘッダー文字列(添え数字は最大16桁) 例:pentax999.jpg
# 使える画像ファイル名は「文字列」+「インクリメント数字」+「.jpg」
$head_prefix='pentax';
#
#
opendir(DIR, "$dir");                                    # ディレクトリーファイルを開く
    while ($filename = readdir DIR) {                    # ディレクトリーファイルを最後まで読む
    if($filename=~/^$head_prefix[0-9]{1,16}\.jpg$/){     # ファイル名から指定パターンに該当するファイルを選別
            @stat = stat $dir.'/'.$filename;             # ファイルの諸元を読む
            $mtime = localtime($stat[9]);                # 諸元の中からタイムスタンプを読む
    push(@fnames,$mtime.$filename);                      # 配列にタイムスタンプ+ファイル名で収納する
    }
}
closedir(DIR);                                           # ディレクトリーファイルを閉じる
@fnames = sort {$b cmp $a} @fnames;                      # 配列をソートする
$cnt=@fnames+0;                                          # 配列の構成要素数
foreach $fname (@fnames){                                # 配列の要素を全て処理する
    $fname=substr $fname,(index $fname, $head_prefix);   # 指定パターンの開始位置からファイル名だけを切り出し再び配列へ収納
}
unless($reload){$reload=120;}                            # リロード変数のデフォルト処理
$reload2=$reload+1;
&saishin;
#
#
#

sub saishin{
print "Content-type: text/html\n\n";
print <<EOF;
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <HTML><HEAD>
    <BASE HREF="$base">
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=Shift_JIS">
    <META http-equiv="refresh" content="$reload">
    <TITLE>Image History</TITLE>
    </HEAD>
    <BODY TOPMARGIN="0" leftmargin=1 TEXT="#808080" BGCOLOR="#ffffff" link="#000080" vlink="#000080">
    <CENTER>
    <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="2" WIDTH="540" ALIGN="center">
      <TR>
        <TD colspan="2" align="center">
          <H3>Image History</H3>
        </TD>
      </TR><TR>
        <TD colspan="2" align="center">
          The latest file name is "$fnames[0]".<br>
          It may be during a renewal. <br>
          Display comes from a runner-up file. <br>
        </TD>
      </TR><TR align="center">
        <TD>Latest <br><IMG SRC="$fnames[1]" ALT="$fnames[1]" WIDTH="240" HEIGHT="180"></TD>
        <TD>"$fnames[2]"<br><IMG SRC="$fnames[2]" ALT="$fnames[2]" WIDTH="240" HEIGHT="180"></TD>
      </TR><TR align="center">
        <TD>"$fnames[3]"<br><IMG SRC="$fnames[3]" ALT="$fnames[3]" WIDTH="240" HEIGHT="180"></TD>
        <TD>"$fnames[4]"<br><IMG SRC="$fnames[4]" ALT="$fnames[4]" WIDTH="240" HEIGHT="180"></TD>
      </TR><TR align="center">
        <TD>"$fnames[5]"<br><IMG SRC="$fnames[5]" ALT="$fnames[5]" WIDTH="240" HEIGHT="180"></TD>
        <TD>"$fnames[6]"<br><IMG SRC="$fnames[6]" ALT="$fnames[6]" WIDTH="240" HEIGHT="180"></TD>
      </TR><TR align="center">
        <TD>"$fnames[7]"<br><IMG SRC="$fnames[7]" ALT="$fnames[7]" WIDTH="240" HEIGHT="180"></TD>
        <TD>"$fnames[8]"<br><IMG SRC="$fnames[8]" ALT="$fnames[8]" WIDTH="240" HEIGHT="180"></TD>
      </TR>
      <TR>
        <TD colspan="2" align="center">
          Image file number=$cnt<br>
          <hr size="1">
          <a href="$home">HOME</a><br>
          $matsubi
        </TD>
      </TR>
    </TABLE>
    </CENTER>
    </BODY></HTML>
EOF
}

__END__



Logo Copyright Muse Ishikawa, 1997, 1998, 1999, 2000,2001.
All images and references to CG software, etc contained within this site remain copyright to me.
Reproduction of any copyright material without written consent is strictly prohibited.
Please feel free to contact me, or link to my web page from your site.