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」などと保存できるカメラや ソフトウェアでは、閲覧するファイルを保存動作中のファイルとタイミングを一つだけずらす事で、良好な結果が得られる。

紹介するプログラムはサーバー側で使用するCGIだ。ソースをご覧になれば仕掛けは単純だが、 非常に有効なので是非お薦めしたい。

このプログラムは 株式会社ジーエヌエー 様が従来業務構築のWebページ用に使用なさっていた物を、今回インターネットWebカメラの 一層の発展を願って、ご厚意で公開して下さったCGIソースである。このように小技の効いたコンパクトなプログラムをフリーで 提供して下さるのは、インターネットの成り立ちを良くご理解なさっている会社だからでしょう。感謝!

仕掛けは、最新更新ファイルの番号を取得し、その一つ前の ファイル番号を指定してくれる。これにより、更新途中のファイルは閲覧側との間で排他ロックを発生することを防止出来る。 この方法は単純で動画でも有効だ。似たような仕掛けはデータベースのトランザクション処理や HDD録画ビデオ等でもオンデマンド再生で使用されている。


// Author: Douglas MacDougall <mac@gnajp.com>
// Copyright (c) 2001 GNA, Inc. Japan
// http://www.gnajp.com
// このプログラムをご使用になられる方はご一報下さい <info@gnajp.com>

// このプログラムは、コンパイルしてご使用ください
// UNIXでのコンパイル例: gcc -o getimg.cgi getimg.c

// 画像を置くディレクトリを、UNIXかWINDOWS別に指定する
// 例では、ベースディレクトリ下にある「camera_img」ディレクトリ

#ifdef WIN32  // RUNNING ON WINDOWS (IIS)
#define CAM_JPG_DIR            "..\\camera_img\\"
#else        // LINUX OR OTHER UNIX
#define CAM_JPG_DIR            "../camera_img/"
#endif

// 画像ファイル名(数字の前部分)を設定する
// 例では「cam」 これだと「cam01.jpg, cam02.jpg, cam03.jpg, ...」となります

#define CAM_JPG_PREFIX        "cam"

// 送信する(循環する)画像数を設定する
// 例では、「20」(常に20の画像が上記ディレクトリにある)

#define CAM_NUMBER_JPEGS    20

// 上記の画像数が「10〜99」の場合はこの行をコメント(//)しない
// 今回の例では、送信する画像数が20なのでコメントしていません
// IF CAM_NUMBER_JPEGS IS 10~99 UNCOMMENT NEXT LINE

#define    CAM_IMAGES_10

// 上記の画像数が「100〜999」の場合はこの行をコメント(//)しない
// 今回の例では、送信する画像数が20なのでコメントしてあります
// #define    CAM_IMAGES_100

/** DO NOT CHANGE ANYTHING BELOW THIS **/
/** ここから下は何も変更しないでください **/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>


#ifdef    CAM_IMAGES_10
#define CAM_ZEROS            "%02d"
#elif    CAM_IMAGES_100
#define CAM_ZEROS            "%03d"
#else
#define CAM_ZEROS            "%d"
#endif

int main(int argc, char *argv[])
{
    FILE *f;
    char buf[BUFSIZ];
char fname[FILENAME_MAX];
struct stat st;
register int i,last=1;
time_t    newest=0;
unsigned int bytes;

    for(i=1; i<=CAM_NUMBER_JPEGS; i++) {
        sprintf(fname,CAM_JPG_DIR CAM_JPG_PREFIX CAM_ZEROS ".jpg", i);
        if(stat(fname,&st))
        {
            fprintf(stderr,"Stat failed for %s: %s\n",fname,strerror(errno));
            continue;
        }
        if(newest<st.st_mtime)
        {
            newest=st.st_mtime;
            last=i;
        }
    }    
    if(last==1)
        last=CAM_NUMBER_JPEGS;
    else
        last--;

    sprintf(fname,CAM_JPG_DIR CAM_JPG_PREFIX CAM_ZEROS ".jpg", last);
    if((f=fopen(fname,"r"))==NULL)
    {
        fprintf(stderr,"Failed to open %s: %s\n",fname,strerror(errno));
        exit(1);
    }
    puts("Content-type: image/jpeg");
    puts("Expires: 0");
    puts("");
    while((bytes=fread(buf,1,BUFSIZ,f)))
    {
        fwrite(buf,1,bytes,stdout);
    }
    fclose(f);
}


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.