• Update в mongoose не обновляет поля?

    maximsohryakov
    @maximsohryakov Автор вопроса
    DemonIa, я рад, что это помогла вам :)
  • Как организовать беспрерывную запись ffmpeg?

    Михаил Захаров, не знаю, сколь полезным вам будет приведенные мою отрезки кода, но в моей реализации они работают.
    Что и для чего я использую у себя ffmpeg

    Имею у себя в локальной сети несколько ip и аналоговых камер, от которых я получаю rtsp.
    Банально и не интересно просматривать эти камеры из приложения, или кривого родного веб-приложения, которые они предоставляют. Я взялся и написал свой микро-сервер, который будет выводить по web-socket видео на страницу сайта. Появилось соединение -> запустил ffmpeg который принимает с камер куски информации, перекодирует это в другой формат и шлет прямиком в WebSocket
    модуль, который спавнит ffmpeg процесс
    let child_process = require('child_process'),
        winston       = require('../../config/winston')({filePath: 'log/ffmpeg.log', label: "develop"});
    
    
    /**
     * Сервис приема и декодирования RTS потока от видеорегистратора,
     * и отправка его по потоку на указанный адрес.
     * @param options
     *   ip_out       - адрес, на котором находится приемник декодированного потока
     *   url          - адрес расположения rtsp вешателя
     *   port_out     - принимающий порт
     *   serverNumber - порядковый номер сервера, на котором запускается данный сервис
     * @constructor
     */
    function CreateFFMpegStream(options) {
      this.url          = options.url;
      this.options      = options;
      this.ip_out       = options.ip_out  || '127.0.0.1';
      this.port_out     = options.port_out;
      this.secret       = options.secret;
      this.serverNumber = options.serverNumber;
      this.createStream();
    }
    
    CreateFFMpegStream.prototype.createStream = function() {
      winston.info(`FFMpeg ['${this.serverNumber}'] stream was started.`);
      this.out_url = `http://${this.ip_out}:${this.port_out}/${this.secret}`;
      this.ffmpeg_stream = child_process.spawn('ffmpeg', ["-rtsp_transport", "tcp", "-i", this.url, '-f', 'mpegts', '-codec:v', 'mpeg1video', '-r', '30', '-b:v', '800k', this.out_url], {cwd: __dirname}); //убрал декодировку видео  '-codec:a', 'mp2', '-ar', '44100',
      this.ffmpeg_stream.stderr.addListener('data', function(data) {
      });
    };
    
    CreateFFMpegStream.prototype.closeStream = function() {
      this.ffmpeg_stream.kill()
    };
    
    exports.FFMpegStream = CreateFFMpegStream;

    код сервера, который будет принимать декодированные куски от ffmpeg и писать их в файл
    // HTTP Server to accept incomming MPEG-TS Stream from ffmpeg
    let streamServer = http.createServer( function(request, response) {
      let params = request.url.substr(1).split('/');
      winston.info('HTTP Server ['+ SERVNUMBER +'] to accept incomming MPEG-TS Stream from ffmpeg started.');
    
      if (params[0] !== STREAM_SECRET) {
        winston.warn('Failed Stream Connection ['+ SERVNUMBER +']: '+ request.socket.remoteAddress + ':' + request.socket.remotePort + ' - wrong secret.');
        response.end();
      }
    
      response.connection.setTimeout(0);
      winston.info(
          'Stream Connected: ' +
          request.socket.remoteAddress + ':' +
          request.socket.remotePort
      );
      request.on('data', function(data){
        socketServer.broadcast(data);
        if (request.socket.recording) {
          request.socket.recording.write(data);
        }
      });
      request.on('end',function(){
        winston.info('Close stream.');
        if (request.socket.recording) {
          request.socket.recording.close();
        }
      });
    
      // Record the stream to a local file?
      if (RECORD_STREAM) {
        let path = 'recordings/' + "-" + SERVNUMBER+ "-"+ Date.now() + '.ts';
        request.socket.recording = fs.createWriteStream(path);
      }
    }).listen(STREAM_PORT);

    ну и собственно вывоз модуля, порождающего ffmpeg
    ffmpeg = new FFMpeg_relay({
          url: 'rtsp://<--тут лежит ваш url к камере с даннами логина-пароля-->&channel=' + CHANNEL + '&stream=0.sdp',
          ip_out: '127.0.0.1', // адрес, на который будет потправляться декодированные части видео
          port_out: STREAM_PORT,
          secret: STREAM_SECRET,
          serverNumber: SERVNUMBER
    });



    В дополнении ко всему: я намеренно сейчас заставил работать ffmpeg и декодировать видео. И обрубал серверу доступ к камерам. Физически. Процесс ffmepg не останавливал свою работу. После востановления доступа к камерам, для 2 из 3 камер автоматически продолжилось вещание. (Не могу сказать точно, какие это камеры, аналогивые или ip, но суть сохраняется).
    Если смотреть по запущенным процессам во время обрыва доступам к камерам, то процессы ffmpeg продолжа.т свою работу(один процесс для каждой камеры).

    Если вы дочитали до этого момента, могу предложить следующее решение:

    Посколюку основопологающим является данный кусок кода:
    request.on('data', function(data){
        socketServer.broadcast(data);
        if (request.socket.recording) {
          request.socket.recording.write(data);
        }

    То можно предположить, что если в течении 5-10 секунд не поступало ни одного чанка информации, то скорей всего камера сдохла. А значит надо попробовать убить модуль порождающий ffmpeg и запустить его снова (если после восстановления соединение, не было продолжено вещание автоматически)


    p.s. Если вы это все прочитали, и вас заинтересовало, могу дать доступ к закрытому репозиторию, где лежат исходники, привыденные выше.
    p.s.s. Особо тапками не кидайтесь, код не очень изящный, но что есть то есть.
    p.s.s. Надеюсь это то, что вы искали
  • Как организовать беспрерывную запись ffmpeg?

    Как на счёт того, чтобы запустить ffmpeg дочерним процессом и слушать его stderr? В случае падения ребутнуть процесс? В моем случае так и работало.
  • Почему teamviewer шалит?

    maximsohryakov
    @maximsohryakov Автор вопроса
    Решение было следующим.
    Поскольку tv ставился на сервер через родной rdp клиент для винды, то для tv присвоился один id.
    Стоило переустановить tv через консоль, как, TV присволсчя другой id, через который уже нормально все подключается.
    Так что предположение о том, что мы подключались по не верному id был правильный.
  • Почему teamviewer шалит?

    maximsohryakov
    @maximsohryakov Автор вопроса
    Решение о разрешении подключения для всех пользователей не помогло. Осталось тогда мониторить происходящее при подключении по rdp..
  • Почему teamviewer шалит?

    maximsohryakov
    @maximsohryakov Автор вопроса
    hint000, не помогло данное решение.
  • Почему teamviewer шалит?

    maximsohryakov
    @maximsohryakov Автор вопроса
    АртемЪ, попробую вечером посмотреть.
    И да, как тогда я могу узнать id основного процесса?
    Если это не тот, который высвечивается в поле id, в запущенном сеансе, тогда какой?
  • Почему teamviewer шалит?

    maximsohryakov
    @maximsohryakov Автор вопроса
    АртемЪ, сеанс по сути и не нужен. П.ч. тимвиер всегда работает как служба. А значит должен подключаться даже тогда,тогда сеанс ещё не начат. А система висит на стадии выбора учётки. На других серверах оно так и работает. Даже под линуксом оно так работает. Что при помощи тимвиер можно выбирать в какую войти, при условии что ни в одну ещё не был произведен вход.
  • Почему teamviewer шалит?

    maximsohryakov
    @maximsohryakov Автор вопроса
    Почти что полным перебором перебрали все настройки тимвиера на сервере, относящиеся к подключению. Не помогло ни одно.
    P.s. поправил вопрос. Операционная 2008 r2. Опечатался.
  • Как работает этот кусок кода на js?

    maximsohryakov
    @maximsohryakov Автор вопроса
    method chaining

    Видимо это и есть то, что я искал. Спасибо
  • Почему зависает Node.js?

    maximsohryakov
    @maximsohryakov Автор вопроса
    Да... Вы правы..
    Не помню, откуда я брал этот кусок, но он там явно был вне контекста.. ии, как следствие не учел, что next() тоже должен быть.
    Спасибо вам
  • Почему слишком медленная скорость передачи данных в локальной сети?

    maximsohryakov
    @maximsohryakov Автор вопроса
    ky0, я проделал тоже самое с windows 10, загрузил этот же файл в соседнюю папку (относительного прошлой попытки), и скорость закачки показывала 10МБ\сек. Получается, что проблема сидит в ограничениях cifs?
  • Mozilla Перестали работать расширения?

    maximsohryakov
    @maximsohryakov Автор вопроса
    sim3x, видимо не моя криворукость сломала все)
    Будем ждать патча :)
  • Как смонтировать папки в Linux as Non root?

    maximsohryakov
    @maximsohryakov Автор вопроса
    Максим Сохряков, не знаю что именно помогло, но после монтирования через fstab записью
    //192.168.1.66/tg /home/or1um/Mount cifs sec=ntlmv2,credentials=/root/.servercred,iocharset=utf8,file_mode=0777,dir_mode=0777 0

    хоть и показывает root:root но теперь я могу редактировать файл не из под root.
    Либо помогло то, что я подкорректировать xmb.conf На сервере, =>

    # File creation mask is set to 0700 for security reasons. If you want to
    # create files with group=rw permissions, set next parameter to 0775.
    ; create mask = 0775

    # Directory creation mask is set to 0700 for security reasons. If you want to
    # create dirs. with group=rw permissions, set next parameter to 0775.
    ; directory mask = 0775

    Заменил 0700 на 0775.
    Сдается мне, что сработал 1й спобос. Ибо я самба сервер не перегружал, после внесения поправки в конфиг.
    Вроде все.
    Спасибо за ответы
  • Как смонтировать папки в Linux as Non root?

    maximsohryakov
    @maximsohryakov Автор вопроса
    Максим Сохряков, сам себе отвечу на один свой вопрос. Для шары через samba надо было указывать логи-пароль. Поэтому там speedsparks и пароль только такие принимаются.
  • Как смонтировать папки в Linux as Non root?

    maximsohryakov
    @maximsohryakov Автор вопроса
    Я не могу добавить пользователя в группу fuse, п.ч. её нет.
    Группы в которых состоит моя учетка:
    ortum@ubuntu:~$ groups
    ortum root adm dialout fax cdrom floppy tape sudo audio dip video plugdev netdev lpadmin scanner sambashare or1um

    Если я монтирую не в /mnt/project . а в допустим ~/Mount то эффект аналогичный, все файлы находятся под root:root.

    Я попробовал смонтировать через cifs:
    //192.168.1.66/tg /home/or1um/Mount cifs sec=ntlmv2,credentials=/root/.servercred,iocharset=utf8,file_mode=0777,dir_mode=0777 0

    Но проку все равно нет. root:root остается.
    Тут возник вопрос, в user и password нужно указывать данные пользователя, в чьей домашней папке ( /home/michael/tg ) находится расшаренная папка, или данные, кому принадлежит каталог ( drwxrwxrwx 7 tomcat michael 4096 июн 10 21:40 tg
    ).
    Ибо если я указываю лог\пас от michael мне говорит что mount(13) Permission denied.
    Если я указываю лог\пасс пользователя speedsparks(самый первый пользователь, с момента установки системы) то каталог монтируется, но монтируется под root"root
  • Как смонтировать папки в Linux as Non root?

    maximsohryakov
    @maximsohryakov Автор вопроса
    В том то и дело, что в правах дело. 18 версия монтирует как root, 16 версия монтирует, видимо с теми правами, которые стоят на другой машине.
    в 18 версии права root root
    в 16 версии drwxrwxrwx+ 7 1003 1002 0 Jun 10 21:40 project
    Где 1003, если не ошибаюсь, и есть владелец папки на сервере. (3й по счету созданный пользователь, так же обладающий админскими правами)
    Я пробовал различные варианты монтирования, но система их игнорирует, и все равно ставит права на папку root root.