Smoke

 
<<< Back

Camshoter на свой лад

Продолжаем серию скриптов "на свой лад", вдруг пригодится!

Очень быстро - зачем

Те, кто пилит свои страницы "сцены" - хотят все сделать по красоте, вот и я хотел. В блоге Как подружить Camshoter и обычную вебку я уже рассказывал как сделать из вебки - камеру наблюдения, у меня оставалось только реализация для показа архива.

Для чего например?


Код

Создаем сценарий например или функцию. Передать можно: date в формате DD.MM.YYYY, camid - ID камеры из модуля, showCol - сколько результатов будет отдано

$date = explode(".", strip_tags($_GET['date']));
($date) ? $date = date('Y-m-d', time()) : $date = $date[2].'-'.$date[1].'-'.$date[0];
($camID) ? $camID = '1' : $camID = strip_tags($_GET['camid']);
($showCol == 0) ? $showCol = 10 : $showCol = (int) $_GET['showCol'];

$path = '/var/www/html/cms/cached/nvr/cam'.$camID.'/'.$date.'/';
$path_to_files = '/cms/cached/nvr/cam'.$camID.'/'.$date.'/';
$scanFiles = scandir($path, 1);

$arrayData = [];
$iteration = 0;
$countArray = count($scanFiles);

foreach($scanFiles as $key => $value) {
    //Отсеим папки и файлы меньше 10кб
    if(is_dir($path.$value) || filesize($path.$value) <= 10000) continue;
    //Найдем mp4 видео и выкинем формат, чтобы JS было проще
    if(explode('.', $value)[1] == 'mp4') array_push($arrayData, $path_to_files.explode('.', $value)[0]);
    //+ итерация цикла
    $iteration++;
    //- счет, чтобы убрать папки "наверх"
    $countArray--;
    if($countArray <= 2) break;
    if($iteration >= $showCol) break;
        //Чистим кеш
        clearstatcache();
}

echo json_encode($arrayData);

В ответе будет JSON объект вида:

["\/cms\/cached\/nvr\/cam1\/2020-01-28\/cam1_2020-01-28_230008","\/cms\/cached\/nvr\/cam1\/2020-01-28\/cam1_2020-01-28_225940","\/cms\/cached\/nvr\/cam1\/2020-01-28\/cam1_2020-01-28_224856","\/cms\/cached\/nvr\/cam1\/2020-01-28\/cam1_2020-01-28_224320","\/cms\/cached\/nvr\/cam1\/2020-01-28\/cam1_2020-01-28_224114","\/cms\/cached\/nvr\/cam1\/2020-01-28\/cam1_2020-01-28_223843","\/cms\/cached\/nvr\/cam1\/2020-01-28\/cam1_2020-01-28_223549"]

добавляем к любому значению .jpg или .mp4 и получаем данные.

Бонус!

Как кодировать видео, чтобы смотреть в html5 плеере, вот так:

 ffmpeg -y -i rtsp://192.168.1.100:5554/live -t #sec -f mp4 -c:v libx264 -r 30 #savename

Вставлять в модуле в FFMEGCMD:(*)

Бонус 2, как обработать JS?

Примерно вот так:

//Функция запроса картинок и видео с камер
        function getCameraData() {
            date = $("#dateCameraPick").val();
            camID = $("#ShowCameraID").val();
            showCol = $("#showColCameraVideo").val();
            iteration = 0;
            $('#camera_history_show').html('<div class="col-xl-12 col-lg-12 col-md-12 col-sm-12 col-12 text-center"><img src="assets/img/load_history.gif"><br>Загружаем данные...</div>')

            $.getJSON({
                url: '/objects/?script=camScanFiles&date=' + date + '&camid=' + camID + '&showCol=' + showCol,
                success: function(responce) {
                    if(responce.length != 0) { 

                        $('#camera_history_show').html('');
                        for (var value in responce) {
                            nameSplit = responce[value].split('/');
                            (iteration >= 1) ? html = $('#camera_history_show').html() : html = '';
                            $('#camera_history_show').html(html + '<div class="col-xl-2 col-lg-3 col-md-4 col-sm-6 col-6 text-center mb-3" onclick="$(\'#cameraVideoPlayer\').attr(\'src\', \'' + responce[value] + '.mp4\');$(\'#cameraVideoPlayer_Name\').html(\'' + nameSplit[6] + ' (<a href=' + responce[value] + '.mp4 download>Скачать</a>)\');$(\'#modal-playerCameraVideo\').modal(\'show\');"><img style="width: 100%;border-radius: 5px;" src="' + responce[value] + '.jpg"><span style="font-size: 0.8rem;">' + nameSplit[6] + '</span></div>');
                            iteration++;
                        }
                    } else {
                        $('#camera_history_show').html('<div class="col-xl-12 col-lg-12 col-md-12 col-sm-12 col-12 text-center"><div style="margin-top: 50px;"><i class="la la-folder-open" style="font-size: 4rem;"></i><br>Нет записей за этот день!</div></div>')
                    }
                },
                error: function(responce) {
                    showNoty('error', 'Не удалось получить данные с сервера умного дома... getCameraData()->error');
                }
            });
        }

Бонус 3, как вообще не юзать камшутер

Скрипт не доделан, но работает. Может пригодится:

function camShotter($camID = 1, $sec = 10) {
    if($camID == 1) $ipcam = 'rtsp://192.168.1.100:5554/live';

    //Путь до папки для камеры
    $path = '/var/www/html/tablet/cams/cam_'.$camID.'/';
    //Флаг на совпадение имен папок
    $todayFolder= 0;
    //Текущая дата для записей
    $curFolderName = date('dmY', time());

    //Проверим есть ли папка с сегоднешней датой
    if(!is_dir($path.$curFolderName)) {
        mkdir($path.$curFolderName, 0755, true);
    } else {
        clearstatcache();
        //Пройдемся еще раз уже по новой директории
        $scan = scandir($path.$curFolderName, 1);
        if(count($scan) == 2) {
            mkdir($path.$curFolderName.'/100000', 0755, true);
        } else {
            $addDir = $scan[0]+1;
            mkdir($path.$curFolderName.'/'.$addDir, 0755, true);
            //Делаем фото
            safe_exec('sudo timeout -s INT 60s ffmpeg -ss 00:00:02 -i '.$ipcam.' -f image2 -vframes 1 -y '.$path.$curFolderName.'/'.$addDir.'/photo.jpg');
            //Пишем видео
            safe_exec('sudo timeout -s INT 120s ffmpeg -y -i '.$ipcam.' -t 00:00:'.$sec.' -f mp4 -r 30 -c:v libx264 '.$path.$curFolderName.'/'.$addDir.'/video.mp4');
        }
    }
    return 'ok!';
}

Discuss (1) (6)

See also:
2023-03-13 Debounce настройка в z2m
2023-03-06 Боремся с mysql и жором места на диске
2021-10-24 Определяем выключен ли свет по камере о_О
2021-10-18 Опять прокси WS! Теперь для KeenDNS+NGINX
2021-09-19 Хитрый MJPEG или укрощение строптивого
2021-06-08 Парсим информер с Яндекс.Погоды
2021-01-13 Не разговаривает Алиса через облако?
2020-12-15 Разгоняем Xiaomi Home
2020-11-04 Проксирование WebSocket с wss:// -> ws://
2020-11-02 Как получить время езды до работы?
2020-06-02 Стилизация штатного редактора кода, часть 2
2020-06-01 Распознавание речи - бесплатно, просто, быстро.
2020-06-01 Стилизация штатного редактора кода
2020-01-29 Парсим данные баланса из ЛК Билайн (Update)
2020-01-21 Google Location + Yandex Maps, на свой лад
2020-01-19 Получение Я.Погоды из сценария
2020-01-17 Рассказ хейтера сцен в MJDM. Часть 2
2020-01-17 Как можно НЕ использовать сцены в MJDM. Часть 2
2020-01-16 Перезагружаем роутер Zyxel из MJDM
2019-12-12 Как подружить Camshoter и обычную вебку
2019-10-07 Управление планшетом из сцен/WEB
2019-10-07 Использование злосчастных WebSoccet
2020-01-17 ~DELETED~
2019-07-23 Как можно НЕ использовать сцены в MJDM. Часть 1.

Нижний Новгород, Россия

На форуме: SmoKE_xDDD