Получение картинки с камеры и отправка в телеграм

Вопросы и информация о скриптах для ioBroker
Antworten
goofyk
Beiträge: 8
Registriert: 24.08.2017, 14:54

Получение картинки с камеры и отправка в телеграм

Beitrag von goofyk » 06.01.2018, 10:57

Пример скриптов для получения картинки с камер.

Для камер, которые могут отдавать готовую картинку по url:
a39726da-b759-4c9b-b186-7325a2cc83ce.jpg
Spoiler: Show hidden text

Code: Alles auswählen

var request = require('request');
var fs      = require('fs');

// получение картинки с камеры
function getCamera(url, params, callback) {
    /*
      url - адрес с картинкой
      params - доп параметры, которые надо передать в callback
      callback - функция, вызываемая после получения картинки
    */
    var tmpfile = "/tmp/snap.jpg";
    // дергаем адрес с картинкой
    request.get({url: url, encoding: 'binary'}, function (err, response, body) {
        if (err) {
            console.error(err);
            callback('Ошибка: ' + err, params);
        }
        // запишем результат в файл
        fs.writeFile(tmpfile, body, 'binary', function(err) {
            if (err) {
                console.error(err);
                callback('Ошибка: ' + err, params);
            } else {
                callback(tmpfile, params);
            }
        });
    });
}

// вызов получения картинки с камеры и отправка в телеграм
getCamera('http://192.168.1.45/image.jpg', {name: 'Камера 1'}, function(filename, params){
    sendTo('telegram.0', {
        user: params['user'], 
        text: filename, 
        caption: params['name']
    });
});
Для камер, которые отдают rtsp-поток.
822f0f4f-b801-4fb0-99f7-88aaca8f9651.jpg
Но нужен установленный ffmpeg !!!
Spoiler: Show hidden text

Code: Alles auswählen

var spawn   = require('child_process').spawn;

// получение картинки с камеры с rtsp-потоком
function getCameraSnap(url, params, callback) {
    /*
      url - адрес rtsp-потока камеры
      params - доп параметры, которые надо передать в callback
      callback - функция, вызываемая после получения картинки
    */
    var tmpfile = "/tmp/snap.jpg";
    // выполняем команду ffmpeg чтобы сделать картинку с потока
    let ffmpegCommand = '-y -i ' + url + ' -vframes 1 -s 1280:720 -f image2 ' + tmpfile;
    let ffmpeg = spawn('ffmpeg', (ffmpegCommand).split(' '), {});
    ffmpeg.stderr.on('data', function(data){
        console.error(data.toString());
    });
    ffmpeg.on('close', function(code) {
        callback(tmpfile, params);
    });
}

getCameraSnap('rtsp://admin:admin@10.0.0.229/unicast', {name: 'Камера 2'}, function(filename, params){
    sendTo('telegram.0', {
        user: params['user'], 
        text: filename, 
        caption: params['name']
    });
});

Еще можно печатать на картинку текст, например температуру или какие-то другие сообщения.
a5fb6e43-3972-42d7-83a5-949c2be75220.jpg
Нужен установленный graphicsmagick !!!

Code: Alles auswählen

sudo apt-get install graphicsmagick
и еще в настройках драйвера JS надо указать модуль gm
js.PNG
Spoiler: Show hidden text

Code: Alles auswählen

//var gm = require('gm').subClass({imageMagick: true});
var gm = require('gm');

function writeText(filename, params, callback) {
    /*
      filename - файл с картинкой
      params - доп параметры, которые надо передать в callback
      callback - функция, вызываемая после
    */
    var tmpfile = "/tmp/snapwithtext.jpg";
    gm(filename)
        .stroke("#000000", 1)
        .fill("#ffffff")
        .font("Helvetica.ttf", 32)
        //.font("/home/pi/11102.ttf", 58)
        .drawText(30, 60, "Надоело получать скучные текстовые сообщения!")
        //.stroke("#FF0000", 2)
        //.fill("#ffff00")
        //.font("/home/pi/11068.ttf", 32)
        //.drawText(30, 100, "Температура на улице: "+getState('zont.0.T102_31739.therm_59facf9105b60500659fe39d').val)
        .write(tmpfile, function (err) {
            if (err) {
                console.error(err);
            } else {
                callback(tmpfile, params);
            }
        });
}


getCameraSnap('rtsp://admin:admin@10.0.0.229/unicast', {name: 'Камера 3'}, function(filename, params){
    writeText(filename, params, function (filename, params) {
        sendTo('telegram.0', {
            user: params['user'], 
            text: filename, 
            caption: params['name']
        });
    });
});

goofyk
Beiträge: 8
Registriert: 24.08.2017, 14:54

Re: Получение картинки с камеры и отправка в телеграм

Beitrag von goofyk » 08.01.2018, 19:35

Продолжу примеры с камерами и телеграмом.

Для примеров нужен установленный ffmpeg и graphicsmagick из предыдущего сообщения!!!

1) отправка 5 секунд с камеры с rtsp-потоком в телеграм в виде GIF-анимации (сразу загружается и показывается)
2) отправка такого же видео, но с наложением текста на картинку
Spoiler: Show hidden text

Code: Alles auswählen

var spawn   = require('child_process').spawn;
var gm = require('gm');

function getCameraVideo(url, extcmd, tmpfile, callback) {
    /*
      url - адрес rtsp-потока камеры
      extcmd - дополнительный код в команде ffmpeg
      filename - имя файла для формирования
      callback - функция, вызываемая после получения видео
    */
    var time = 5, // длина записи
        fps = 10, // частота кадров потока
        codec = 'libx264', // h264_omx для Raspberry Pi
        size = '1280:720'; // результирующий размер видео
    // выполняем команду ffmpeg чтобы сделать запись с потока
    var ffmpegCommand = '-y -i ' + url + extcmd + ' -t ' + time +
      ' -f mp4 -vcodec ' + codec +
      ' -pix_fmt yuv420p -s ' + size + ' -b:v 1500k -vsync vfr -an -r ' + fps + ' ' + tmpfile;
    var ffmpeg = spawn('ffmpeg', (ffmpegCommand).split(' '), {});
    ffmpeg.stderr.on('data', function(data){
        console.error(data.toString());
    });
    ffmpeg.on('close', function(code) {
        callback(tmpfile);
    });
}

function writeText4Video(callback) {
    /*
      callback - функция, вызываемая после формирования картинки
    */
    var tmpfile = "/tmp/blankwithtext.png";
    gm(1280, 720, "#000000")  // размера картики и черный цвет фона
        .transparent('#000000') // прозрачность
        .stroke("#000000", 1)
        .fill("#ffffff")
        .font("Helvetica.ttf", 32)
        //.font("/home/pi/11102.ttf", 58)
        .drawText(30, 60, "Надоело получать скучные текстовые сообщения!")
        .stroke("#000000", 1)
        .fill("#ffff00")
        //.font("/home/pi/11068.ttf", 32)
        .drawText(30, 100, "Температура на улице: "+getState('zont.0.T102_31739.therm_59facf9105b60500659fe39d').val)
        .write(tmpfile, function (err) {
            if (err) {
                console.error(err);
            } else {
                callback(tmpfile);
            }
        });
}

// получение 5 сек видео с камеры
getCameraVideo('rtsp://10.0.0.229/unicast', '', '/tmp/video1.mp4', function(filename){
    sendTo('telegram.0', {
        text: filename,
        caption: 'Камера 1'
    });
});

// получение 5 сек видео с камеры и с информацией
writeText4Video(function(imgfile){
    // дополнительно укажем, что видео объединяем с полученной картинкой
    var cmd = ' -i ' + imgfile + ' -filter_complex [1]lut=a=val*0.7[a];[0][a]overlay=0:0';
    // получение 5 сек видео с камеры
    getCameraVideo('rtsp://10.0.0.229/unicast', cmd, '/tmp/video2.mp4', function(filename){
        sendTo('telegram.0', {
            text: filename, 
            caption: 'Камера 2'
        });
    });
});

dudunyk
Beiträge: 3
Registriert: 25.07.2017, 09:38

Re: Получение картинки с камеры и отправка в телеграм

Beitrag von dudunyk » 10.01.2018, 10:28

В лог сыпятся ошибки которые совсем вроде и не ошибки. Как убрать?
Spoiler: Show hidden text
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] kb/s:1444.89
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] ref B L1: 92.4% 7.6%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] ref B L0: 96.1% 3.9%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] ref P L0: 86.2% 4.9% 5.0% 3.9%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] Weighted P-Frames: Y:0.0% UV:0.0%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] i8c dc,h,v,p: 39% 23% 23% 14%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 19% 11% 7% 8% 7% 8% 8% 8%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 32% 24% 19% 2% 3% 4% 5% 6% 5%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] i16 v,h,dc,p: 15% 14% 27% 44%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] coded y,uvDC,uvAC intra: 89.6% 53.0% 39.1% inter: 16.9% 8.9% 0.7%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] 8x8 transform intra:23.5% inter:12.7%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] final ratefactor: 20.87
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 33.0% 2.1% 0.3% direct: 0.3% skip:64.2% L0:53.8% L1:45.7% BI: 0.5%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] mb P I16..4: 0.2% 0.6% 0.4% P16..4: 35.6% 3.1% 2.3% 0.0% 0.0% skip:57.8%
javascript.0 2018-01-10 11:07:14.674 error [libx264 @ 0xb701db40] mb I I16..4: 5.9% 12.1% 82.0%
javascript.0 2018-01-10 11:07:14.674 error script.js.Мои.Видео_через_Телеграм: [libx264 @ 0xb701db40] consecutive B-frames: 68.9% 13.3% 0.0% 17.8%
javascript.0 2018-01-10 11:07:14.672 error [libx264 @ 0xb701db40] frame B:9 Avg QP:26.88 size: 1935
javascript.0 2018-01-10 11:07:14.672 error [libx264 @ 0xb701db40] frame P:35 Avg QP:22.35 size: 16917
javascript.0 2018-01-10 11:07:14.672 error script.js.Мои.Видео_через_Телеграм: [libx264 @ 0xb701db40] frame I:1 Avg QP:12.18 size:257434
javascript.0 2018-01-10 11:07:14.544 error video:847kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.150408%
javascript.0 2018-01-10 11:07:14.544 error script.js.Мои.Видео_через_Телеграм: frame= 45 fps=3.0 q=-1.0 Lsize= 849kB time=00:00:04.50 bitrate=1544.8kbits/s dup=0 drop=39 speed=0.303x
javascript.0 2018-01-10 11:07:04.029 error script.js.Мои.Видео_через_Телеграм: frame= 44 fps= 11 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A dup=0 drop=38 speed= 0x
javascript.0 2018-01-10 11:07:03.910 error script.js.Мои.Видео_через_Телеграм: [h264 @ 0xb6ff20d0] concealing 3403 DC, 3403 AC, 3403 MV errors in I frame
javascript.0 2018-01-10 11:07:03.873 error script.js.Мои.Видео_через_Телеграм: [h264 @ 0xb6ff20d0] error while decoding MB 6 3, bytestream -19
javascript.0 2018-01-10 11:07:03.137 error frame= 42 fps= 12 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A dup=0 drop=36 speed= 0x
javascript.0 2018-01-10 11:07:03.137 error [rtsp @ 0xb6f92300] RTP: missed 47 packets
javascript.0 2018-01-10 11:07:03.137 error script.js.Мои.Видео_через_Телеграм: [rtsp @ 0xb6f92300] max delay reached. need to consume packet
javascript.0 2018-01-10 11:07:03.072 error [rtsp @ 0xb6f92300] RTP: missed 1 packets
javascript.0 2018-01-10 11:07:03.072 error script.js.Мои.Видео_через_Телеграм: [rtsp @ 0xb6f92300] max delay reached. need to consume packet
javascript.0 2018-01-10 11:07:02.978 error script.js.Мои.Видео_через_Телеграм: frame= 39 fps= 14 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A dup=0 drop=33 speed= 0x
javascript.0 2018-01-10 11:07:02.895 error script.js.Мои.Видео_через_Телеграм: frame= 36 fps= 17 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A dup=0 drop=30 speed= 0x
javascript.0 2018-01-10 11:07:01.336 error script.js.Мои.Видео_через_Телеграм: frame= 31 fps= 19 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A dup=0 drop=25 speed= 0x
javascript.0 2018-01-10 11:07:00.768 error script.js.Мои.Видео_через_Телеграм: frame= 25 fps= 24 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A dup=0 drop=19 speed= 0x
javascript.0 2018-01-10 11:07:00.590 error [h264 @ 0xb7001cc0] Increasing reorder buffer to 1
javascript.0 2018-01-10 11:07:00.590 error [rtsp @ 0xb6f92300] RTP: missed 17 packets
javascript.0 2018-01-10 11:07:00.590 error script.js.Мои.Видео_через_Телеграм: [rtsp @ 0xb6f92300] max delay reached. need to consume packet
javascript.0 2018-01-10 11:07:00.201 error script.js.Мои.Видео_через_Телеграм: frame= 17 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A dup=0 drop=14 speed= 0x
javascript.0 2018-01-10 11:06:59.702 error Press [q] to stop, [?] for help
javascript.0 2018-01-10 11:06:59.702 error Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
javascript.0 2018-01-10 11:06:59.702 error Stream mapping:
javascript.0 2018-01-10 11:06:59.702 error cpb: bitrate max/min/avg: 0/0/1500000 buffer size: 0 vbv_delay: -1
javascript.0 2018-01-10 11:06:59.702 error Side data:
javascript.0 2018-01-10 11:06:59.702 error encoder : Lavc57.64.101 libx264
javascript.0 2018-01-10 11:06:59.702 error Metadata:
javascript.0 2018-01-10 11:06:59.702 error Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--1, 1500 kb/s, 10 fps, 10240 tbn, 10 tbc
javascript.0 2018-01-10 11:06:59.702 error encoder : Lavf57.56.101
javascript.0 2018-01-10 11:06:59.702 error script.js.Мои.Видео_через_Телеграм:
javascript.0 2018-01-10 11:06:59.700 error comment : ch0.h264
javascript.0 2018-01-10 11:06:59.700 error title : H.264 Program Stream, streamed by the LIVE555 Media Server
javascript.0 2018-01-10 11:06:59.700 error Metadata:
javascript.0 2018-01-10 11:06:59.700 error script.js.Мои.Видео_через_Телеграм: Output #0, mp4, to '/tmp/video1.mp4':
javascript.0 2018-01-10 11:06:59.666 error script.js.Мои.Видео_через_Телеграм: [libx264 @ 0xb701db40] 264 - core 142 r2431 a5831aa - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 debl
javascript.0 2018-01-10 11:06:59.664 error script.js.Мои.Видео_через_Телеграм: [libx264 @ 0xb701db40] profile High, level 3.1
javascript.0 2018-01-10 11:06:59.625 error script.js.Мои.Видео_через_Телеграм: [libx264 @ 0xb701db40] using cpu capabilities: ARMv6 NEON
javascript.0 2018-01-10 11:06:59.264 error Stream #0:1: Audio: aac (LC), 8000 Hz, stereo, fltp
javascript.0 2018-01-10 11:06:59.264 error script.js.Мои.Видео_через_Телеграм: Stream #0:0: Video: h264 (High), yuv420p(progressive), 1280x720, 20.08 tbr, 90k tbn, 180k tbc
javascript.0 2018-01-10 11:06:59.251 error Duration: N/A, start: 0.000000, bitrate: N/A
javascript.0 2018-01-10 11:06:59.251 error comment : ch0.h264
javascript.0 2018-01-10 11:06:59.251 error script.js.Мои.Видео_через_Телеграм: H.264 Program Stream, streamed by the LIVE555 Media Server
javascript.0 2018-01-10 11:06:59.249 error title :
javascript.0 2018-01-10 11:06:59.249 error Metadata:
javascript.0 2018-01-10 11:06:59.249 error script.js.Мои.Видео_через_Телеграм: Input #0, rtsp, from 'rtsp://@192.168.3.17:554/ch0.h264':
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] kb/s:1383.03
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] ref B L1: 88.4% 11.6%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] ref B L0: 94.0% 4.3% 1.8%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] ref P L0: 86.7% 4.4% 4.6% 4.2%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] Weighted P-Frames: Y:0.0% UV:0.0%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] i8c dc,h,v,p: 36% 25% 24% 15%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 19% 11% 7% 8% 7% 7% 8% 9%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 32% 23% 19% 3% 3% 4% 5% 6% 5%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] i16 v,h,dc,p: 19% 12% 22% 46%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] coded y,uvDC,uvAC intra: 89.7% 52.8% 39.9% inter: 15.3% 7.8% 0.7%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] 8x8 transform intra:23.7% inter:10.5%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] final ratefactor: 20.80
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 30.5% 1.5% 0.2% direct: 0.2% skip:67.6% L0:49.9% L1:49.6% BI: 0.5%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] mb P I16..4: 0.2% 0.6% 0.4% P16..4: 34.8% 2.7% 2.0% 0.0% 0.0% skip:59.5%
javascript.0 2018-01-10 11:06:57.407 error [libx264 @ 0xb8b3f590] mb I I16..4: 6.2% 12.2% 81.6%
javascript.0 2018-01-10 11:06:57.407 error script.js.Мои.Видео_через_Телеграм_c_текстом: [libx264 @ 0xb8b3f590] consecutive B-frames: 66.0% 12.0% 6.0% 16.0%
javascript.0 2018-01-10 11:06:57.406 error [libx264 @ 0xb8b3f590] frame B:11 Avg QP:27.12 size: 1813
javascript.0 2018-01-10 11:06:57.406 error [libx264 @ 0xb8b3f590] frame P:38 Avg QP:22.42 size: 15477
javascript.0 2018-01-10 11:06:57.406 error script.js.Мои.Видео_через_Телеграм_c_текстом: [libx264 @ 0xb8b3f590] frame I:1 Avg QP:12.25 size:256340
javascript.0 2018-01-10 11:06:57.321 error video:845kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.152237%
javascript.0 2018-01-10 11:06:57.321 error script.js.Мои.Видео_через_Телеграм_c_текстом: frame= 50 fps=2.9 q=-1.0 Lsize= 846kB time=00:00:04.70 bitrate=1474.7kbits/s dup=0 drop=45 speed=0.269x
javascript.0 2018-01-10 11:06:56.691 error libpostproc 54. 1.100 / 54. 1.100
javascript.0 2018-01-10 11:06:56.691 error libswresample 2. 3.100 / 2. 3.100
javascript.0 2018-01-10 11:06:56.691 error libswscale 4. 2.100 / 4. 2.100
javascript.0 2018-01-10 11:06:56.691 error script.js.Мои.Видео_через_Телеграм: libavresample 3. 1. 0 / 3. 1. 0
javascript.0 2018-01-10 11:06:56.688 error libavfilter 6. 65.100 / 6. 65.100
javascript.0 2018-01-10 11:06:56.688 error libavdevice 57. 1.100 / 57. 1.100
javascript.0 2018-01-10 11:06:56.688 error libavformat 57. 56.101 / 57. 56.101
javascript.0 2018-01-10 11:06:56.688 error libavcodec 57. 64.101 / 57. 64.101
javascript.0 2018-01-10 11:06:56.688 error script.js.Мои.Видео_через_Телеграм: libavutil 55. 34.101 / 55. 34.101
javascript.0 2018-01-10 11:06:56.658 error script.js.Мои.Видео_через_Телеграм: configuration: --prefix=/usr --extra-version='1~bpo8+1' --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --en
javascript.0 2018-01-10 11:06:56.656 error built with gcc 4.9.2 (Debian 4.9.2-10)
javascript.0 2018-01-10 11:06:56.656 error script.js.Мои.Видео_через_Телеграм: ffmpeg version 3.2.5-1~bpo8+1 Copyright (c) 2000-2017 the FFmpeg developers

goofyk
Beiträge: 8
Registriert: 24.08.2017, 14:54

Re: Получение картинки с камеры и отправка в телеграм

Beitrag von goofyk » 11.01.2018, 06:54

dudunyk hat geschrieben:В лог сыпятся ошибки которые совсем вроде и не ошибки. Как убрать?
Найти в коде кусок:

Code: Alles auswählen

    ffmpeg.stderr.on('data', function(data){
        console.error(data.toString());
    });
и удалить его, либо закоментировать вывод ошибок:

Code: Alles auswählen

    ffmpeg.stderr.on('data', function(data){
        //console.error(data.toString());
    });

Antworten