ããã§ããããªç£èŠã«åŸäºããŸããããããã倧åãªTKã§ããã
ãã®èšäºãšçµéšããçãŸãããã®ã«ã€ããŠèª¬æããŸãã
æŽå²çã«ãç§ã¯
ç§ã®è·æ¥ãšããŠã¯ãè€æ°ã®ãµãŒãã¹æè¡éšéãèšç«ããŸãããã人ã ã¯æè²ã¬ãã«ïŒããã°ã©ããŒïŒã«ã¯éããŸããã§ããã ã ãããããç§ã¯åžžã«ç®ã®åã«ããŸããITã«é¢ãããã¹ãŠã®è³ªåã¯ç§ã®ããã§ãã ç§ã¯é·å¹Žã«ããã£ãŠITã®åéã§åœŒãïŒå人ïŒã«çžè«ããŠããŸãããã·ã¹ãã ããã³ããžãã¹ã¢ããªã¹ãã§ãããç¡æã§ã:)ã ãããã¯ã«ç§»ããŸãã
人ã ãç§ã®ãšããã«æ¥ãŠããããªç£èŠã欲ããããšèšã£ããã ç§ã¯å¿ããã£ãã®ã§ããã®æ¹åã«çºå±ããæ欲ã¯ãããŸããã§ããã 圌ãã¯å¥ã®ãå°é家ããèŠã€ãã6ãæéç·Žç¿ããŸããããäœãçµãããŸããã§ããã ç·ã¯ãçŸããããšå€æãããã¹ãŠãæã£ãŠæ©èœãããšããããŸãŒã³ãã€ã³ããšåãã®åã«ã€ããŠæããŸããã 6ãæéãåäžã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãªããåäžã®ã¯ã©ã€ã¢ã³ãã§ããããŸããã
圌ãã¯ç²ããŠããŸããç§ã®ãšããã«æ¥ãŠãã ããã ç§ã¯ãã§ã«10幎é圌ããšä»äºãããŠããã®ã§ãããäžåºŠåéºã«åå ããŠã¿ãŸãããã ç³ãåºã¯ããã€ãã®ããã«ããã®ç¬åµæ§ãšæ¬æ°ãã«æéãåããŸããã
-ã¯ã©ãŠããããªç£èŠãè¡ãããã æè³0ãæ©åšãè³Œå ¥ããŸããéçº0ã§ã¯ããéã50/50ã«åå²ããŸãã
ãšããã§ãé¢ä¿è ã®æ°ã«å¿ããŠããéã¯åžžã«50/50ããŸãã¯30/30/30ã§ããã
ãªãã ãšæããŸããã çµéšã¯äžèŠã§ã¯ãããŸããã ïŒãã ããããªããå¹ åºãåéã®å°é家ã§ããããã®ãããã¡ã€ã«ã幎ã«äžåºŠå€æŽããå Žåã¯åœ¹ã«ç«ã¡ãŸãã:)
ã¢ã€ãã¢ã¯ãã¯ã©ãŠããããªç£èŠã欲ããããšè¡šæãããŠããŸãã
äœãã販売ããã人ã¯ãåžžã«äœãã販売ããŸãã
ãã®ãäœãããæãã€ããŠã¢ã¬ã³ãžããããšã¯æ®ã£ãŠããŸãã
ã¯ã©ãŠãã ãé0ãè² è·ã倧ããã ãããã£ãŠããããã®åé¡ã解決ãããããã¿ã€ããäœæããå¿ èŠããããŸãã
äžèŠãOpenstackã«èœã¡ãŸããã ãã®å Žã§èšç®èœåãæ¡åŒµããããšã¯å¯èœã§ãããå®è¡ããã«ã¯ããã€ãã®ãã·ã³ãå¿ èŠã§ãã ããŸããŸãªããŒãžã§ã³ã®Openstackã§éãã ãããããé©åãªãœãªã¥ãŒã·ã§ã³ãæ¢ãå¿ èŠããããŸããã ç§ã®ç®ã¯Proxmoxã«èœã¡ãŸããã
æåã¯ç§ãã¡ã®ããŒãºã«åã£ãçŽ æŽããããœãªã¥ãŒã·ã§ã³ã ãããŠããããã®VMã¯åžžã«ããŒããŠã§ã¢ãŸãã¯å¥ã®ã¯ã©ãŠãã«ç§»æ€ã§ããŸãã
é銬ã®è³Œå ¥ã«åå ããæéã¯ãããŸããã§ããããç§ã®éŠ¬è»éŠ¬ãè³Œå ¥ãããåã«ïŒIntel Core i5-3570K @ 3.40GHz
ãããŠããã®ã¢ã€ãã³ã§ã¯ãã¯ã©ãŠãç£èŠãè¡ãå¿ èŠããããŸããã äžæ¡çãªç¶æ³:)ããããç§ãã¡ã¯ãããããŸããã
ããçš®ã®è²©å£²ã·ã¹ãã ãæãã€ããŸãã ã»ãã¥ãªãã£ã·ã¹ãã ããã³æ°éèŠåäŒç€Ÿãšé¢ä¿ã®ãããã¹ãŠã®çš®é¡ã®ã¢ã©ãŒããšé£æºãããããªç£èŠïŒå·ã¬ãã«ã§ã¯æãéããããŸãïŒã
æªæ¥ã«ãã ãã£ãŠããã«
1ïŒé£ç¶é²ç»
2ïŒã¢ãŒã·ã§ã³é²ç»
3ïŒã¿ã€ã ã©ãã¹é²ç»
4ïŒSMSéç¥
5ïŒåããæ€åºããããšãã®ã»ãã¥ãªãã£ã»ã³ã¿ãŒããã®åŒã³åºãã ãªãã¬ãŒã¿ãŒã¯ã¬ã³ãŒãã確èªãããã§ãããåŒã³åºããã¯ã©ã€ã¢ã³ãã«éç¥ããŸãã
ã¢ã¹ã¯ã¯ã®æ°éèŠåäŒç€Ÿã¯å¹Žã æ¡å€§ããŸãã
äžè¬çãªã·ã¹ãã ã¯æ¬¡ã®ããã«ãªããŸããã

ã«ã¡ã©ã¯ããããããŒããŠã§ã¢ã«æèŒãããã»ãã¥ãªãã£ã«çµã³ä»ããããŸãã ãã®ããŒããŠã§ã¢ã¯ãOpenWrtäžã®ãœãããŠã§ã¢ã¯ã©ã€ã¢ã³ããŸãã¯ããŒããŠã§ã¢ãœãªã¥ãŒã·ã§ã³ã®ããããã§ãã RPCã«ã¯ãçç±ããããŸãã ã¢ã€ãã¢ã¯2ã€ã®ã¢ãžã¥ãŒã«ãäœæããããšã§ããã 1ã€ã¯å®å šãªã³ã³ãœãŒã«ã§ãã ããã«ãããã³ã³ãœãŒã«ãå¶åŸ¡ãã2çªç®ã®ã°ã©ãã£ãã¯ã¢ãžã¥ãŒã«ã§ããéã«åã蟌ãããšãã§ããŸãã ããã«ãããã©ãããã§ãéçãå¶åŸ¡ã§ããŸãã ãŠãŒã¶ãŒã®ã³ã³ãã¥ãŒã¿ãŒããµããŒãã³ã³ãã¥ãŒã¿ãŒãªã©ãã ãŸããã«ã¡ã©ããã®ã¹ããªãŒã ãšéæ¢ãã¬ãŒã ãæšæºåããã«ã¯ãæåã®ã¢ãžã¥ãŒã«ãå¿ èŠã§ãã ç§ãã¡ããã§ã«èµ°ã£ããããªè ºã 圌ãã¯ãããã¿ã€ãã«é©ããŠãããçµéšããã£ãã ãã®éçã®ããžãã¯ããµãŒããŒã«è»¢éããããšã誰ãçŠæ¢ããŠããŸããã
çŸåšãh264åç©åããã£ã¹ã¯ã«é§åããæ€åºåšãšåæ§ã®ãããããweb +ã«åãä»ããæ¹æ³ã«ã€ããŠã¿ã³ããªã³ãšãã³ã¹ããããããã¯ãã¹ãŠi5ã«é©åããŸãã
ZoneMinderã¯åªããã·ã¹ãã ãããããŸãããã4å°ã®ã«ã¡ã©ãè¿œå ããåŸã4ã€ã®ã·ã¹ãã ã³ã¢ãã¹ãŠã70ïŒ ä»¥äžããŒãããŸããã 圌ãã¯ããã«åœŒãæšãŠãŸããã
ãããã¿ã€ãã®ããã«ã圌ãã¯VLCãåããŸããã ããã¯é·ãééçºãããŠããŠãããå€ãã®äººã«ãã£ãŠå®è¡ãããããã€ãã®ãããžã§ã¯ãã§äœåºŠã䜿çšããŠããŸãã
解決ããå¿ èŠãããå°ãªããšã2ã€ã®ã¿ã¹ã¯ããããŸã
1ïŒãããã¯ãŒã¯ãžã®çºè¡
2ïŒã¹ããªãŒã ãèšé²ãã
ã«ã¡ã©ã®åç©åã¯ãrtspã¹ããªãŒã ãšhttpã¹ããªãŒã ã§æ§æãããŠããŸãã VLCã¯ãã¹ãŠãå®è¡ã§ããŸãã VLMã䜿çšããããšã«ããŸããã tlenetãšhttpãå¶åŸ¡ããŸãã
ãªã³ã¯ã¯å ¥åãåºåã§ãã£ãŒãããŸã
"#{$transcode}std{access=http{mime={$this->mime}},mux=ts{use-key-frames},dst=*:{$this->getPort()}/{$this->path}}";
çä¿¡URLããHTTPã¹ããªãŒã ãååŸããŸãã
HTTPã¯ç§ãã¡ã«ãšã£ãŠãã䟿å©ã§ããïŒ hginxã§é§åããè² è·ãåæ£ããæå·åã§ããŸãã httpsã«éä¿¡ããŸãã
1ã¯ã©ã€ã¢ã³ã-1 vlcããã»ã¹ã
éçºè ã¯1人ããããªããããPHPã§ãããã¿ã€ããã¹ã¯ãªããåããããšã«ããŸãããæéãçããè³éã0ã§ãã
éå§ã³ãã³ãã ïŒå®æããã³ãŒããæäŸããŸããå¿ èŠã«å¿ããŠã³ãã³ããåãåºãããšã¯é£ãããããŸããïŒ
$vlc_ifs = "-I http --http-host=0.0.0.0 --http-port {$this->getHttpPort()} -I telnet --telnet-port {$this->getTelnetPort()} --telnet-password ".TLPWD; if(VLC_USE_LOG) $vlc_logs = "--extraintf=http:logger --file-logging --log-verbose 0 --logfile {$this->getLogFile()}"; else $vlc_logs = '--extraintf=http'; //$vlc_shell = VLCBIN." --rtsp-tcp --ffmpeg-hw --http-reconnect --http-continuous --sout-keep ".VLCD." $vlc_ifs --repeat --loop --network-caching ".VLCNETCACHE." --sout-mux-caching ".VLCSOUTCACHE." $vlc_vlm --pidfile {$this->getPidFile()} $vlc_logs \n"; $vlc_shell = VLCBIN." --rtsp-tcp ".VLCD." $vlc_ifs --repeat --loop --live-caching ".VLC_LIVE_CACHE." --network-caching ".VLCNETCACHE." --sout-mux-caching ".VLCSOUTCACHE." --sout-ts-dts-delay 400 $vlc_vlm --pidfile {$this->getPidFile()} $vlc_logs "; if($this->isValgrind()){ $vlc_shell = "valgrind -v --trace-children=yes --log-file={$this->getValgrindFile()} --error-limit=no --leak-check=full $vlc_shell"; }
ãã§ã«ã©ã€ãã¹ããªãŒã ãããã®ã§ãããããæžã蟌ãããšãã§ããŸãã
return "#std{access=file{append},mux=ts{use-key-frames},dst=$filePath.avi}";
VLMã¯ç°¡åã«äœæãããŸã
ã«ã¡ã©ã§3ã€ã®ã¹ããªãŒã ãäœæã§ããŸã
1ïŒã©ã€ãã¹ããªãŒã
2ïŒé²ç»ã¹ããªãŒã
3ïŒã¢ãŒã·ã§ã³ã¹ããªãŒã
$this->execute("new {$this->cam} broadcast enabled loop");
ãã¬ã€ã§ããããããã
$command = "control {$this->cam} $command";
ããšãã°ã10ç§ããšã«åæ¢ãã$ filePathãå€æŽããŠãåçããã ãã§ååã§ãã
ãšã³ããªãå«ãäžé£ã®ãã¡ã€ã«ãååŸããŸãã ã¢ãŒã·ã§ã³åçããã³åæ¢çšã
VLCã¯ããwith usããšãwith themãã®äž¡æ¹ã§å®è¡ããããšãã§ããŸãã
åãã®åé¡ã
ã¢ãŒã·ã§ã³ããŒã«ããããŸãã 圌ã¯Jpegã«ãã£ãŠåããèšç®ããŸãã ã«ã¡ã©ã¯Jpegã§éæ¢ç»åãæäŸããŸãã å¿ èŠãªãã®ãåŸãããåºåã§ãããªãŒãºãã¬ãŒã ã䜿çšããŠããã£ãŒãã移åããŸãã
ç§ãã¡ã«ã¯åç©åããããããããã·ã¹ãã ãäœãå¿ èŠããããŸãã
ãã㧠ãã¹ãŠãã·ã¹ãã ãšåŒã³ãå°æ¥çã«ã·ã¹ãã èŠçŽ ãæ倱ãªãã«äº€æã§ããããã«ãççµåã·ã¹ãã ãäœæããããšããŸãã
ã«ã¡ã©ãVlcãã¢ãŒã·ã§ã³ããã£ã¹ã¯ãžã®èšé²ããªã³ã©ã€ã³æŸéããããŸãã
Vlcãšã¢ãŒã·ã§ã³ã¯UNIXããã»ã¹ã§ãã ããããæªéãšåŒã³ãŸãã ïŒæœè±¡ã¯ã©ââã¹ããŒã¢ã³ïŒ
ã«ã¡ã©ããã®2ã€ã®ã¹ããªãŒã ãå¿ èŠã§ããããšãããããŸããã jpegããã³h264ã
ã·ã¹ãã ã«ãšã³ãã£ãã£ãäœæãã
user-dvr-cam-stream
ãŠãŒã¶ãŒ-ãŠãŒã¶ãŒ
ããŒã¢ã³ãšããŒã¢ã³ã«é¢é£ä»ããããã«ã¡ã©ãæ åœããdvrã·ã¹ãã
cam-ã«ã¡ã©ãšã³ãã£ãã£ãç©ççãªã«ã¡ã©èšå®ãšä»®æ³ã¹ããªãŒã ãä¿åããŸã
ã¹ããªãŒã -ã¹ããªãŒã ãä»»æã®æœè±¡ã¹ããªãŒã ã
Straemã¯ãã·ã¹ãã ã®ãæŽæ°ãã®ç¬éã«éå§ãåæ¢ãäžå®å®ãããã«ãããããšãã§ãããããã®ã€ãã³ãã§ã圌èªèº«ãäœããã¹ããã決å®ããŸãã
æœè±¡å®£èšã®ã¿ã§æ§æãããã·ã¹ãã å ±éãšã³ãã£ãã£ãååŸããŸãã
ã·ã¹ãã ãæ§ç¯ããããã®äžè¬çãªå·¥å ŽãååŸããŸãã
abstract class AbstractFactory { private static $instance = null; /** * @var array */ private $commands; /** * @return AbstractFactory */ public static function getInstance(){ if(self::$instance == null) self::$instance = new static; return self::$instance; } /** * permanentCommand * @param ICommand $command */ protected function addPermanentCommand(ICommand $command){ $this->commands[] = $command; } /** * @param ISystem $system */ protected function addCommands(ISystem $system){ foreach($this->commands as $command) $system->addPermanentCommand($command); } //todo buildSystem method /** * @return ISystem */ public function createSystem(){ return System::getInstance(); } /** * @return array of Users */ public function createUsers(){ return array(AbstractFactory::getInstance()->createUser(1)); } /** * @param int $id * @return IUser */ public function createUser($id) { return new User($id); } /** * @param IUser $user * @return IDVR */ public function createDvr(IUser $user) { $dvr = new Dvr($user); $cams = $this->createCams($dvr); //new+add foreach($cams as $cam){ /** @var $cam Cam */ $dvr->addCam($cam); } $daemons = $this->createDaemons($dvr); foreach($daemons as $daemon){ /** @var $daemon Daemon */ $dvr->addDaemon($daemon); } return $dvr; } /** * @param DVR $dvr * @return array of Cams */ abstract protected function createCams(DVR $dvr); /** * @param DVR $dvr * @return array of Daemons */ abstract protected function createDaemons(DVR $dvr); /** * @param IDVR $dvr * @param ICamSettings $cs * @return ICam */ public function createCam(IDVR $dvr, ICamSettings $cs) { return new Cam($dvr, $cs); } /** * @param $from * @param $to * @return MoveToNfsCommand */ public function createMoveToNfsCommand($from, $to){ return new MoveToNfsCommand($from, $to); } /** * @param ICam $cam * @return ICamStream */ abstract public function createStream(ICam $cam); }
ããã«ãããã«ã¡ã©ã®ã¹ããªãŒã ãå®å šã«ãã³ã°ãããŠãæãã€ããããšãåŠçããããšãã§ããŸãã ãããŠãå°ãªããšãäœããã®åœ¢ã§åç©åãå¶åŸ¡ããããšãã§ããŸãã ïŒãããã¿ã€ãã¯åœŒã§ãïŒ
äž»å補åã¯VLCã§ãããããã·ã¹ãã çšã«VLCãã«ã¹ã¿ãã€ãºãå§ããŸãã
æœè±¡ã¯ã©ã¹VlcStreamãäœæããŠStreamãæ¡åŒµããã¯ã©ã¹LiveVlcStreamã§VlcStreamãæ¡åŒµããŸãã
VlcStreamã¯Vlmãšãåéãã§ãïŒ$ this-> vlm = new HttpVlmïŒ$ this-> getVlcNameïŒïŒã 'localhost'ãHTSTART + $ this-> cam-> getDVRïŒïŒ-> getIDïŒïŒïŒ;ïŒ
éå§ãåæ¢ãåŠçã§ããŸã
次ãž
æœè±¡ã¯ã©ã¹VlcReStreamã¯VlcStreamãæ¡åŒµããŸã
VlcReStream-LiveVlcStreamãå ¥åãšããŠåãåããŸã
ã¯ã©ã¹RecVlcStreamã¯VlcReStreamãæ¡åŒµããŸã-ãããªãRamããNfsã«ã移åãããŸã
Vlcã¯Daemonã¯ã©ã¹ãæ¡åŒµãããšã³ãã£ãã£DVRã«å«ãŸããŸãã
DVRã¯éå§ãšåæ¢ãåŠçããŸã
public function start() { $this->log(__FUNCTION__); $this->startDaemons(); $this->startCams(); }
ã«ã¡ã©ãèµ·åãããšãã«ã¡ã©ã«é¢é£ä»ããããŠãããã¹ãŠã®ã¹ããªãŒã ãéå§ãããŸãã
ã€ãŸã UNIXããã»ã¹Vlcãã¢ãŒã·ã§ã³ãHTTPãä»ããVLMãå®è¡ããŸãã
åæ¢ã¯éã®é åºã§çºçããŸãã
VLCã®ä»£ããã«ã奜ããªãã®ã䜿çšã§ããŸãã
ããããã¯ã©ãŠãã«ã¯ãããªç£èŠããããŸãã ãããã£ãŠãSQLããã³åæ§ã®ã¹ãã¬ãŒãžã·ã¹ãã ãå¿ èŠã§ãã
åäœäžã®ã·ã¹ãã ã¯æ¬¡ã®ãšããã§ãã
å·¥å Ž
<?php /** * Created by PhpStorm. * User: calc * Date: 16.06.14 * Time: 10:56 */ namespace system2; /** * Class BBFactory * @package system2 */ class BBFactory extends AbstractFactory { /** * @return ISystem */ public function createSystem() { $system = parent::createSystem(); $e = new BBLogMotionEvent(Motion::EVENT_MOTION_START); $system->addEventHandler($e); $e = new BBLogMotionEvent(Motion::EVENT_MOTION_STOP); $system->addEventHandler($e); $e = new BBLogMotionEvent(Motion::EVENT_MOTION_DETECTED); $system->addEventHandler($e); $e = new BBLogMotionEvent(Motion::EVENT_CAMERA_LOSS); $system->addEventHandler($e); $recMotionEvent = new BBRecMotionEvent(Motion::EVENT_MOTION_START); $system->addEventHandler($recMotionEvent); $recMotionEvent = new BBRecMotionEvent(Motion::EVENT_MOTION_STOP); $system->addEventHandler($recMotionEvent); // 30 update //$system->addPermanentCommand(new RotateRecCommand()); $this->addPermanentCommand(new RotateRecCommand()); $this->addCommands($system); return $system; } /** * @param DVR $dvr * @return array of Daemons */ protected function createDaemons(DVR $dvr) { $vlc = new Vlc($dvr); $this->addPermanentCommand(new BBDaemonWatchdog($vlc)); // , mtn $cams = $dvr->getCamIDs(); $ids = array(); foreach($cams as $id){ $cam = $dvr->getCam($id); $cs = $cam->getSettings(); /** @var $cs BBCamSettings */ if($cs->mtn) $ids[] = $id; } $motion = new Motion($dvr, $ids); if(count($cams)) $this->addPermanentCommand(new BBDaemonWatchdog($motion)); return array($vlc, $motion); } /** * @return array */ public function createUsers() { $users = array(); $db = \Database::getInstance(); $q = "select id from users where banned=0"; $r = $db->query($q); while(($row = $r->fetch_row())){ try{ $users[] = AbstractFactory::getInstance()->createUser($row[0]); } catch(\Exception $e){ Log::getInstance()->put($e->getCode().' '.$e->getMessage()."\n".$e->getTraceAsString()."\n", __CLASS__, Log::ERROR); } } return $users; } /** * @param DVR $dvr * @return array */ protected function createCams(DVR $dvr){ $db = \Database::getInstance(); $q = mysql::getQuery(mysql::CAM_SETTINGS, array('{dvr_id}' => $dvr->getID())); $r = $db->query($q); $cams = array(); while(($row = $r->fetch_object('system2\BBCamSettings')) != null){ /** @var BBCamSettings $row */ //$dvr->addCam(new BBCam($this, $row)); $cam = $this->createCam($dvr, $row); $cams[] = $cam; // Motion , $timelapse = new BBArchiveTimelapseCommand($cam); $this->addPermanentCommand($timelapse); } return $cams; } /** * @param ICam $cam * @return ICamStream */ public function createStream(ICam $cam) { $stream = new Streams($cam); $cs = $cam->getSettings(); /** @var $cs BBCamSettings */ $motion = new MotionStream($cam, $cs); $motion->setEnabled($cs->live && $cs->mtn); $stream->addStream($motion); $live = new BBLiveStream($cam); $live->setTestInputCommand(new BBTestInputFailSaveCommand($cam, $live)); $live->setEnabled($cs->live); $stream->addStream($live); $hls = new HLSVlcStream($cam, $live); $hls->setEnabled($cs->live); $stream->addStream($hls); //$this->streams[] = new FlvVlcReStream($this, $live); //nginx rtmp stream //$this->streams[] = new RtmpVlcReStream($this, $live); $rec = new BBRecStream($cam, $live); $rec->setEnabled($cs->live && $cs->rec); $rec->setTestInputCommand(new BBTestInputFailSaveCommand($cam, $rec)); $stream->addStream($rec); $mtn = new BBRecStream($cam, $live, TIME_LOCK_RECORD, Path::MOTION); $mtn->setEnabled($cs->live && $cs->mtn && BBRecMotionEvent::isMotion($cam)); $mtn->setTestInputCommand(new BBTestInputFailSaveCommand($cam, $mtn)); $stream->addStream($mtn, Path::MOTION); //motion flv stream $flv = new UrlFlvVlcStream($cam, "http://localhost:".(MOTION_STREAM_PORT + $cam->getID())); $flv->setEnabled($cs->live); $stream->addStream($flv); return $stream; } }
createSystemãèå³ã®ããã€ãã³ããè¿œå ããŸãã Systemã¯ã©ã¹ãåŠçãæ åœããŸãã
EVENT_MOTION_STARTãEVENT_MOTION_STOPãEVENT_MOTION_DETECTEDãEVENT_CAMERA_LOSS
ããã¯moton configããåŒã³åºããããã®ã§ã
糞
# Command to be executed when an event starts. (default: none) # An event starts at first motion detected after a period of no motion defined by event_gap on_event_start php ~/dvr/bin/system2/main.php event {user_id} {cam_id} motion_start 0 "%Y-%m-%d %T" # Command to be executed when an event ends after a period of no motion # (default: none). The period of no motion is defined by option event_gap. on_event_end php ~/dvr/bin/system2/main.php event {user_id} {cam_id} motion_stop 0 "%Y-%m-%d %T" # Command to be executed when a picture (.ppm|.jpg) is saved (default: none) # To give the filename as an argument to a command append it with %f ; on_picture_save value # Command to be executed when a motion frame is detected (default: none) ; on_motion_detected php ~/dvr/bin/system2/main.php event {user_id} {cam_id} motion_detected 0 "%Y-%m-%d %T" # Command to be executed when motion in a predefined area is detected # Check option 'area_detect'. (default: none) ; on_area_detected value # Command to be executed when a movie file (.mpg|.avi) is created. (default: none) # To give the filename as an argument to a command append it with %f ; on_movie_start value # Command to be executed when a movie file (.mpg|.avi) is closed. (default: none) # To give the filename as an argument to a command append it with %f ; on_movie_end value # Command to be executed when a camera can't be opened or if it is lost # NOTE: There is situations when motion don't detect a lost camera! # It depends on the driver, some drivers dosn't detect a lost camera at all # Some hangs the motion thread. Some even hangs the PC! (default: none) on_camera_lost php ~/dvr/bin/system2/main.php event {user_id} {cam_id} motion_camera_lost 0 "%Y-%m-%d %T"
main.phpã€ãã³ãuid cid event_nameãã©ã¡ãŒã¿ãŒãžã®åŒã³åºãããããŸã
ã·ã¹ãã ã¯ã©ã¹ããããåŠçããŸãã
10åããšã«cronã§ïŒä»»æã®æ°ã®é±å±±ã§1åïŒãã·ã¹ãã æŽæ°ãåŒã³åºãããŸãã
æŽæ°ã«ãããšããã¹ãŠã®ãµãã·ã¹ãã ã®æŽæ°ãš
$this->executeCommands(); $this->executePermanentCommands();
ã³ãã³ãã¯ãµãã·ã¹ãã ãã¹ããŒãããã®ã§ãããRotateRecCommandãªã©ã®å®æ°ã³ãã³ãã¯å€ãã¬ã³ãŒããåé€ãã圹å²ãæãããŸãã
ããŒã¢ã³ãäœæãããšãã«ãããšãã°BBDaemonWatchdogãªã©ã®è¿œå æ©èœããããããŒã¢ã³ãèœã¡ããã©ãããç£èŠããŸãã
ãŠãŒã¶ãŒã¯ãã§ã«ããŒã¿ããŒã¹ããäœæãããŠããŸãã
次ã«ãããŒã¿ããŒã¹ããã«ã¡ã©ã æ°žç¶çãªã¿ã€ã ã©ãã¹ã³ãã³ããè¿œå ãããŸãã ããã¯ãTIME_LOCK_TIMELAPSEïŒ8æéïŒã§1åã ãæ©èœããMysqlã§æ å ±ããããããŸã
æåŸã®-æãèå³æ·±ãã®ã¯ã¹ããªãŒã ã§ãã
ã¹ããªãŒã ã¢ãŒã·ã§ã³ãã©ã€ããhlsïŒHTTPã©ã€ãã¹ããªãŒã ïŒãrecãmtnãflvãäœæãããŸãã
ã©ã€ã-éåžžã®http
recãmtn-èšé²çšã®ã¹ããªãŒã
ãã©ãŠã¶ãžã®åºåçšã®hlsããã³flvã
GithubïŒ github.com/Calc86/dvr/tree/master/bin/system2
ããžãã¯ããããŸãã ãç©çåŠããå¿ èŠã§ãã
å€ãã®ã«ã¡ã©ãå€ãã®ã¹ã¬ããã1ã€ã®ããã»ããµããããŸãã
ãã¹ãŠã®èšé²ã¯ramdiskã§è¡ãããhlsã¯ramdiskã§è¡ãããvlcæ§æã¯ãã©ã³ã¹ã³ãŒãã£ã³ã°ãè¡ãããªãããã«è¡ãããŸãã ã¯ãªãŒã³ã¹ããªãŒã ãåé€ãããã¯ãªãŒã³ã¹ããªãŒã ãä¿æãããŸããã RAMãã£ã¹ã¯ããã¹ãã¬ãŒãžïŒãããã¿ã€ãã¯NFSïŒãžã®ç§»è¡ã¯ãffmpegã³ãŒããã¯ã³ããŒãééããŸãã
ããã«ãããhtml5ãšã³ããªãä»ãããã©ãŠã¶ã§ã®åºåãèš±å¯ãããŸããã
3çš®é¡ã®ã¬ã³ãŒãã 10åããšã®ã¹ã©ã€ã¹ã8æéã§ã®ã¢ãŒã·ã§ã³é²ç»ããã³ã¿ã€ã ã©ãã¹é²ç»ã«ããå®å šé²ç»ã1ç§ããã3åã衚瀺ãããŸãã
ã·ã¹ãã ã®æ§ç¯ã¯ãã³ãŒãã®å€æŽãæå°éã«æããªãããå°ççã«ãDVRïŒèšé²æ©ïŒã®ç¬ç«ããé 眮ãèšç»ããŸããã
å®è£ ããããã®
1ïŒå¿ èŠãªãã¹ãŠã®ã¬ã³ãŒã
2ïŒwebãhlsãflashãhtml5ã®ã¬ã³ãŒããžã®åºåãåç©åã³ãŒããã¯h264ã¯h264ã«äœãã§ããã®ã§ãWebã«è¡ããŸã§ãmjpegã«åºåïŒå€ãããã¢ã§ãªã³ã©ã€ã³ãããªãèŠèŽã§ããŸãïŒ
3ïŒhttpsãnginxã»ãã¥ãªãã£URLãªã©ã䜿çšãããã®æããããã®ã®Webã€ã³ã¿ãŒãã§ã€ã¹ã
Onvifçµç±ã§ã«ã¡ã©ãè¿œå ããã®ããããŸãã
ãããžã§ã¯ããåæ¢ããçç±ã
1ïŒå£²ãè¡ãã®æªãïŒè²©å£²å¡ãšè²©å£²ã·ã¹ãã ã®äžè¶³ïŒ
2ïŒè³éäžè¶³ïŒå°ãªããšããã®ãããªã·ã¹ãã ã«ã¯ç®¡çè ãå¿ èŠã§ãïŒ
3ïŒç©ºãæéã®äžè¶³
4ïŒå®å šã«ç¡æã®éçº
5ïŒãã¹ãçšã«ã«ã¡ã©ãè³Œå ¥ããããªã
6ïŒå°åºè©è°äŒãšã®åæã¯ãããŸãããããã¹ãã«ç¡æã®ã«ã¡ã©ãèšçœ®ããæåã¯ãããŸããã
7ïŒåžžçšè·ãå€æŽããŸãã ãããè¡ãæ©äŒã¯ãããŸããã
8ïŒãã¶ã€ã³ã®è³Œå ¥ãšã¹ã©ã€ã¹ã®è³Œå ¥ããã ããå°æ¥ã¯èªåã§åãå»ãã ã
9ïŒã·ã¹ãã ãåžžã«ç£èŠãã人ãããªãïŒã¢ãŒã·ã§ã³ãšvlcã®äž¡æ¹ã«ãã°ãèŠã€ãããŸããããã·ã¹ãã 管çã«ãã£ãŠè§£æ±ºãããŸãïŒ
10ïŒãã®å¹Žã®ãã»ãŒã«ã¹ãã³ãã¯ãåäžã®è²©å£²ããã³äŸ¡æ Œèšå®ã·ã¹ãã ãæãã€ããŸããã§ããã
11ïŒç§ã¯ãäž»èŠãªä»äºã§ãããããªç£èŠãšå人çãªç掻ã®åµé ãšäžŠè¡ããŠå€ãã®ããšãããŸããã
12ïŒèª°ãã亀æžãã責任ã«ã€ããŠãã«ããæã¡ãŸãã:)
ãããã3人ã®ã¯ã©ã€ã¢ã³ããããŠã圌ãã¯ãããæ°ã«å ¥ã£ãŠããŸããã 圌ãã¯ã·ã¹ãã ã«ãéãããããã«ã¡ã©ãèšçœ®ããããã ãã«ãéãåããŸããã
ãããã©ã®ããã«èŠããã:)

ãããã¯ãããŸãããã°ãVLCãšèœãšãç©Žã«ã€ããŠããã«è©³ãã説æããŸãã ãããŠããç¥è©±äžã®ãéçãšããã䜿ã£ãå®éšã«ã€ããŠãã